初识SSR(Server-Side Rendering,服务器端渲染)

360 阅读7分钟

前端开发发展史

在正式开始接触SSR之前,我们先来了解一下前端的发展史。在前端的发展过程中,经历过一下几个阶段:

传统服务端渲染SSR -> 单页面应用SPA -> 服务端渲染SSR 针对前两个,我们做个简单介绍。

传统服务端渲染SSR

  • 代表框架:ASP.net、JSP

  • 特点:请求后端返回html页面

image.png

单页面应用SPA

单页面应用是目前使用最广泛的开发方式,页面内容由JS渲染出来,这种方式称为客户端渲染。

  • 代表框架:Vue、React

  • 特点:页面内容由JS渲染 !

image.png

当前服务端渲染SSR

SSR(Server-Side Rendering,服务器端渲染)  现代服务器端渲染,用于在服务器上生成客户端(浏览器)看到的初始 HTML 内容,而不是在客户端通过 JavaScript 动态生成内容。SSR 在现代 Web 开发中非常重要,因为它可以改善用户体验、提高搜索引擎优化(SEO)效果,并且有利于社交分享。

  • 代表框架:Nuxt

  • 特点:

    1. 首屏渲染:当用户首次访问网站时,服务器会生成完整的HTML页面并发送给客户端。这样可以确保搜索引擎能够抓取到页面内容,并且用户能够快速看到页面的初始内容。
    2. 后续页面渲染:对于后续的页面导航,通常会使用客户端JavaScript来动态加载和渲染页面内容。这种机制结合了SSR的SEO优势和SPA(单页应用)的流畅用户体验。

image.png

详细描述

SSR 的工作原理

  1. 请求阶段

    • 当用户访问一个页面时,浏览器向服务器发送请求。
    • 服务器接收到请求后,运行相关的代码(如 React、Vue 或 Angular 的服务器端渲染逻辑),生成完整的 HTML 内容。
  2. 渲染阶段

    • 服务器将生成好的 HTML 内容直接返回给浏览器。
    • 浏览器接收到 HTML 后,立即显示页面内容,用户可以看到完整的页面。
  3. 交互阶段

    • 在 HTML 加载完成后,浏览器会下载并执行 JavaScript 文件。
    • JavaScript 会“接管”页面,使其具备交互能力(这一过程称为 Hydration,即“注水”)。

SSR 的优点

  1. SEO 友好

    • 由于服务器返回的是完整的 HTML 内容,搜索引擎可以轻松抓取和索引页面内容,对 SEO 非常有利。
  2. 首屏加载速度快

    • 用户首次访问页面时,服务器已经渲染好了 HTML,浏览器可以直接显示,减少了白屏时间。
  3. 更好的用户体验

    • 用户无需等待 JavaScript 加载和渲染,可以更快地看到页面内容。
  4. 兼容性更好

    • 对于不支持 JavaScript 或 JavaScript 加载失败的情况,用户仍然可以看到页面内容。

SSR 的缺点

  1. 服务器压力大

    • 每次请求都需要服务器进行渲染,增加了服务器的计算负担,尤其是在高并发场景下。
  2. 开发复杂度高

    • 需要配置服务器端渲染环境,处理服务器和客户端代码的兼容性问题,增加了开发难度。
  3. TTI(Time to Interactive,可交互时间)可能较长

    • 虽然首屏加载快,但页面需要等待 JavaScript 加载并完成 Hydration 后才能交互,可能导致 TTI 变长。
  4. 缓存难度大

    • 由于页面内容是动态生成的,缓存策略需要更复杂的设计。

SSR 的适用场景

  1. SEO 要求高的网站

    • 如新闻网站、博客、电商网站等,需要被搜索引擎良好索引的场景。
  2. 首屏加载速度要求高的应用

    • 如内容展示型网站,用户希望尽快看到页面内容。
  3. 需要兼容低性能设备的场景

    • 如移动端或低端设备,减少客户端的渲染压力。

SSR 的实现框架

  1. React

    • 使用 Next.js 或自定义 SSR 实现。
  2. Vue

    • 使用 Nuxt.js 或 Vue Server Renderer
  3. Angular

    • 使用 Angular Universal

SSR 是一种兼顾 SEO 和首屏性能的渲染方式,适合对 SEO 和首屏加载速度有较高要求的项目,但需要权衡服务器压力和开发复杂度。

