写点什么

Angular Universal 的三种开发模式

  • 2016-05-12
  • 本文字数:1577 字

    阅读完需:约 5 分钟

虽然 Angular 是一种构建 Web 应用的强大方式,但是长期以来,开发人员都知道它在 SEO 和可访问性方面的限制。当然,Google 的爬虫能够执行 JavaScript,但是它并不是唯一的爬虫方案。例如,在将一个链接提交给 Slack 之后,它的爬虫会抓取一个预览,但是并不会执行 JavaScript,所以原始的 Angular HTML 模板将会显示在预览之中。为了消除这种现象所产生的问题,Jeff Whelpley 和 Patrick Stapleton 开发了 Angular Universal,它允许在服务端进行渲染。

Universal JavaScript(有时会被误称为“isomorphic”)并不是 Angular 特有的技术。Angular Universal 的工作原理是在服务端进行应用的初始化渲染,并将其发送给浏览器,用户就能马上看到了,然后才发送客户端的 JavaScript。这与 Angular 应用的典型顺序是有所区别的,在典型的顺序中会首先发送客户端 JavaScript,_ 然后 _ 初始化 UI 才会在客户端渲染。

Welpley 和 Stapleton 开发 Angular Unversal 已经超过一年了,在这个过程中发现了六个经常遇到的模式。在 2016 ng-conf 的分享中,它们主要关注了其中的三项:

  1. 事件脱节(Gap Event)
  2. 异步(Async)
  3. 依赖(Dependencies)

事件脱节是在服务端渲染所造成的副作用,在这种方式下,渲染会在 JavaScript 客户端脚本发送到浏览器之前执行。根据 JavaScript 发送和执行的速度不同,用户在与 UI 进行交互的时候,可能代码还没有为这些交互做好准备。这种脱节可能会导致用户交互的丢失。

针对该问题的解决方案就是记录用户的事件,并在客户端 JS 加载完成之后进行重放。如下的样例展现这种代码会是什么样子的:

复制代码
var myEvents = [];
var myInputValue;
// 记录客户端视图 myInput 的所有 keyup 事件
function recordEvents() {
var $myInput = document.querySelector('.myInput')
$myInput.addEventListener('keyup', function (event) {
myEvents.push(event);
myInputValue = event.target.value;
});
}
// 在服务器视图 myInput 上回放所有的 keyup 事件
function replayEvents() {
var $myInput = document.querySelector('.myInput');
myEvents.forEach(function (event) {
$myInput.dispatchEvent(event);
});
$myInput.value = myInputValue;
$myInput.focus();
}
// 在 window 加载完成之后,马上就开始记录
window.addEventListener('load', recordEvents);

Angular Universal 使用一种名为 preboot 过程来处理这项任务,而不是要求开发人员手动地做这些事情,可以通过如下的标记启用该功能:

preboot: trueJavaScript 在本质上是异步的,在服务端渲染 Angular 的时候,这就会产生问题。通常的解决方案是使用链(chaining)或回调,但要求开发人员重写他们的代码来解决这个问题显然不是好的可选方案。“我们不能这样做,而是必须要找到一种方式来处理这些不同的异步事件,并调整它们何时将响应发送回来”,Whelpley 这样说到。

Angular Universal 使用另外一个标记来解决这个问题,只需一行就可以了:

async: true将这个标记打开之后,将会使用 Angular 新的 Zones 特性,“跟踪所有的异步调用,并且能够知道它们何时完成。”

在服务端渲染 Angular 代码的第三个主要的问题在于使用平台特定的依赖。例如,localStorage是浏览器的特性,在服务器端根本不存在。Whelpley 和 Stapleton 指出,可以使用依赖注入(Dependency Injection,DI)作为解决方案。他们建议根据代码所执行的上下文,借助 DI 来替换实现,而不是使用平台具体的特性。

对于测试过他们功能的开发人员来说,这应该不足为奇。Whelpley 指出,Angular 所运行的测试和其他平台已经证明了这项技术在 Angular 2 的代码中将会非常普遍。“平台相关的依赖基本上已经被我们消除掉了。这个模式是我今天所讨论的最强大的模式”,Whelpley 说道。

他们 ng-conf 分享的完整视频已经可以观看了。

查看英文原文 3 Development Patterns of Angular Universal

2016-05-12 19:003440

评论

发布
暂无评论
发现更多内容

堡垒机哪家好?贵不贵?作用是什么?

行云管家

堡垒机 等级保护 过等保 等保2.0

网易数帆大数据场景下的DataOps实践

网易数帆

大数据 数据治理 DataOps

我提交了一个 pr,竟然是为了吃

AlwaysBeta

GitHub 开源 程序员 生活 程序员人生

StarRocks Contributor 人数破百!极速统一,你我协力!

StarRocks

数据库 数据分析 StarRocks

重学架构之外包学生管理系统架构设计文档

陈华英

架构实战营

模块三作业

Leo

如何更好的使用TypeScript

Tone荣

前端 js ts js 转 ts

Go学习笔记——复合数据类型

为自己带盐

Go 学习笔记 2月月更

云计算架构设计6大原则,你遵循了吗?

博文视点Broadview

微服务从代码到k8s部署应有尽有系列(三、鉴权)

万俊峰Kevin

微服务 web开发 鉴权 go-zero Go 语言

全面解析湖仓一体与大数据演进历程|内含技术工具选型策略

云智慧AIOps社区

数据库 大数据 数据湖 Clickhouse 大数据运维

java培训:Netty的内存管理

@零度

Java Netty

「架构实战营」模块三作业 外包学生管理系统架构设计

hxb

「架构实战营」

原生JavaScript灵魂拷问,你能答上多少(一)

战场小包

JavaScript 前端 2月月更

等保2.0政策之物联网安全扩展要求包括哪四个?

行云管家

云计算 物联网 等保 等保2.0 扩展要求

Flink 新一代流计算和容错——阶段总结和展望

Apache Flink

大数据 flink 开源 编程 实时计算

ESLint-源码分析

Tone荣

前端 eslint

外包学生管理系统架构

浪飞

基于Qt设计的学生考勤系统

DS小龙哥

2月月更

中国 PostgreSQL 分会加入龙蜥社区,携手共建基础软件开源新生态

OpenAnolis小助手

postgresql Linux 开源

震坤行工业超市研发效能提升之路

阿里云云效

云计算 阿里云 DevOps 云原生 研发

web前端开发Nodejs的C++ 拓展开发_前端培训

@零度

node.js 前端开发

互联网应用开发如何搭上AI的快车?来厦门开发者Meetup一探究竟

百度大脑

MongoDB在信息资源共享建设的应用实践

MongoDB中文社区

mongodb

学生管理系统 - 详细设计方案

tom

手把手教学电瓶车进电梯检测、多类别车辆追踪、异常行为检测产业级应用

百度大脑

向工程腐化开炮 | manifest治理

阿里巴巴终端技术

App 客户端开发 腐化治理 manifest

MongoDB 数据实时同步利器-Tapdata Cloud 免费上手指南

MongoDB中文社区

mongodb

G1 面向服务端(多CPU)应用的垃圾回收器

蜜糖的代码注释

Java 垃圾回收器 2月月更

掉入成功的深渊

Shinta

低代码实现探索(三十三)前端脚本公式

零道云-混合式低代码平台

Angular Universal的三种开发模式_JavaScript_David Iffland_InfoQ精选文章