写点什么

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:002983

评论

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

第八周作业

cqyanbo

大数据培训:Flink的提交模式

@零度

大数据 flink

java培训:Java类加载机制的理解

@零度

JAVA开发 类加载机制

2022年中国智慧医疗行业洞察

易观分析

智慧医疗

模块八作业

李晓笛

「架构实战营」

架构实战营4期-模块八作业

木几丶

「架构实战营」

消息队列基于Mysql存储表设计

tony

「架构实战营」

编写 Kubernetes 部署脚本将 httpserver 部署到 Kubernetes 集群

tom

分享两个常见的搜索算法:BFS和DFS

华为云开发者联盟

算法 DFS 深度优先搜索 BFS 搜索算法

云原生训练营-Week02

jjn0703

云原生训练营

架构实战模块八作业

Anlumina

「架构实战营」

模块八作业-设计消息队列存储消息的MySQL表

CH

架构实战营 #架构实战营 「架构实战营」

【架构实战营】模块八:命题作业

wgl

「架构实战营」

不能Hook的人生不值得 jsHook和模拟执行

奋飞安全

安全 js hook jshook

史上最强代码自测方法,没有之一!

万俊峰Kevin

微服务 单元测试 go-zero 测试工具 Go 语言

理论+实践,带你掌握动态规划法

华为云开发者联盟

AI 算法 动态规划法 子问题

模块八作业

黄秀明

「架构实战营」

Go 语言入门很简单:从 goroutine 出发到并发

宇宙之一粟

Go 语言 goroutine 2月月更

基于STM32+ESP8266+华为云IoT设计的智能门锁

DS小龙哥

2月月更

喜报!龙蜥操作系统&龙蜥社区双双荣登2021“科创中国”开源创新榜!

OpenAnolis小助手

开源 操作系统 创新

郑州轻工业大学——HarmonyOS宠物健康系统的开发分享

HarmonyOS开发者

HarmonyOS 健康检查

鉴机识变,面向未来|RocketMQ Summit 2022 即将来袭

阿里巴巴云原生

阿里云 开源 RocketMQ 云原生 开源消息队列

日志管理系统,多种方式总结

架构 日志 slf4j logback

如何写好一个Java类?

蜜糖的代码注释

Java 整洁代码 2月月更

7大迹象,表明你的DevOps 做对了!

SoFlu-JavaAI开发助手

80 行代码实现简易 RxJS

CRMEB

架构训练营模块八作业

沈益飞

架构训练营 架构师训练营 4 期

模块八 - 消息队列存储数据表结构设计

圈圈gor

架构实战营 「架构实战营」

2022重磅:增长法则-巧用数字营销 突破企业困局

博文视点Broadview

互联网人的命运,就是活到30岁都难?

码农参上

人生 互联网人 打工人

模块八作业

hunk

云原生训练营

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