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

Next.js 13+如何修改默认构建类型为SSR并全局启用

问题描述

我在构建Next.js项目后,使用router.push进行页面导航时会出现深层页面加载的问题。经调研发现,将项目以Runtime或SSR方式构建即可解决该问题,但当前每次构建时Next.js默认采用静态(SSG)方式构建。请问如何在Next.js配置中修改默认构建方式,将所有页面设置为λ(Server)(运行时服务端渲染)模式?

当前构建输出(翻译后):

路由(app目录)                                大小     首次加载JS
┌ ○ /                                      12.1 kB         233 kB
├ ○ /about                                 159 B          78.5 kB
├ λ /course/[id]                           159 B          78.5 kB
├ ○ /profile                               159 B          78.5 kB
├ ○ /select-grade                          10.6 kB         206 kB
├ ○ /setting                               4.23 kB         131 kB
├ ○ /setting/about-us                      5.67 kB         129 kB
├ ○ /setting/appearance                    7.23 kB         124 kB
├ ○ /setting/edit-daily-goal               5.98 kB         222 kB
├ ○ /setting/notifications                 3.65 kB         132 kB
├ ○ /setting/store                         9.21 kB         340 kB
└ ○ /signup                                17.8 kB         161 kB
+ 所有页面共享的首次加载JS              78.3 kB
  ├ chunks/2443530c-e89e5a309bb1f246.js    50.5 kB
  ├ chunks/8139-d0a2f4f24604508c.js        24.7 kB
  ├ chunks/main-app-7b87f8e8be843a62.js    224 B
  └ chunks/webpack-2c24952a631fdb89.js     2.94 kB

路由(pages目录)                              大小     首次加载JS
─ ○ /404                                   182 B          87.5 kB
+ 所有页面共享的首次加载JS              87.3 kB
  ├ chunks/main-f380058e96bfe077.js        84.2 kB
  ├ chunks/pages/_app-6b94368279a02b5e.js  196 B
  └ chunks/webpack-2c24952a631fdb89.js     2.94 kB

ƒ 中间件                               23.4 kB

λ  (服务端)  运行时进行服务端渲染(使用getInitialProps或getServerSideProps)
○  (静态)  自动渲染为静态HTML(不使用初始props)

解决方案:全局设置所有页面为Server(λ)渲染模式

Next.js没有直接的全局配置项强制所有页面切换到Server模式,需针对**App Router(app目录)和Pages Router(pages目录)**分别处理:

1. 针对App Router(app目录)

全局生效方式

在app/layout.tsx(根布局文件)中导出dynamic配置为"force-dynamic",所有子页面会继承该配置,强制每次请求都在服务端渲染:

// app/layout.tsx
export const dynamic = "force-dynamic";

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="zh-CN">
      <body>{children}</body>
    </html>
  );
}

单页面生效方式

若仅需针对特定页面设置,在对应页面组件文件中单独导出dynamic配置:

// app/about/page.tsx
export const dynamic = "force-dynamic";

export default function AboutPage() {
  return <div>关于页面</div>;
}

2. 针对Pages Router(pages目录)

全局生效方式

在pages/_app.tsx中添加getInitialProps函数,可让所有页面默认使用服务端渲染(注:官方不推荐此方式,更建议逐个页面设置,但全局统一需求下可使用):

// pages/_app.tsx
function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />;
}

MyApp.getInitialProps = async ({ Component, ctx }) => {
  let pageProps = {};
  // 保留页面自身的getInitialProps逻辑(如果存在)
  if (Component.getInitialProps) {
    pageProps = await Component.getInitialProps(ctx);
  }
  return { pageProps };
};

export default MyApp;

单页面生效方式

在对应页面文件中导出getServerSideProps函数(空实现即可),即可将该页面标记为Server模式:

// pages/about.tsx
export async function getServerSideProps() {
  // 可在此添加服务端逻辑(如获取数据)
  return { props: {} };
}

export default function AboutPage() {
  return <div>关于页面</div>;
}

验证效果

重新运行npm run build,查看构建输出,所有页面标记会从○变为λ,说明已切换到Server运行时渲染模式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:43:12