正文Next.js 15 的 App Router 默认采用 RSC 流式渲染,结合 Suspense 可将昂贵数据段延后,同时保证主框架快速可见。本文给出边界拆分与数据治理示例。
一、边界拆分与数据策略// app/page.tsx (Server Component)
import { Suspense } from 'react'
async function fetchTop() {
const r = await fetch('https://api.example.com/top', { next: { revalidate: 120, tags: ['top'] } })
return r.json()
}
async function fetchHeavy() {
const r = await fetch('https://api.example.com/heavy', { next: { revalidate: 600, tags: ['heavy'] } })
return r.json()
}
async function TopSection() {
const data = await fetchTop()
return <section><h2>Top</h2><pre>{JSON.stringify(data)}</pre></section>
}
async function HeavySection() {
const data = await fetchHeavy()
return <section><h2>Heavy</h2><pre>{JSON.stringify(data)}</pre></section>
}
export default async function Page() {
return (
<main>
<Suspense fallback={<div>加载主内容...</div>}>
{/* 轻量段优先渲染 */}
{/* Server Component:无客户端包体负担 */}
{/* 在 RSC 流中逐步输出 */}
{/* TopSection 先行 */}
{/* HeavySection 置于独立 Suspense,避免阻塞 */}
{/* 也可将多个昂贵段各自包裹 */}
{/* 边界与数据策略配合 revalidate tags */}
{/* 提升整体流畅性 */}
{/* 以上注释为解释用途,实际可移除 */}
<TopSection />
</Suspense>
<Suspense fallback={<div>次级数据加载中...</div>}>
<HeavySection />
</Suspense>
</main>
)
}
二、治理要点数据分层:主框架与轻量数据置顶,昂贵数据单独 Suspense;避免大块内容阻塞首屏。缓存策略:为各段设置不同的 `revalidate` 与 `tags`,便于定向刷新与复用。客户端边界:尽量在 Server Components 完成数据获取与渲染,减少客户端包体与水合压力;交互再使用 Client Components。

发表评论 取消回复