速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

评论

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

蚂蚁金服二面被血虐,鬼知道面试的我经历了什么?

Java架构之路

Java 程序员 架构 面试 编程语言

产品经理训练营笔记-产品思维和产品意识(下)

.nil?

产品经理训练营

《程序员修炼之道》- 务实的方法(5)

石云升

程序员 28天写作 评估工作量

【Linux系统】关于守护进程

程序员架构进阶

Linux 架构 守护进程 28天写作

面试学习!月薪20k+的Android面试都问些什么?终获offer

欢喜学安卓

android 程序员 面试 移动开发

NeoKylin-Server-5.0离线部署etcd+flannel集群,实现docker容器跨主机网络通信

星河寒水

Docker etcd flannel 麒麟操作系统 离线部署

30+程序员竞争力从哪里来?

我心依然

程序员 竞争力

真狠!涵盖了Netty+Spark+Hadoop+分布式五部分!讲的清清楚楚!

996小迁

redis hadoop 架构 面试 Netty

Java学习笔记整理:Spring+tomcat+Kafka+多线程面试笔记

Java架构之路

Java 程序员 架构 面试 编程语言

半导体芯片小白基础知识(2) (28天写作 Day23/28)

mtfelix

集成电路 28天写作 晶圆 光刻机 晶圆代工

真正牛逼的人,都是极简主义者!!

冰河

产品 程序 极简主义

学习JAVA8个月,成功跳槽,外包进阿里成功定级P7,太牛了!

Java 编程 程序员 面试

《小狗钱钱》读书笔记

架构精进之路

读书笔记 七日更 28天写作

架构师训练营第 2 期 第 8 周 作业一

老腊肉

架构师训练营第2期

贪心算法

en

算法 贪心算法

老外程序员的Java性能优化方式是什么?JVM调优策略+工具+技巧

Java架构追梦

Java 学习 架构 面试 jvm调优

产业互联网业务与团队的思考

Geek_vidmje

BAT面试Spring全家桶:Spring+SpringBoot+SpringCloud+SpringMVC

Java架构之路

Java 程序员 架构 面试 编程语言

Redis击穿、穿透、雪崩产生原因以及解决思路

Java架构师迁哥

软件教练说:性能优化与性能设计,“相亲相爱”的一对

华为云开发者联盟

架构 性能优化 设计 程序 软件教练

奇葩java迭代器笔试题,做对算你厉害

田维常

迭代器模式

成长篇-结构思考力笔记(完整版)

小诚信驿站

程序员 刘晓成 小诚信驿站 成长笔记 28天写作

传统线程互斥技术 synchronized

武哥聊编程

Java 多线程 synchronized 28天写作

阿里内部Redis宝典意外流出极致经典:源码+实战+理论

比伯

Java 编程 程序员 架构 面试

“复制”马斯克(三):我们要为他的“反智事业”买单吗?

脑极体

JVM笔记 -- Java跨平台和JVM跨语言

秦怀杂货店

JVM JVM笔记

故乡的年

熊斌

28天写作

面试官问:ZooKeeper是强一致的吗?怎么实现的?

Java 编程 程序员 面试 分布式

阿里一线架构师甩出“源码阅读指南”,从源码到实战,一键搞定

比伯

Java 编程 程序员 架构 计算机

Mybatis【16】-- Mybatis多对一关联查询

秦怀杂货店

数据库 mybatis

深入浅出Android!阿里P7深入Binder原理讲解,论程序员成长的正确姿势

欢喜学安卓

android 程序员 面试 移动开发

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