客户端渲染CSR、服务器端渲染SSR、预渲染Prerendering

本文对比分析了SPA(单页面应用)与SSR(服务器端渲染)的特点与优劣,探讨了两者在SEO、内容到达时间和用户体验上的差异,以及预渲染在改善营销页面SEO的应用。

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

什么是客户端渲染 CSR

在进行SPA(单页面应用)开发时,大多数都会选择Vue.js。默认情况下,会生成vue组件,输出到浏览器,进行生成 DOM 和操作 DOM。使用vue.js开发的项目在浏览器端是看不到页面内容源代码的。

例如下面这个项目,页面中显示的内容如下
服务器端渲染
单击右键查看网页源代码,显示如下图,只能看到主体内容只有一个id为app的div标签,那么页面的内容是从哪里来的呢?很明显,是通过js代码控制生成的。
服务器端渲染

什么是服务器端渲染 SSR

如果将同一个组件渲染为服务器端的 HTML 字符串后,再将它们直接发送到浏览器,最后将这些静态标记"激活"为客户端上完全可交互的应用程序,这种方式,就是服务器端渲染。经过服务器端渲染的项目,当我们点击右键查看网页源代码,是可以看到页面内容代码的。

通俗来讲,就是服务器返回一堆html字符串,然后让浏览器显示。

服务器端渲染的特点

SSR的优点

与传统 SPA (单页应用程序 (Single-Page Application)) 相比,服务器端渲染 (SSR) 的优势主要在于:

  • 更好的 SEO,由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面。
    请注意,截至目前,Google 和 Bing 可以很好对同步 JavaScript 应用程序进行索引。在这里,同步是关键。如果你的应用程序初始展示 loading 菊花图,然后通过 Ajax 获取内容,抓取工具并不会等待异步完成后再行抓取页面内容。也就是说,如果 SEO 对你的站点至关重要,而你的页面又是异步获取内容,则你可能需要服务器端渲染(SSR)解决此问题。

  • 更快的内容到达时间 (time-to-content),特别是对于缓慢的网络情况或运行缓慢的设备。无需等待所有的 JavaScript 都完成下载并执行,才显示服务器渲染的标记,所以你的用户将会更快速地看到完整渲染的页面。通常可以产生更好的用户体验。

SSR的缺点

  • 开发条件所限。浏览器特定的代码,只能在某些生命周期钩子函数 (lifecycle hook) 中使用;一些外部扩展库 (external library) 可能需要特殊处理,才能在服务器渲染应用程序中运行。
  • 涉及构建设置和部署的更多要求。与可以部署在任何静态文件服务器上的完全静态单页面应用程序 (SPA) 不同,服务器渲染应用程序,需要处于 Node.js server 运行环境。
  • 更多的服务器端负载。本来是通过客户端完成渲染,现在统一在服务端 Node.js 中进行渲染,尤其是高并发访问的情况,会大量占用服务端CPU资源。

SSR vs CSR

SSR和CSR最大的区别在于前者的页面是服务器端直接返回HTML让浏览器直接渲染,而后者渲染是JS负责进行的。

数据请求方面,由服务器端请求数据比客户端请求数据要快。服务器端在内网进行请求,数据响应速度快。客户端在不同网络环境进行数据请求,且外网http请求开销大,导致时间差。

html渲染方面,服务器端渲染是先向后端服务器请求数据,然后生成完整首屏html返回给浏览器;客户端渲染是等js代码下载、加载、解析完成后再请求数据渲染,等待的过程页面是什么页面都没有的,就是用户看到的白屏。服务器端渲染不需要等待js代码下载完成并请求数据,就可以返回一个已有完整数据的首屏页面。

SSR vs 预渲染

如果你调研服务器端渲染 (SSR) 只是用来改善少数营销页面(例如 /, /about, /contact 等)的 SEO,那么你可能需要预渲染(Prerendering)。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时 (build time) 简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可以将你的前端作为一个完全静态的站点。

如果你使用 webpack,你可以使用 prerender-spa-plugin 轻松地添加预渲染。它已经被 Vue 应用程序广泛测试。

