如果配置得当,我们可以将所有的内容都在服务器端渲染,避免在浏览器端再次调用 API.

首先命令行安装 Angular Universal:

ng add @nguniversal/express-engine

执行命令行 npm run build:ssr

  • browser:是执行命令行 ng build — prod 之后的结果。

  • server folder: 是执行命令行 ng run PROJECT_NAME:server:production 的结果。

运行命令行 npm run serve:ssr, 这会启动 Node.js Express 服务器,endpoint 来自 server.ts.

如何避免 server 和 client 重复调用 API?

  • import TransferHttpCacheModule and BrowserTransferStateModule into AppModule
  • import ServerTransferStateModule into AppServerModule

检查服务器返回的 HTML 源代码,发现包含了 serverApp-state:

src/app/app.server.module.ts 这个文件是自动生成的,定义了运行在服务器端 Angular 应用的 Root module.

AppServerModule 导入了 AppModule,以后者 addon 的形式进行工作,确保 AppModule 不会被修改。

AppServerModule 的职责:

  • disables animation by NoopAnimationsModule.
    很显然,服务器端运行的 Angular 应用不需要动画效果。

  • disables handling of scrolling by Angular

  • 修改了 HTTP 请求的调用方式。

浏览器端的 HTTP API 调用采取 XMLHttpRequest 实现,而服务器端的 API 调用通过 xhr2 (XMLHttpRequest Emulation for node.js) 完成。

文件 src/main.ts 也已经自动被修改。

现在只有当浏览器抛出 DOMContentLoaded 事件之后,Angular 应用才会被 bootstrap,此时 HTML 已经完全被解析完毕。

TransferState — mechanism of how server-side Angular application can transfer data to browser application directly inside generated Html.

通过 TransferState 机制,服务器端 Angular 应用将数据通过生成的 HTML 源代码,直接传递给浏览器端应用。

BrowserModule.withServerTransition({ appId: ‘serverApp’ })

上面代码内的 withServerTransition 方法也用于进行 TransferState 机制处理。

appId 属性用于让浏览器知道哪一个 DOM 元素是在服务器端添加的。

How TransferState works

没有引入 TransferState 机制之前的流程

(1) SSR Node.js 服务器收到浏览器发送的请求

(2) SSR 服务器调用 API,读取业务数据,渲染页面。将渲染结果发送回浏览器。

(3) Angular 应用在浏览器端启动,然后再次调用 API.

TransferState 机制就一句话:

server application caches API responses directly in generated HTML, a browser checks cached responses before doing a real API call.

服务器端应用将 API 响应直接缓存在生成的 HTML 代码里,浏览器在发送 API 之前,先检查 cached 响应。

TransferState 机制的几个组成部分:

  • TransferState:服务提供者,一个键值存储结构。

  • ServerTransferStateModule — import into app.server.module.ts .

该 module 在服务器应用里创建了一个 TransferState provider. 并且 get transfer state storage content,转换成 text 格式,将其存储到 script 元素里。

  • TransferHttpCacheModule — import into app.module.ts.

这个 module 提供了一个 interceptor,能将 API 调用的响应数据缓存到 transfer state 中,并避免不必要的重复 API 调用。

  • BrowserTransferStateModule — import into app.module.ts.

从服务器应用中读取 transferred state,也就是 script 元素中的数据,解析,并创建 Transfer State provider 实例。这一切就绪后,Angular 应用就能访问从服务器端传输的数据了。

更多Jerry的原创文章,尽在:“汪子熙”:

Angular Universal 学习笔记相关推荐

  1. Angular Universal 学习笔记 - 客户端渲染和服务器端渲染的区别

    https://github.com/angular/universal Universal 的命名由来: We believe that using the word "universal ...

  2. Angular 4 学习笔记1

    文章目录 一张图说明Angular程序架构 Angular开发环境搭建 项目文件夹和各部分关系 引入npm命令安装的外部模板 使用指令生成组件 启动项目指令 数据绑定 将css类绑定到html标签上 ...

  3. Angular入门学习笔记

    Angualr入门扫盲必备 声明:这篇是我学习angualr的笔记,可以转载,但必须注明来源作者 kone 并附上本文链接 A:环境,工具 1:先确保安装了nodejs和npm Nodejs npm ...

  4. Angular 4 学习笔记 从入门到实战 打造在线竞拍网站 基础知识 快速入门 个人感悟

    最近搞到手了一部Angular4的视频教程,这几天正好有时间变学了一下,可以用来做一些前后端分离的网站,也可以直接去打包web app. 先上个效果图: 环境&版本信息声明 运行ng -v @ ...

  5. 为什么选择angular?-学习笔记

    使用angular的原因: Angular是一款优秀的前端JS框架,已经被用于Google的多款产品当中. 它有一下的特性: 良好的应用程序结构: 双向数据绑定: 指令: HTML模版: 可嵌入,注入 ...

  6. 3、Angular JS 学习笔记 – Controllers [翻译中]

    2019独角兽企业重金招聘Python工程师标准>>> 理解控制器 在Angular中,一个控制器是一个javascript构造函数用于填充Angular作用域. 当一个控制器通过使 ...

  7. 4、Angular JS 学习笔记 – 创建自定义指令 [翻译中]

    2019独角兽企业重金招聘Python工程师标准>>> 创建自定义指令 注意:本指南是针对已经熟悉AngularJS基础的开发者.如果您只是想要开始,建议您先去看教程.如果你在寻找指 ...

  8. Angular library 学习笔记

    原文 Use cases for Angular libraries Angular 库有 2 个常见用例: 构建可重用的组件库以在应用程序之间共享. 构建共享服务层功能 - 例如. 用于处理外部数据 ...

  9. Angular Schematics 学习笔记

    网址:https://angular.io/guide/schematics A schematic is a template-based code generator that supports ...

最新文章

  1. 布朗大学研究者提出面向下一代脑机接口系统
  2. Paper:《NÜWA: Visual Synthesis Pre-training for Neural visUal World creAtion,女娲:用于神经视觉世界创造的视觉》翻译与解读
  3. 简单QT应用到通过手写布局实现QT应用
  4. 计算机网络工程本科培养计划,网络工程专业卓越计划本科培养方案2015版-西安电子科技大学计算机.doc...
  5. 和吴昊一起玩推理 Round 2 —— 蚂蚁爬杆问题
  6. jquery $.get()、$.ajax()与后台servlet交互方法
  7. python3 ftp启动_python3利用pyftpdlib模块启动ftp服务
  8. COM组件设计与应用(三)(转载)
  9. Spring 双层事务,我抛出的异常去哪了?
  10. 批量输出lib文件名(PCL或者opencv等环境配置)
  11. 极客大学架构师训练营 听课总结 - 架构视图,设计文档 -- 第二课
  12. 四级网络工程师试题一
  13. WPC QI 无线充电
  14. 计算机辅助审计在外汇,外汇管理领域计算机辅助审计
  15. C语言---1 C语言认知
  16. oracle 取1条记录,oracle 获取第一条数据
  17. 读书笔记:《反脆弱》
  18. 关于图像融合 视频融合
  19. 功能测试非常重要的43个功能测试点...
  20. 什么是字节码?采用字节码的好处是什么?

热门文章

  1. MS15-035 EMF文件处理漏洞分析与POC构造
  2. jQueryEasyUi验证
  3. 并发用户数的计算公式
  4. 为什么人生气时说话用喊的
  5. 在博客园的博客插入代码块(高亮、行号、缩进、着色)
  6. CTS/APIO后文化课游记
  7. 《SQL必知必会(第4版)》 02 检索数据
  8. Yii 中Criteria常用方法
  9. 康托展开与八数码问题
  10. JavaScript css-dom