前端渲染模式CSR,SSR,SSG,ISR,DPR

本文详细介绍了前端的五种渲染模式:客户端渲染(CSR)、服务器端渲染(SSR)、静态站点生成(SSG)、增量静态生成(ISR)和分布式的持续渲染(DPR),包括各自的原理、优缺点和应用场景。CSR适用于单页应用,SSR提升首屏加载速度,SSG预先生成静态HTML,ISR结合SSR和SSG,DPR利用CDN提升渲染效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、客户端渲染——CSR(Client Side Rendering)

二、服务器端渲染——SSR(Server Side Rendering)

三、静态站点生成——SSG(Static Site Generation)

四、增量静态生成——ISR(Incremental Static Regeneration)

五、分布式的持续渲染——DPR(Distributed Persistent Rendering)

六、对比及选择

七、相关参考


本文汇总了前端涉及到的几种不同渲染方式

一、客户端渲染——CSR(Client Side Rendering)

CSR 基本流程

 对于典型的 CSR 应用程序,浏览器仅接收一个用作应用程序容器的 HTML 页面,因此也称为单页应用。浏览器会优先请求到index.html文件,文件中并没有过多的DOM元素,直接打开的话会展示为空白页。之后会通过拉取JS、CSS文件,执行解析,对于像Vue,React,Angular等框架,会通过JS在定义的根节点上挂在DOM节点,最终将整体页面呈现给用户。

二、服务器端渲染——SSR(Server Side Rendering)

早期使用 JSP 或其他模板渲染引擎(如ejs,jade等)来构建应用就属于SSR的范畴,浏览器发起请求后,服务端会在内部完成数据请求和html的拼装操作,浏览器接收到的便是可直接渲染的html文件,而无需等待后续JS和css文件的加载。

起初的SSR在内容更新/跳转,都需要请求服务器,服务器会根据请求地址,返回新的页面内容。

在 React, Vue 等框架的加持下,SSR 一般指的是首屏服务端渲染同构渲染(Isomorphic render),即新开页面访问 SSR 应用时,首屏会返回完整的 html,浏览器通过注水hydrate)成为 React 或 Vue 应用,后续用户进行跳转等操作时不会再向服务端请求 html,而是以类似单页应用的方式进行。

同构渲染

同构渲染是 15 年左右 React 火了一段时间后提出的概念,原文是 Isomorphic rendering,但是很快就有人驳斥不应该用 Isomorphic 这个词,而应该用 Universal Rendering。

它可以分为两个部分:

  • 后端服务器获取数据并生成 HTML 返回给浏览器解析渲染页面
  • 浏览器在交互过程中,请求新的数据并动态更新渲染页面

这两种渲染方式的不同点在于运行环境的不同。单核心点是同一份代码可以在客户端和服务器端运行,两个环境的渲染结果保持一致。因此需要实现客户端和服务器端的路由、页面模板和数据共享。

它包含了两个重要的概念:

脱水(dehydrate)

将组件树序列化成静态的 HTML 片段,能直接看到初始视图,不过已经无法与之交互了,但这种便携的形态尤其适合网络传输。这个脱去动态数据,成为风干标本一样的静态快照的过程被称为脱水(dehydrate)。

注水(hydrate)

与脱水相反,将这个 html 躯干复活为 Vue 应用的过程称为注水。客户端并不重新生成 HTML 组件,而是重用服务器发送给它的 HTML,并附加「数据」与「交互性」,构建成完整的 Vue 应用,这个过程被称为注水(hydrate)。</

### 如何在前端处理和接收服务端 SSR 渲染的内容 #### 前端接收SSR内容的方式 当采用服务器端渲染SSR)技术时,服务器会预先生成完整的HTML文档并将其发送至浏览器。这意味着客户端接收到的是已经构建完毕的网页结构[^1]。 对于React应用而言,通过`ReactDOM.hydrate()`方法可以在已有的标记上附加事件监听器和其他必要的DOM操作,而不是像传统的CSR那样完全重新创建整个UI树。此过程不会改变现有节点而是增强其功能以便支持交互特性[^3]。 以下是具体代码示例: ```javascript import React from 'react'; import ReactDOM from 'react-dom/client'; // 获取根元素 const rootElement = document.getElementById('root'); if (rootElement.hasChildNodes()) { // 如果存在子节点,则说明这是由SSR产生的静态页面 const root = ReactDOM.createRoot(rootElement); root.hydrate(<App />, rootElement); } else { // 否则按照常规方式初始化应用程序 const root = ReactDOM.createRoot(rootElement); root.render(<App />); } ``` 在这个例子中,如果检测到当前页面是由服务端渲染而来(即`root`元素内已有内容),那么就调用`hydrate`函数来激活这些组件;反之如果没有发现任何预加载的数据,则正常启动SPA模式下的React程序。 #### 处理Hydration期间可能出现的问题 有时由于网络延迟或其他因素的影响,在hydration阶段可能会遇到一些挑战,例如样式闪烁或JavaScript错误等问题。为了避免这种情况的发生,建议开发者们遵循最佳实践指南,确保前后端模板的一致性以及合理配置资源加载顺序等措施[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值