<think>好的,我现在要介绍服务器端渲染SSR)的过程。首先,我需要回忆一下自己对SSR的理解,确保没有遗漏关键点。嗯,SSR应该是在服务器端生成完整的HTML页面,然后发送给客户端,对吧?这样有助于SEO和首屏加载速度。 然后,我得想清楚SSR的基本流程。可能包括客户端请求、服务器处理、生成HTML、发送到客户端客户端激活等步骤。不过具体细节可能需要更仔细的组织。比如,用户访问一个SSR的应用时,服务器接收到请求后,是如何生成HTML的呢?是不是需要执行JavaScript代码来渲染页面? 接下来要考虑与传统客户端渲染CSR)的区别。CSR是在浏览器中通过JavaScript动态生成内容,而SSR是在服务器端生成,这样爬虫可以直接看到完整内容,对SEO友好。这点需要强调一下。 可能还需要提到SSR的优点和缺点。优点包括更快的首屏加载、更好的SEO,缺点可能有服务器压力大、开发复杂度增加等。不过用户的问题主要是过程,所以重点应该放在步骤上,优缺点可以简要带过。 然后,SSR的具体步骤可能需要分解。比如,服务器接收请求,运行应用代码,获取数据,渲染组件为HTML字符串,然后注入到模板中,发送给客户端客户端接收到HTML后,还需要加载JavaScript进行“水合”(hydration),使页面具有交互性。 这里需要注意,水合的过程是什么?应该是将事件处理程序附加到现有的HTML元素上,而不是重新渲染整个页面。这确保了页面不会因为客户端JS的执行而出现闪烁或重新布局。 还有,数据获取在SSR中的处理方式。服务器在渲染之前可能需要先获取必要的数据,比如调用API,然后将数据注入到组件中,这样生成的HTML已经包含数据,不需要客户端再次请求。 可能还需要提到常见的SSR框架,比如Next.js(React)、Nuxt.js(Vue)、Angular Universal等,这些框架简化了SSR的实现,但用户可能不需要具体框架的细节,所以简单提及即可。 需要确保流程描述的连贯性,从用户发起请求到服务器处理,生成HTML,发送响应,再到客户端的处理,每一步都要逻辑清晰。同时,注意使用正确的术语,比如“水合”而不是“混合”或其他说法。 另外,可能存在的挑战,比如服务器端客户端代码的兼容性,避免使用浏览器特有的API在服务器端执行,或者处理异步操作时的同步渲染问题。不过用户问的是过程,这些挑战可能属于进阶内容,可以简要提到,但重点还是步骤。 最后,检查是否有错误的地方,比如是否所有步骤都准确,有没有混淆SSR和静态生成(SSG)的区别。SSR是每次请求时生成,而SSG是构建时生成,这点需要明确区分,避免混淆。 总结一下,SSR的过程应该分为服务器端客户端两部分,详细说明每个阶段的处理步骤,强调数据获取、HTML生成、客户端激活等关键环节,确保用户能够理解整个流程。</think>服务器端渲染(Server-Side Rendering,SSR)是Web应用的一种渲染方式,其核心过程可分为以下步骤: --- ### **1. 用户发起请求** 当用户在浏览器输入URL或点击链接时,浏览器向服务器发送HTTP请求。 --- ### **2. 服务器接收请求** 服务器(如Node.js、Java、PHP等)解析请求路径,确定需要渲染的页面。 --- ### **3. 执行应用代码** 服务器运行前端框架(如React、Vue)的代码,根据路由匹配对应组件: ```javascript // 示例:Express.js + React app.get('/page', (req, res) => { const App = React.createElement(PageComponent); // ... }); ``` --- ### **4. 数据获取** 服务器获取页面所需数据(如调用API或查询数据库): ```javascript const data = await fetchAPI(); // 同步获取数据 ``` --- ### **5. 生成HTML** 服务器将组件与数据结合,渲染为完整的HTML字符串: ```javascript const html = ReactDOMServer.renderToString(<PageComponent data={data} />); ``` --- ### **6. 注入数据与资源** 将HTML、初始数据(如`window.__INITIAL_STATE__`)和客户端JavaScript文件路径嵌入响应模板: ```html <html> <body> <div id="root">${html}</div> <script>window.__INITIAL_STATE__ = ${JSON.stringify(data)};</script> <script src="/client-bundle.js"></script> </body> </html> ``` --- ### **7. 返回响应** 服务器将完整的HTML发送给客户端,浏览器立即解析并展示内容(此时页面已可交互)。 --- ### **8. 客户端激活(Hydration)** 客户端JavaScript(如React/Vue)加载后,执行“水合”过程: ```javascript // React示例 ReactDOM.hydrate(<App />, document.getElementById('root')); ``` - **作用**:将事件处理程序绑定到现有HTML元素,恢复页面交互性。 - **优势**:避免重新渲染,保持初始HTML结构。 --- ### **关键对比:SSR vs CSR** | 阶段 | SSR | CSR客户端渲染) | |--------------------|----------------------------------|-------------------------------| | HTML生成 | 服务器生成完整HTML | 浏览器从空HTML动态构建 | | 首屏加载 | 立即显示内容 | 需等待JS加载执行 | | SEO | 友好(爬虫直接获取内容) | 需额外处理(如预渲染) | | 服务器压力 | 较高(每次请求需渲染) | 较低(仅提供静态文件) | --- ### **适用场景** - **SEO敏感页面**:如电商产品页、新闻文章。 - **首屏速度要求高**:弱网络环境下提升用户体验。 - **动态内容与交互并存**:需快速展示内容并保留复杂交互。 --- ### **挑战** - **服务器成本**:高并发时需更多计算资源。 - **开发复杂度**:需处理服务器-客户端代码兼容性(如避免`window`对象在服务器端使用)。 - **数据同步**:确保服务器与客户端初始状态一致。 --- 通过SSR,开发者能在服务端生成可直接渲染的内容,兼顾性能与用户体验,是现代Web应用(如Next.js、Nuxt.js)的核心技术之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值