Next.js Partial Prerendering 与 Streaming 渲染实践概述Partial Prerendering(PPR)通过静态外壳 + 动态片段流式填充提升首屏与交互体验。结合 `Suspense` 与路由级 `dynamic/revalidate`,可在保证一致性的同时获得更好的 TTFB 与 INP 指标。关键参数/概念- `export const dynamic`: 路由/页面级渲染策略(`'force-static''force-dynamic'`)。`export const revalidate`: 静态片段的再验证周期(秒)。`Suspense`: 将动态数据片段以流式方式在外壳渲染后逐步填充。`fetch` 缓存:`cache/no-store` 与 `next.revalidate/tags` 控制片段级一致性与刷新。实践/示例// app/page.tsx(静态外壳 + 动态片段) export const dynamic = "force-static"; export const revalidate = 60; import { Suspense } from "react"; import PopularList from "./popular-list"; export default async function Home() { return ( <main> <h1>首页(静态外壳)</h1> <Suspense fallback={<p>热点数据加载中...</p>}> {/* 动态片段:以流式填充 */} <PopularList /> </Suspense> </main> ); } // app/popular-list.tsx(Server Component 动态片段) async function getPopular() { const res = await fetch("https://api.example.com/popular", { cache: "no-store", // 动态片段强一致 }); return res.json(); } export default async function PopularList() { const items = await getPopular(); return ( <ul> {items.map((it: any) => ( <li key={it.id}>{it.title}</li> ))} </ul> ); } 验证方法TTFB/首屏:在 DevTools Performance 与 Lighthouse 下对比 `force-static + Suspense` 与全动态的时序差异。一致性:将动态片段改为 `cache: 'force-cache' + next.revalidate`,验证刷新周期与用户感知差异。边界测试:在片段内抛错/超时,验证 `Suspense fallback` 与错误边界呈现。注意事项保持静/动态边界清晰:静态外壳不得引用请求时态数据;动态片段需保证错误隔离。CDN/缓存协作:静态外壳可走 CDN 缓存;动态片段走源站流式更新与短期再验证。

发表评论 取消回复