用途:整理 Remix v2 的性能、流式渲染、缓存与服务器/客户端拆分实践,适合在配置 HTTP 缓存、仅服务端模块、hydration 安全或预取时参考。
主要能力: 一、流式渲染:用 defer() 传未解析 Promise,配合 <Suspense> 与 <Await>。注意传入 defer 的 Promise 必须在 loader 中任何 await 之前创建,否则仍会阻塞;<Await> 必须配 errorElement,否则被拒绝的 Promise 会冒泡到路由 ErrorBoundary。 二、HTTP 缓存:通过 headers 导出控制文档响应,通过 loader 返回头控制 ?_data= 数据请求。max-age 控浏览器,s-maxage 控 CDN,stale-while-revalidate 允许后台刷新。父子路由合并遵循“最深路由优先”,子路由合并时应取更小的 max-age,避免放宽父级缓存策略。个性化子路由的布局不要定义 headers。 三、服务器/客户端拆分:导入 node:*、prisma、bcrypt 等或读取 process.env 的模块应命名为 *.server.ts(目录形式需 Remix Vite 插件),泄漏到客户端会构建失败。公共环境变量应通过 root loader 的 window.ENV 传递。 四、clientLoader/clientAction:默认不在初始 hydration 运行,需 clientLoader.hydrate = true 并导出 HydrateFallback。 五、hydration 安全:useHydrated() 首次渲染返回 false;SSR 禁用组件用 <ClientOnly>;ID 用 useId(),避免 Math.random()、Date.now() 等。 六、预取:<Link prefetch> 有 none/intent/render/viewport 四种模式。长列表不要用 render;敏感或有副作用的链接用 none。预取会生成 <link rel=prefetch> 兄弟标签,CSS 中应使用 :last-of-type。缺失 Cache-Control 时 hover 预取会翻倍请求,可在 loader 检测 Purpose: prefetch 并返回 private, max-age=10。
使用方式:按文档中的类型签名与约定编写 loader、headers、clientLoader,并在路由模块中组合 defer、<Await>、<Link prefetch> 与 links 导出。
限制:Remix v2 无内置图片优化器,需构建时用 sharp、unpic、remix-image 等处理并设置宽高;目录形式 .server/ 仅 Remix Vite 插件支持,Classic Compiler 只用文件名后缀。具体 API 行为以官方文档为准,本资料未提供收费与平台信息。