You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让子Server Component动态渲染且页面其余部分静态SSR?

问题场景

现有以下Next.js组件代码:

layout.tsx

export default function Layout({children}: any) {
  return <div>
      {children}
  </div>
}

page.tsx

export const dynamic = "force-dynamic";

const DynamicChild = dynamic(() => import("@/DynamicChild"), {
    ssr: true,
})

export default function Page({children}: any) {
  return <div>
      <DynamicChild />  
  </div>
}

DynamicChild.tsx

export default function DynamicChild() {
  return <div>
      {process.env.imporantEnvVar ? "cat": "dog"}  
  </div>
}

当前给页面添加force-dynamic后,DynamicChild能正常动态渲染,但我们希望页面除DynamicChild外的内容在构建时静态生成,同时所有组件保持服务器端渲染,该如何调整?


解决方案

1. 移除页面级全局动态配置

删掉page.tsx中的export const dynamic = "force-dynamic";,让页面默认采用静态生成(SSG)策略,这样页面的非动态部分会在构建时完成渲染。

2. 单独让DynamicChild实现请求时服务器渲染

在DynamicChild组件中使用Next.js的noStore()方法禁用缓存,强制该组件在每次用户请求时都在服务器端重新渲染,确保读取到最新的运行时环境变量:

修改后的DynamicChild.tsx:

import { noStore } from 'next/cache';

export default function DynamicChild() {
  // 禁用组件缓存,强制每次请求都在服务器端重新渲染
  noStore();
  
  return <div>
      {process.env.imporantEnvVar ? "cat" : "dog"}  
  </div>
}

修改后的page.tsx:

const DynamicChild = dynamic(() => import("@/DynamicChild"), {
    ssr: true,
})

export default function Page({children}: any) {
  return <div>
      <DynamicChild />  
  </div>
}

效果说明

  • 页面的其他静态内容(若有)会在构建时生成静态HTML,提升首屏加载速度。
  • DynamicChild组件会在每个用户请求时在服务器端执行渲染,读取运行时环境变量并返回对应内容,全程保持服务器端渲染,无需客户端 hydration。

内容的提问来源于stack exchange,提问作者WawaBrother

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:43:33