Next.js13 App目录页面均为SSR,Pages目录同名文件静态且首屏JS过大求助
问题解答
1. Pages目录下signupPage静态渲染的原因
App Router与Pages Router的默认渲染行为完全不同:
- App Router(你的
app/目录)默认采用React Server Components(RSC),所有页面默认都是SSR(标记为λ),除非显式配置静态生成(如使用generateStaticParams)。 - Pages Router(你的
pages/目录)默认是静态生成(SSG,标记为○),只有当页面文件中定义了getServerSideProps或getInitialProps时,才会触发SSR(标记为λ)。
你复制到pages/目录的signupPage没有添加服务端数据获取逻辑,所以Next.js默认按静态生成处理。
解决方法
在pages/signupPage.js中添加getServerSideProps函数(即使不需要传递数据,空函数也能触发SSR):
export async function getServerSideProps() { // 可在这里添加服务端逻辑,比如获取用户会话、初始化数据等 return { props: {} }; } export default function SignupPage() { // 原页面内容 }
2. 首屏JS体积偏大的分析与优化
从路由分析数据来看,App Router的共享chunk(First Load JS shared by all)达到78.5kB,部分页面首屏JS超过250kB,主要原因和优化方向如下:
核心问题定位
- 共享chunk冗余:
chunks/bce60fc1-28f7ce62d8891bb3.js占50.5kB,是最大的共享依赖。需排查是否引入了未使用的库、全量导入的UI组件或冗余的工具函数。 - 客户端组件过度使用:App Router中
'use client'标记的组件会被打包到客户端JS中,如果大量非交互逻辑放在客户端组件,会显著增加体积。 - 国际化打包冗余:路由包含
[locale]参数,若国际化方案未做按需加载,可能将所有语言包一次性打包进客户端。 - 依赖树未优化:存在未使用的依赖、重复依赖,或某些库未开启Tree Shaking。
优化步骤
- 生成可视化体积报告:运行
next build --analyze,通过Webpack Bundle Analyzer直观查看体积大的模块,定位冗余代码。 - 优先使用服务端组件:将不需要交互的逻辑(如静态内容、数据获取)放在无
'use client'标记的组件中,仅对需要交互的部分(如表单、按钮)使用客户端组件。 - 按需导入依赖:替换全量导入为按需导入,例如:
// 不好的写法:全量导入UI库 import { Button, Card, Input } from 'antd'; // 好的写法:按需导入 import Button from 'antd/es/button'; import Card from 'antd/es/card'; - 优化国际化配置:确保语言包按需加载,避免一次性打包所有语言资源。
- 清理冗余代码:使用ESLint插件(如
eslint-plugin-unused-imports)移除未使用的导入和变量,删除未使用的依赖。 - 动态导入客户端组件:对非首屏必需的客户端组件,使用
next/dynamic延迟加载:import dynamic from 'next/dynamic'; const HeavyComponent = dynamic(() => import('../components/HeavyComponent'), { ssr: true, loading: () => <div>Loading...</div> });
内容的提问来源于stack exchange,提问作者Fares Harmali
相关产品推荐
相关产品推荐

