浅谈 Angular 引入 Transfer State 机制的动机

发布时间 2023-10-11 22:35:03作者: JerryWang_汪子熙

在 Angular 之中,Transfer State 是一个用于在服务器端渲染 (SSR) 中传递状态的机制。它可以解决应用程序的一些重要问题,比如性能问题和用户体验问题。在这篇文章中,我将详细解释 Transfer State 的概念,工作原理以及如何在 Angular 应用程序中使用它。

首先,我们需要了解什么是服务器端渲染 (SSR) 和它为什么重要。在传统的单页应用程序 (SPA) 中,所有的资源和应用逻辑都在客户端处理。当用户访问网页时,服务器只提供一个空的 HTML 文件,然后客户端 JavaScript 脚本会加载数据并填充这个 HTML 文件。这种方式有两个主要的问题。第一个问题是性能。因为所有的处理都在客户端完成,所以如果用户的设备性能较差,或者网络连接不佳,那么用户就需要等待较长时间才能看到完整的页面。第二个问题是搜索引擎优化 (SEO)。因为搜索引擎通常无法执行 JavaScript 脚本,所以在 SPA 中搜索引擎只能看到一个空的页面,这对于 SEO 是非常不利的。

服务器端渲染 (SSR) 是解决这些问题的一种方式。在 SSR 中,服务器会预先执行应用的 JavaScript 代码,生成完整的 HTML 文件,并将其发送给客户端。这样,用户可以立即看到完整的页面,而无需等待 JavaScript 代码的执行和数据的加载。同时,因为服务器发送给客户端的是完整的 HTML 文件,所以搜索引擎可以看到所有的内容,这对于 SEO 是非常有利的。

然而,SSR 也有自己的问题。一个主要的问题是数据的重复获取。在 SSR 中,服务器需要获取数据以生成 HTML 文件。然后,当客户端接收到 HTML 文件并开始执行 JavaScript 代码时,它也需要获取同样的数据。这就导致了数据的重复获取,浪费了网络资源,也增加了页面的加载时间。

这就是 Transfer State 发挥作用的地方。Transfer State 是 Angular 提供的一个机制,可以在 SSR 中解决数据的重复获取问题。它允许你在服务器端获取数据,并将这些数据以一种可以在客户端访问的方式嵌入到 HTML 文件中。然后,在客户端,你可以从 Transfer State 中读取这些数据,而无需再次从服务器获取。

在 Angular 中,你可以使用 TransferState 类来使用 Transfer State 机制。这个类提供了一些方法,可以让你在服务器端和客户端之间传递数据。

首先,你需要在服务器端获取数据,并使用 TransferState.set 方法将这些数据存储到 Transfer State 中。这个方法接受两个参数,第一个参数是一个键,第二个参数是一个值。键是一个 StateKey<T> 类型的对象,你可以使用 makeStateKey 方法来创建它。