其他常见渲染方式

  1. CSR(Client-Side Rendering,客户端渲染)

    • 页面内容在浏览器中通过JavaScript动态生成。
    • 服务器只发送一个基本的HTML文件,页面的渲染和数据的加载都在客户端完成。
    • 优点:减轻服务器负担,用户体验流畅(页面切换无需刷新)。
    • 缺点:首屏加载时间较长,SEO不友好。
  2. SSG(Static Site Generation,静态站点生成)

    • 在构建时生成静态HTML文件,用户请求时直接返回预渲染的页面。
    • 适合内容不频繁变化的网站(如博客、文档站点)。
    • 优点:加载速度快,SEO友好,服务器压力小。
    • 缺点:不适合内容频繁更新的场景。
  3. ISR(Incremental Static Regeneration,增量静态再生)

    • SSG的扩展,允许在构建后按需重新生成静态页面。
    • 可以设置页面重新生成的间隔时间,确保内容更新。
    • 优点:结合了SSG的速度和动态更新的能力。
    • 缺点:需要额外的配置,可能增加服务器复杂度。
  4. ESR(Edge Side Rendering,边缘渲染)

    • 在CDN边缘节点上完成页面渲染,减少延迟。
    • 适合全球分布的用户群体。
    • 优点:提升访问速度,减轻源服务器压力。
    • 缺点:实现复杂,依赖CDN服务。
  5. Hydration(混合渲染)

    • 结合SSR和CSR,服务器端渲染初始HTML,客户端接管后继续渲染交互部分。
    • 优点:兼顾首屏加载速度和交互体验。
    • 缺点:实现复杂,可能增加代码量。
  6. Prerendering(预渲染)

    • 在构建时为特定页面生成静态HTML,适合单页应用(SPA)。
    • 优点:提升首屏加载速度,SEO友好。
    • 缺点:不适合动态内容较多的场景。

每种渲染方式都有其适用场景,选择时需要根据项目需求(如性能、SEO、开发复杂度等)进行权衡。

总结

渲染方式技术栈(React)技术栈(Vue)技术栈(Angular)技术栈(Svelte)
CSRCreate React AppVue CLIAngular CLISvelteKit
SSGNext.js, GatsbyNuxt.js-SvelteKit
ISRNext.js---
ESRNext.js + VercelNuxt.js + Cloudflare--
HydrationNext.js, RemixNuxt.jsAngular UniversalSvelteKit
PrerenderingReact SnapVue Prerender PluginAngular Universal-
SSRNext.js, RemixNuxt.jsAngular UniversalSvelteKit

Vue 生态中的 SSR 解决方案

Nuxt

Nuxt 是一个构建于 Vue 生态系统之上的全栈框架,它为编写 Vue SSR 应用提供了丝滑的开发体验。更棒的是,你还可以把它当作一个静态站点生成器来用!我们强烈建议你试一试。

Nuxt与vue的关系

Nuxt.js 是基于 Vue.js 构建的一个更高层次的框架,它专注于简化开发过程并提高效率。Nuxt.js 提供了以下主要特性:

  1. 服务器端渲染 (SSR) :Nuxt.js 默认支持 SSR,这有助于提高搜索引擎优化(SEO)。
  2. 静态站点生成 (SSG) :Nuxt.js 还支持静态站点生成,生成纯 HTML 文件,适用于不需要频繁更新的内容。
  3. 路由自动配置:Nuxt.js 会根据项目的目录结构自动生成路由配置,无需手动编写路由规则。
  4. 模块化架构:Nuxt.js 提供了许多内置模块,如 Vuex、Vue Router 等,这些模块可以直接使用,无需额外安装。
  5. 热加载:开发过程中可以实现热加载,提升开发效率。
  6. 服务端功能:支持服务端功能,如中间件、插件等。
总结
  • Vue.js 是一个轻量级的前端框架,提供了构建现代 Web 应用所需的基本工具和功能。
  • Nuxt.js 是基于 Vue.js 构建的一个更高级别的框架,专注于简化开发流程,提供更多的默认配置和自动化功能,如 SSR、SSG 等。

简单来说,Vue.js 更像是一个基础框架,你可以根据自己的需求选择是否添加其他库(如 Vue Router、Vuex 等)。而 Nuxt.js 则是在 Vue.js 基础上提供了一整套解决方案,适合快速搭建复杂的应用。

Quasar

Quasar 是一个基于 Vue 的完整解决方案,它可以让你用同一套代码库构建不同目标的应用,如 SPA、SSR、PWA、移动端应用、桌面端应用以及浏览器插件。除此之外,它还提供了一整套 Material Design 风格的组件库。

Vite SSR

Vite 提供了内置的 Vue 服务端渲染支持,但它在设计上是偏底层的。如果你想要直接使用 Vite,可以看看 vite-plugin-ssr,一个帮你抽象掉许多复杂细节的社区插件。

来源参考: