Angular Universal 学习笔记

简介: Angular Universal 学习笔记

如果配置得当,我们可以将所有的内容都在服务器端渲染,避免在浏览器端再次调用 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 应用就能访问从服务器端传输的数据了。

相关文章
|
2月前
|
前端开发 安全 开发者
JSF文件上传,让Web应用如虎添翼!一招实现文件上传,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,文件上传是重要功能之一。JSF(JavaServer Faces)框架提供了强大的文件上传支持,简化了开发流程。本文将介绍JSF文件上传的基本步骤:创建前端表单、处理上传文件的后端Action类、将文件保存到服务器指定目录以及返回结果页面。通过示例代码,我们将展示如何利用JSF实现文件上传功能,包括使用`h:inputFile`控件和`ManagedBean`处理上传逻辑。此外,JSF文件上传还具备类型安全、解耦合和灵活性等优点,有助于提升程序的健壮性和可维护性。
28 0
|
2月前
|
UED
JSF文件下载:解锁终极文件传输秘籍,让你的Web应用瞬间高大上!
【8月更文挑战第31天】掌握JSF文件下载功能对构建全面的Web应用至关重要。本文通过具体代码示例,详细介绍如何在JSF中实现文件下载。关键在于后端Bean中的文件读取与响应设置。示例展示了从创建实体类到使用`<h:commandLink>`触发下载的全过程,并通过正确设置响应头和处理文件流,确保文件能被顺利下载。这将显著提升Web应用的实用性与用户体验。
47 0
|
2月前
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
38 0
|
11月前
|
运维 前端开发 JavaScript
基于 Angular Universal 引擎进行服务器端渲染的前端应用 State Transfer 故障排查案例
基于 Angular Universal 引擎进行服务器端渲染的前端应用 State Transfer 故障排查案例
|
11月前
|
JavaScript 前端开发 API
关于 Angular Universal 应用渲染两次的问题
关于 Angular Universal 应用渲染两次的问题
|
搜索推荐 API 网络架构
关于 Angular Universal 应用执行时需要 Browser API 的问题
关于 Angular Universal 应用执行时需要 Browser API 的问题
关于 Angular Universal 应用执行时需要 Browser API 的问题
|
缓存 监控 API
Angular Universal 应用避免 SSR hang 的一些指导方针
Angular Universal 应用避免 SSR hang 的一些指导方针
|
SQL 安全 JavaScript
Angular Universal Application 应该处理 HTTP POST 请求吗?
Angular Universal Application 应该处理 HTTP POST 请求吗?
使用 Angular Universal 进行服务器端渲染的防御性编程思路
使用 Angular Universal 进行服务器端渲染的防御性编程思路
|
JavaScript
使用 Angular Universal 进行服务器端渲染避免 window is not defined 的错误消息
使用 Angular Universal 进行服务器端渲染避免 window is not defined 的错误消息
下一篇
无影云桌面