如何为你的应用选择最佳渲染策略?

215 阅读14分钟

Web 渲染技术一直在不断发展,从简单的服务器渲染 HTML 页面到高度互动和动态的应用程序,呈现方式越来越多。

静态站点生成 (SSG)、服务器端渲染 (SSR)、客户端渲染 (CSR)、增量静态再生 (ISR) 以及实验性的部分预渲染 (PPR) 等技术,都是为了在各种情况下优化性能、SEO 和用户体验而开发的。

本文将探讨每种渲染策略的适用场景和优缺点,并展望内容交付的未来。

什么是渲染策略?

“渲染”这个词可能听起来很专业,但它的核心很简单:如何将代码转换成用户可以在浏览器中看到并与之交互的内容?

你可以把渲染策略想象成不同的做饭方式:

  • 提前做好所有菜(静态渲染)
  • 重新加热冷盘(增量静态重新验证)
  • 根据订单做菜(服务器端渲染)
  • 给顾客食材让他们自己做(客户端渲染)

每种方法都有其适用场景,具体取决于菜品类型和你想要营造的用餐体验。最好的餐厅会结合多种方法,以确保及时性、新鲜度和满足顾客的喜好。

不同的渲染策略适用于不同的应用。将它们结合起来可以帮助你平衡速度、数据新鲜度和交互性等因素。理解这些策略并不是要记住技术术语,而是要在正确的时间选择正确的工具,以创造最佳的用户(和开发者)体验。

每种渲染策略的定义

接下来,让我们详细探讨每种渲染方法,重点关注其理想的用例、优点和实现注意事项。

什么是静态站点生成 (SSG)?

SSG 在构建时预渲染页面,生成可以缓存在边缘服务器的静态 HTML 文件,从而快速高效地提供服务。

SSG 在构建时从源服务器获取动态数据并将其放入应用程序中。然后,用户在请求时获得所有快速、静态的数据。

理想的用例:

  • 内容很少变化的页面
  • 网站布局
  • 性能至关重要的营销页面
  • 文档或其他可以快速重建的网站

优点:

  • 最快的页面加载速度
  • 出色的 SEO 性能
  • 减少服务器负载
  • 最低的基础设施成本

实现注意事项:

  • 对于页面数量较多的网站,构建时间会增加
  • 内容更新需要重新构建和部署
  • 可以与客户端数据获取结合使用,以实现动态元素,但由于每个数据请求都会发起到服务器的新往返,因此这比服务器端获取要慢

最佳实践:

  • 对于经常更改的内容或构建时间较长的网站,考虑使用 ISR

什么是增量静态再生 (ISR)?

ISR 允许你在构建网站后更新特定页面,这意味着你无需重新构建即可获取新的缓存数据。这结合了静态生成的优点和扩展到数百万页面的能力。

增量静态再生比 SSG 构建速度快得多,然后使用第一个客户端请求缓存服务器数据,这意味着之后的每个请求都以与 SSG 相同的速度获取数据。然后可以按需重新验证数据。

理想的用例:

  • SSG 构建时间过长
  • 电商产品页面
  • 新网站
  • 大型内容网站

优点:

  • 保持 SSG 的快速页面加载速度
  • 允许按需更新内容,而无需完全重建
  • 高效扩展到大量页面
  • 在某些情况下比 SSR 更具成本效益

实现注意事项:

  • 仔细管理缓存失效策略
  • 了解 ISR 与缓存控制头的区别

最佳实践:

  • 优先考虑按需重新验证而不是基于时间的重新验证 - 几乎总是有一个 原因 来更改内容,而不是计时器
  • 对于用户错过缓存的情况,使用静态加载骨架 (React Suspense)

查看 ISR 的实际应用。

了解如何按需即时更新缓存内容,而无需重新部署。

查看演示

什么是服务器端渲染 (SSR)?

SSR 在每次请求时为页面生成完整的 HTML,允许实时数据和个性化内容。

服务器端渲染确保数据始终是新鲜的,但用户必须在每次请求时等待从服务器获取数据。

理想的用例:

  • 当你已经对大多数用户请求重新验证 ISR 时(即,你几乎总是需要最新数据)
  • 高度个性化的仪表盘页面
  • 社交媒体信息流
  • 实时数据可视化

优点:

  • 始终提供最新的内容
  • 比客户端获取更有利于 SEO 和数据加载时间

实现注意事项:

  • 加载速度比 SSG 或 ISR 慢
  • 首字节时间 (TTFB) 可能不足
  • 消耗更多服务器资源

最佳实践:

  • 为经常访问的数据实施高效的缓存策略(例如 Vercel KV)
  • 使用流式 SSR 来提高感知性能(这是 Next.js App Router 的默认行为)
  • 使用 React Suspense 在客户端等待服务器数据时渲染应用程序的静态部分
  • 优化数据库查询和 API 调用以减少渲染时间

查看 React 服务器组件的实际应用。

Next.js App Router 允许你选择默认情况下使用流式传输的更好的渲染模式。此模板可以向你展示如何操作。

查看演示

