React Router 预渲染的工作原理和价值(Pre-rendering)

核心概念解析

简单来说,预渲染 就是在构建时 (build time) ,提前将你网站的某些页面渲染成完整的静态 HTML 文件。

你可以把它想象成"预先烘焙蛋糕":

  • 传统客户端渲染 (CSR) :把面粉和鸡蛋(JS代码)给用户,让用户自己在家里的烤箱(浏览器)里烤蛋糕。用户需要等待。
  • 服务端渲染 (SSR) :用户每次下单,你都在后厨(服务器)现场烤一个新蛋糕给他。速度快,但服务器一直很忙。
  • 预渲染 (Pre-rendering) :你在开店前,就提前把最受欢迎的几款蛋糕(比如"关于我们"、"联系方式"页面)烤好放在货架上。用户一来,直接拿走,速度最快。

它做了什么?

在运行 npm run build 时,React Router 会:

  1. 找到你在 prerender 配置中指定的 URL 列表(如 ["/", "/about"])。
  2. 对于每个 URL,它会在构建环境中运行对应的 loader 函数,获取页面所需的数据。
  3. 用获取到的数据,将 React 组件渲染成一个静态的 [url].html 文件
  4. 同时,它还会把 loader 返回的数据单独存成一个数据负载文件([url].data ,供后续的客户端导航使用。

为什么要这么做?

主要有两个目的:

  1. 极致的性能:用户访问预渲染的页面时,浏览器直接接收到完整的 HTML,无需等待 JavaScript 下载和执行就能看到内容,首屏加载速度极快。
  2. 完美的 SEO:搜索引擎的爬虫可以直接抓取和索引静态的 HTML 内容,对 SEO 非常友好。

工作流程

typescript 复制代码
// react-router.config.ts
import type { Config } from "@react-router/dev/config";

export default {
  // 告诉构建工具,需要预渲染哪些路径
  async prerender() {
    // 也可以从 CMS 或数据库动态获取文章列表来生成路径
    const posts = await getPostsFromCMS();
    const postUrls = posts.map(post => `/blog/${post.slug}`);
    
    return ["/", "/about", "/contact", ...postUrls];
  },
} satisfies Config;

当你执行构建命令后,你的 build/client 目录下会生成类似这样的文件结构:

kotlin 复制代码
text
build/client/
├── index.html        # 对应 "/"
├── index.data        # 对应 "/" 的 loader 数据
├── about/
│   ├── index.html    # 对应 "/about"
│   └── index.data    # 对应 "/about" 的 loader 数据
└── ...其他文件

然后你只需要把整个 build/client 文件夹部署到一个静态文件托管服务(如 Netlify, Vercel, GitHub Pages)即可。


对比其他渲染策略

策略 渲染时机 后端需求 首屏性能 SEO
预渲染 (SSG) 构建时 不需要 (静态服务器) 最快 最佳
服务端渲染 (SSR) 请求时 (实时) 必须 (Node.js 服务器) 很快 很好
客户端渲染 (CSR) 浏览器中 (实时) 不需要 (静态服务器) 最慢 较差

两种主要应用模式

React Router 的预渲染非常灵活,可以和 ssr 配置结合使用:

1. 纯静态站点 (ssr: false)

这是最常见的用法。你告诉 React Router 不要启用运行时服务器,并将指定(或所有静态)路由都预渲染成 HTML。

typescript 复制代码
export default {
  ssr: false, // 禁用运行时 SSR
  prerender: true, // 预渲染所有能预渲染的静态路径
} satisfies Config;

优点:部署简单,成本极低,性能和 SEO 效果好。非常适合博客、文档站、公司官网等内容不常变的网站。

2. 混合模式 (ssr: true)

在这种模式下,你仍然部署一个 SSR 服务器,但对一些高频访问的静态页面(如首页)进行预渲染。

typescript 复制代码
export default {
  ssr: true, // 启用运行时 SSR
  prerender: ["/", "/about"], // 只预渲染这几个特定页面
} satisfies Config;

工作方式

  • 当用户访问 //about 时,服务器直接发送预先生成好的 HTML,速度极快。
  • 当用户访问其他动态页面(如 /dashboard/:userId)时,SSR 服务器会实时渲染页面。
    优点:结合了 SSG 的极致性能和 SSR 的动态灵活性。

总结

  • 预渲染 是在构建时生成静态 HTML 页面的技术。
  • 它使用 loader 在构建时获取数据,并将数据和页面内容"烘焙"到 HTML 中。
  • 主要优势是提升首屏性能优化 SEO
  • 特别适合那些不需要实时服务器渲染,可以部署在静态托管平台上的应用。
相关推荐
2501_920931706 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
0思必得07 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
摘星编程7 小时前
React Native鸿蒙版:Drawer抽屉导航实现
react native·react.js·harmonyos
东东5168 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino8 小时前
图片、文件的预览
前端·javascript
2501_920931709 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman052810 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔10 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李10 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN10 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化