首页 > 编程语言 >Angular 应用程序的 Hydration 概念详解

Angular 应用程序的 Hydration 概念详解

时间:2023-09-24 20:22:06浏览次数:54  
标签:Hydration JavaScript 应用程序 HTML Angular CSR

Angular 应用程序的Hydration概念

Hydration概念是Angular应用程序中的一个关键概念,它涉及到Angular框架在客户端渲染(Client-side rendering,CSR)中的运作方式。要深入理解Hydration,首先需要了解CSR和SSR(Server-side rendering,服务器端渲染)之间的基本区别,以及Angular是如何利用Hydration来提高CSR性能的。本文将详细解释Angular应用程序的Hydration概念,并通过示例来说明。

CSR和SSR的基本区别

在理解Hydration之前,让我们简要回顾一下CSR和SSR的基本区别。

  • CSR(Client-side Rendering):在CSR中,整个应用程序的构建和渲染都发生在客户端浏览器中。当用户访问一个CSR应用时,浏览器会下载应用的JavaScript代码,然后在用户的设备上执行该代码来渲染页面。这种方式的好处是可以在客户端实现动态交互,但也有性能挑战,因为首次加载时需要下载大量的JavaScript代码,导致页面加载时间较长。

  • SSR(Server-side Rendering):在SSR中,服务器在接收到客户端请求时,会在服务器上预先渲染HTML内容,并将其发送到客户端浏览器。这意味着用户会更快地看到内容,因为不必等待大量JavaScript代码下载和执行。但与CSR相比,SSR可能在复杂的应用中导致服务器负载增加,并且对实现某些交互功能有一定限制。

Angular的CSR和SSR

Angular支持两种渲染模式:CSR和SSR。默认情况下,Angular应用程序采用CSR模式,这意味着整个渲染过程发生在客户端。但在某些情况下,如需要更好的首屏加载性能或SEO(搜索引擎优化)要求,可以选择使用SSR。

在Angular中,CSR应用程序通常使用以下方式启动:

platformBrowserDynamic().bootstrapModule(AppModule)
  .catch(err => console.error(err));

而SSR应用程序则使用以下方式启动:

platformServer().bootstrapModule(AppModule)
  .then(moduleRef => {
    const appRef = moduleRef.injector.get(ApplicationRef);
    const state = moduleRef.injector.get(PlatformState);
    appRef.isStable.pipe(
      first(isStable => isStable === true),
    ).subscribe(() => {
      state.renderToString().then(html => {
        console.log(html); // 在服务器上渲染的HTML
        moduleRef.destroy();
      });
    });
  });

在CSR模式下,Angular应用程序的初始加载将包括一些基本的HTML结构和一个JavaScript包(通常包含整个应用的代码),然后在浏览器中运行这些代码以渲染完整的页面。

但这里涉及到一个性能问题:JavaScript包的下载和执行可能需要一定的时间,用户在此期间将看到一个空白的页面或加载指示器。这正是Hydration概念的出发点。

Hydration概念的背后

Hydration的核心思想是在CSR应用程序中,尽快显示内容,而不必等待整个JavaScript包的下载和执行。为了做到这一点,Angular引入了一种机制,使应用程序能够在浏览器端逐步加载和填充内容。

具体来说,当Angular应用程序以CSR模式启动时,它会将一些初始HTML内容嵌入到服务器生成的HTML中,这些内容会立即在浏览器端显示。然后,JavaScript包会下载并在后台执行。一旦JavaScript包下载完成并准备好,它会“水合”(hydrate)这些初始HTML内容,也就是将其转化为具有交互性的Angular组件。

这意味着用户在等待JavaScript包下载和执行时,仍然可以与页面上的内容进行交互。Hydration的好处是提高了用户感知的加载速度,因为页面会尽早显示内容,同时仍然允许应用程序在后台加载和初始化。

Hydration的工作原理

要理解Hydration的工作原理,让我们更深入地了解它的步骤:

  1. 服务器端渲染(SSR)生成初始HTML:在服务器端渲染中,Angular应用程序的初始HTML内容会被生成,并包含一些特殊的标记,以标识哪些部分需要水合。

  2. 初始HTML发送到客户端:生成的初始HTML内容会随响应发送到客户端浏览器。

  3. 客户端下载JavaScript包:浏览器开始下载Angular应用程序的JavaScript包,这个包包含了应用程序的代码、组件和模块。

  4. JavaScript包的执行:一旦JavaScript包下载完成,浏览器会开始执行它。在执行过程中,Angular框架会识别初始HTML中的特殊标记,然后将这些标记转化为Angular组件。

  5. 水合(Hydration):当Angular框架水合(hydrate)初始HTML内容时,它会将这些内容替换为实际的Angular组件,并建立起与这些组件的交互能力。这意味着用户可以与页面上的内容进行交互,而不必等待整个JavaScript包的加载和执行。

Hydration示例

为了更好地理解Hydration,让我们通过一个简单的示例来演示它的工作原理。假设我们有一个Angular应用程序,其中包含一个简单的组件,用于显示用户的

姓名。这个组件的初始HTML可能如下所示:

<!-- 初始HTML -->
<app-root>
  <app-user-name>Loading...</app-user-name>
</app-root>

在这个示例中,<app-user-name>是一个Angular组件,用于显示用户的姓名。初始HTML中包含了一个占位符文本“Loading...”,这是因为在水合之前,JavaScript包尚未下载和执行。

现在,让我们看看Hydration是如何应用于这个示例的:

  1. 服务器端渲染(SSR)生成初始HTML,并将其发送到客户端。
<!-- 服务器生成的初始HTML -->
<app-root>
  <app-user-name _nghost-abc123>John Doe</app-user-name>
</app-root>

在这个HTML中,我们可以看到<app-user-name>组件的内容已经被填充为“John Doe”,并且有一个特殊的属性 _nghost-abc123,它用于标识这个组件。

  1. 客户端浏览器开始下载JavaScript包。

  2. JavaScript包的执行过程中,Angular框架检测到初始HTML中的特殊标记。

  3. Angular框架将初始HTML中的特殊标记替换为实际的Angular组件,并建立交互。

<!-- 水合后的HTML -->
<app-root>
  <app-user-name _nghost-abc123 _ngcontent-def456>John Doe</app-user-name>
</app-root>

在这个HTML中,<app-user-name>组件已经被替换为一个具有Angular交互能力的组件,并且有两个特殊属性 _nghost-abc123_ngcontent-def456,它们用于确保组件的样式隔离。

现在,用户可以与页面上的内容进行交互,而不必等待整个JavaScript包的加载和执行。

Hydration的优势和应用场景

Hydration的主要优势在于提高了用户感知的加载速度,尤其是对于CSR应用程序。用户能够更快地看到页面上的内容,并与之交互,而不必等待整个JavaScript包的下载和执行。

Hydration在以下情况下特别有用:

  1. 改善首屏加载性能:对于那些希望快速展示内容给用户的应用程序,Hydration可以显著改善首屏加载性能,提高用户体验。

  2. 提高SEO:对于需要SEO的应用程序,Hydration可以确保搜索引擎爬虫能够看到页面的初始内容,而不必等待JavaScript的执行。这可以提高搜索引擎排名。

  3. 渐进增强:Hydration支持渐进增强的策略,即使JavaScript加载失败或禁用,页面仍然能够正常工作,因为初始内容已经在服务器端渲染时生成。

Hydration的挑战和注意事项

尽管Hydration提供了许多性能优势,但也需要注意一些挑战和注意事项:

  1. 额外的复杂性:实施Hydration需要在Angular应用程序中引入额外的复杂性,包括在初始HTML中添加特殊标记以识别需要水合的部分。

  2. 代码拆分:为了实现更好的Hydration效果,通常需要将应用程序的代码拆分成小块,以便更快地下载和执行关键部分。

  3. 性能监控:需要监控Hydration的性能,确保JavaScript包的下载和执行不会导致性能问题。

  4. 初始状态同步:确保初始HTML中的内容与后续JavaScript执行的状态同步,以避免不一致性。

结论

Hydration是Angular应用程序中的一个关键概念,它允许在CSR模式下提高用户感知的加载速度,同时保留了应用程序的交互性。通过在初始HTML中添加特殊标记,Angular能够在后台下载和执行JavaScript包的同时,尽早显示页面内容。

Hydration的实现需要一定的复杂性和考虑,但它可以改善首屏加载性能、提高SEO、支持渐进增强策略等。了解Hydration的工作原理和应用场景,可以帮助开发者更好地优化Angular应用程序的性能和用户体验。

标签:Hydration,JavaScript,应用程序,HTML,Angular,CSR
From: https://www.cnblogs.com/sap-jerry/p/17726583.html

相关文章

  • 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/
    今天解决了一个很早之前的问题!!!无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]之前一直以为是jar包不匹配,但是改了jar包之后连uri都分辨不出来了后来在网上查到是tomcat的问题,将tomcat的conf目录下的catalina.properties的tomc......
  • 应用程序读取磁盘的数据流程
    应用程序请求文件读取:用户态的应用程序发起文件读取请求,通常是通过标准的文件操作函数(例如,在Linux中是read(),在Windows中是ReadFile())系统调用:操作系统内核接收到应用程序的读取请求,这将触发一个系统调用(systemcall)。系统调用是用户态和内核态之间的通信机制,用于执行操......
  • Angular 16+ 基础教程 – 开篇和目录
    前言前阵子我开始写 Angular复习与进阶系列,写着写着,发现写不下去。思来想去,感觉原因是主题定的不好。复习与进阶,意味着看的人就要有基础,但是这个基础到底要多少又说不清楚,更糟糕的是这两年Angular团队重组后尽然开始做新功能了,而且有越做越多的迹象,所以这个说这个基础更加......
  • 基于事件的 JavaScript 编程:构建交互式 Web 应用程序
    了解事件 1.事件类型JavaScript支持多种事件类型。一些最常见的包括:鼠标事件:这些事件由用户与鼠标的交互触发,例如单击、悬停和拖动。键盘事件:这些事件在用户与键盘交互时发生,例如按下某个键或松开某个键。表单事件:与表单元素相关的事件,例如提交表单或更改输入字段的值。......
  • 【项目心得】关于Angular中使用Cookie
    今天写一个Angular前端项目时遇到需要使用Cookie的场景,bing寻找解决办法根据bing搜索第一条的方法,使用了一个名为”ngx-cookie-service“的库,结果方才一导入,就提示报错,报错信息如下:Error:Uncaught(inpromise):Error:NG0203:inject()mustbecalledfromaninjec......
  • 使用MediatR库简化.NET应用程序中的CQRS实现
    本文介绍了如何使用MediatR库简化.NET应用程序中CQRS(命令查询职责分离)模式的实现。我们将通过一个具体的业务场景来演示如何使用MediatR库,以及它带来的好处。引言CQRS(命令查询职责分离)是一种架构模式,它将一个对象的命令操作(例如创建、更新和删除)与查询操作(如读取和搜索)分离开来......
  • 在.NET应用程序中实现领域驱动设计(DDD)
    本文介绍了如何在.NET应用程序中实现领域驱动设计(DDD),以便更好地应对复杂业务需求。我们将介绍DDD的核心概念,并通过一个具体的业务场景演示如何在实践中应用这些概念。引言在开发具有复杂业务需求的应用程序时,我们需要确保我们的代码能够灵活地应对变化。领域驱动设计(DDD)是一种方......
  • 使用亚马逊云服务器在 G4 实例上运行 Android 应用程序
    随着Android应用程序和游戏变得越来越丰富,其中有些甚至比PC上的软件更易于使用和娱乐,因此许多人希望能够在云上运行Android游戏或应用程序,而在EC2实例上运行Android的解决方案可以让开发人员更轻松地测试和运行Android应用程序。在这篇博客文章中,我们将展示如何使用N......
  • iOS应用程序发布流程:从测试到上架的完整指南
    ​ 目录 转载:iOS应用程序的签名、重签名和安装测试前言打开要处理的IPA文件设置签名使用的证书和描述文件开始iosipa重签名 转载:iOS应用程序的签名、重签名和安装测试前言ipa编译出来后,或者ipa进行修改后,需要进行重新签名才能安装到测试手机,或者提交appstore供a......
  • 提高iOS应用程序安全性:使用Keychain和加密技术保护iOS应用程序数据
    ​目录 转载:怎么保护苹果手机移动应用程序ipa中文件安全?前言1.对敏感文件进行文件名称混淆  ​编辑2.更改文件的MD5值3.增加不可见水印处理3.对html,js,css等资源进行压缩5.删除可执行文件中的调试信息 转载:怎么保护苹果手机移动应用程序ipa中文件安全?前......