什么是客户端渲染 (CSR)?

CSR 依赖 JavaScript 在浏览器(用户设备)中渲染内容,提供高交互性和响应能力,但初始加载时间会受到影响。

重要的是,CSR 并不与任何其他渲染策略互斥。相反,它可以在它们之上使用,以增强现有功能。

理想的用例:

  • 用户与页面上需要立即反馈的元素进行交互,在这种情况下,JavaScript 可以提供比等待 SSR 中的服务器往返更快的响应。
  • 具有实时数据的管理仪表板,例如 Vercel Analytics 中的图表
  • 初始加载后的持续后台任务,例如 Notion 等应用程序,它在用户编写时将内容同步回服务器

优点:

  • 高度互动的用户体验
  • 应用程序状态之间的无缝转换
  • 与外部数据的实时交互

实现注意事项:

  • 由于 JavaScript 包需要在获取开始之前下载,因此初始加载速度可能会较慢
  • 优化核心 Web 指标可能具有挑战性
  • 需要在客户端仔细管理状态

最佳实践:

  • 依靠 Next.js 代码拆分 来减少初始包大小
  • 对初始加载使用服务器端渲染,然后进行水合以实现交互性(这有助于最大内容绘制 (LCP))

什么是部分预渲染 (PPR)?

虽然仍处于实验阶段,但 PPR 旨在自动优化渲染策略,从而简化开发决策。

它通过预渲染页面的任何静态部分,然后根据 React Suspense 边界流式传输动态内容来实现这一点。

你可以在一个页面中获得静态和动态的所有优势。


理想的用例:

PPR 是对其他渲染策略的增强。虽然它仍在开发中,但我们希望它成为你希望为任何 Next.js 应用程序默认开启的功能。

优点:

  • 即时页面加载(如 SSG)
  • 以有意义的顺序无缝地流式传输动态内容(增强 SSR)
  • 改进的性能和减少的开发开销

当前的注意事项:

  • 仍在研究和开发中
  • 可能需要代码重构才能选择加入

准备策略:

  • 在你的应用程序中开始绘制更好的 Suspense 边界,完全区分静态内容和动态内容

查看部分预渲染的实际应用。

部分预渲染结合了超快的静态边缘交付和完全动态的功能,我们相信它将成为 Web 应用程序的默认渲染模型。

查看演示

何时使用每种渲染策略?

在决定渲染策略时,请考虑以下因素:

  • 此内容多久更改一次? SSG 适用于静态内容,ISR 适用于定期更改的内容,SSR 或 CSR 最适合实时数据。尽可能多地依靠 SSG 和 ISR,并且仅在需要最新数据时才引入 SSR。(请注意,如今,CSR 几乎专门用于响应式交互,而不是获取外部数据。)
  • 页面是否对搜索引擎可见性至关重要? 即使谷歌可以渲染客户端 JavaScript,你的核心 Web 指标仍然是决定排名的主要因素。在静态渲染和服务器端渲染的页面上,比在客户端获取外部数据的页面上更容易实现健康的 CWV。
  • 需要多少用户交互? 如果你的页面大部分是静态的,交互最少,请依靠 SSG 或 ISR 加上少量客户端 JS。否则,你可能需要 SSR(以及客户端水合)。
  • 加载时间要求是什么? 为了尽可能快地进行初始加载,请使用 SSG 或很少失效的 ISR。为了平衡新鲜数据和速度,请使用 ISR 或 SSR(用于最新数据)。CSR 可以为你提供实时数据,但通常会牺牲初始加载时间。
  • 内容是否因用户而异? 如果你需要个性化内容,你可能会使用 SSR 或 CSR。ISR 可以在你可以缓存个性化内容的情况下工作,例如 Web 应用程序设置。SSG 不允许个性化。

使用 Next.js 进行渲染

随着 Web 应用程序的增长,你希望混合和匹配渲染策略,你需要一个灵活、强大的框架来处理所有这些策略。

Next.js 允许开发者在单个应用程序中根据需要按页使用不同的渲染方法。

Next.js 的主要优点包括:

  • 性能优化: 对图像、字体、脚本、代码拆分、数据获取等进行了内置优化。
  • 可扩展性: 可以轻松地从小型项目扩展到大型复杂应用程序。
  • 一致的组件架构: 在任何地方使用包含所有必需可重用数据的独立模块。与其他框架不同,数据不限于页面级获取。
  • 面向未来: 持续更新以支持新兴的 Web 标准和技术。这包括最近 PPR(实验性)背后的创新。

最重要的是,Next.js 允许你 按页选择渲染策略,为你提供 Web 上性能最佳的前端。

实际产品渲染策略

理论上理解渲染策略是一回事,但真正的价值在于在现实场景中有效地应用它们。

让我们探讨一下不同行业如何利用 Next.js 的组件级渲染方法来创建优化的、高性能的 Web 应用程序。

电商

电商平台需要在性能、SEO 和动态内容之间取得微妙的平衡。以下是不同渲染策略的应用方式:

静态站点生成 (SSG):

  • 主页布局和静态内容
  • 类别页面模板
  • 产品页面的静态部分(描述、规格)

增量静态再生 (ISR):

  • 定期更新的产品列表
  • 半频繁更改的产品页面(价格、库存状态)
  • 用户评论和评分(定期重新生成)

服务器端渲染 (SSR):

  • 搜索结果页面
  • 个性化产品推荐
  • 结账期间的实时库存检查

客户端渲染 (CSR):

  • 购物车功能
  • 产品图片库和缩放
  • 添加到购物车和心愿单交互

实现示例: 产品页面可以使用 SSR 并缓存服务器响应,使用 ISR 获取价格和库存信息(在后端这些信息发生变化时重新验证),使用动态 SSR 获取个性化推荐,使用 CSR 获取添加到购物车功能和图片库。很快,产品页面的布局和页面可以使用 PPR 进行静态渲染。

适合所有人的电子商务。

如果你需要查看实际应用,或者只是想参考最佳实践,请查看我们最新的 Next.js 商业模板。

立即部署

Web 应用

数据密集型应用程序(例如分析提供程序)需要静态性能和实时交互。以下是一种方法:

静态站点生成 (SSG):

  • 营销页面和文档
  • 仪表板模板和布局
  • 静态帮助内容和常见问题解答

增量静态再生 (ISR):

  • 定期报告和摘要(每日/每周更新)
  • 用户帐户设置页面
  • 账单和订阅信息页面

服务器端渲染 (SSR):

  • 实时数据可视化
  • 自定义报告生成
  • 用户身份验证流程

客户端渲染 (CSR):

  • 交互式数据探索工具
  • 实时数据过滤和排序
  • 仪表板自定义界面

实现示例: 仪表板可以使用 SSR 并缓存服务器响应以获取整体布局,使用 ISR 获取每日更新的摘要小部件(或用户点击刷新时),使用动态 SSR 获取实时数据源,使用 CSR 获取交互式数据探索工具。例如,这与 Vercel 的仪表板的工作方式类似。

全栈 AI 应用

AI 应用程序通常需要在静态内容和动态的、计算密集型功能之间取得平衡:

静态站点生成 (SSG):

  • 登陆页面和营销内容
  • 文档和教程
  • 针对常见查询的预计算模型输出

增量静态再生 (ISR):

  • AI 生成的答案的常见问题解答
  • AI 生成内容的画廊(定期刷新)
  • 用户提交的内容展示

服务器端渲染 (SSR):

  • 流式传输到用户的个性化 AI 模型响应
  • 用户特定的仪表板和设置

客户端渲染 (CSR):

  • 交互式 AI 模型参数调整
  • 实时输入处理(例如,文本、图像上传)
  • AI 生成内容的渐进式显示

实现示例: AI 图像生成应用程序可以使用 SSG 和实验性 PPR 作为主界面,使用 ISR 作为流行生成的画廊,使用 SSR 获取个性化结果和设置,使用 CSR 获取实时图像生成界面。

我们的旗舰 AI 应用。

我们使用 Next.js App Router 从头开始构建了 v0,以利用最佳的渲染模式。

访问 v0

使用部分预渲染 (PPR) 优化未来

虽然 PPR 仍在开发中,但值得考虑它将来如何简化这些架构:

  • 电子商务: PPR 可以自动优化产品页面,预渲染关键内容,同时将添加到购物车按钮等动态元素留给客户端渲染。
  • 仪表板: 可以部分预渲染组件,并在客户端填充实时数据的占位符。
  • AI: PPR 可能会预渲染应用程序外壳和常见的 AI 输出,同时为个性化、动态生成的内容留出空间。

为 PPR 做准备:

  1. 尽可能采用 React 服务器组件。
  2. 构建你的应用程序,在静态内容和动态内容之间进行清晰的区分。
  3. 使用 Suspense 边界为动态内容定义加载状态。

为你的应用程序选择合适的渲染策略

Web 渲染的演变反映了现代 Web 应用程序不断变化的需求。从传统的服务器端渲染到尖端技术,每种策略都为性能、用户体验和开发者生产力提供了独特的优势。

关键要点

  1. 组合策略: 最有效的应用程序通常会组合渲染方法来优化不同的组件。
  2. 性能至关重要: 正确的渲染策略会显著影响用户参与度和业务成果。
  3. 灵活性是关键: Next.js 等框架允许在单个应用程序中定制解决方案。
  4. 面向未来: 构建灵活的架构,以适应部分预渲染等新兴技术。
  5. 让数据引导你: 使用真实的性能指标来指导你的决策。

展望未来

在制定你的渲染策略时:

  1. 评估你的特定需求,并从最简单的有效解决方案开始。
  2. 持续衡量性能并根据数据进行迭代。
  3. 投资你的团队对现代渲染技术的了解。
  4. 随时了解 Web 开发的新兴趋势。

请记住,目标是创造最佳的用户体验,同时保持开发者的生产力和业务敏捷性。通过深思熟虑地应用这些策略,你将能够交付卓越的、面向未来的 Web 应用程序。