NestJS Packaging: Default vs Static
1. 默认打包(Default build)
运行:
1 | npm run build |
打包完成后常见的部署方式是将下列内容拷贝到服务器:
.next
目录node_modules
(完整依赖)public
目录package.json
然后在服务器上安装 Node.js 并运行:
1 | npm run start |
这种方式部署简单,但要拷贝完整的 node_modules
,在大型项目中会导致部署包很大(例:整个项目 356MB,node_modules 占 303MB)。如果删除 node_modules
,服务将无法启动,因为服务端运行时依赖缺失。
2. 静态导出(Static export / out
)
适用于只使用 Next.js 静态页面且不依赖 server-side API 的场景。
在 next.config.mjs
中设置:
1 | export default { |
然后执行:
1 | npm run build |
会在项目根生成 out/
目录(纯静态文件)。将 out
部署到静态服务器或通过 Nginx/CDN 提供即可。静态站点无需拷贝 node_modules
。
注意:如果页面使用了动态接口或强制动态(如 export const dynamic = 'force-dynamic'
、或依赖 POST、cookies/headers 等运行时行为),则无法完全静态导出,会产生冲突或缺失动态逻辑。
3. Standalone(单独部署,可减少依赖体积)
当项目包含 SSR 或 server API,但你希望减小部署体积时,可使用 output: 'standalone'
:
1 | export default { |
执行:
1 | npm run build |
构建结果会在 .next
下生成 standalone/
(包含 server.js
和运行时需要的精简 node_modules
)以及 static/
(前端静态资源)。部署步骤:
- 将
.next\standalone
整个目录拷到目标服务器(或容器镜像)。 - 将
.next\static
拷到standalone\.next\static
。 - 将
public
拷到standalone\public
。 - 在
standalone
目录运行:
1 | node server.js |
示例 Windows 拷贝命令(可替换为 robocopy
):
1 | robocopy .next\static standalone\.next\static /E |
优点:
- 只包含服务端运行必须的依赖,体积显著减小(示例:19MB)。
- 部署更快,网络传输成本低。
限制与注意事项:
- 目标环境仍需安装 Node.js。
standalone
会带上运行时必须的 native 模块和 server-side 依赖,但不是零依赖。- 若项目中有需要在构建时或运行时才安装的可选依赖,需额外处理。
总结
- 纯前端静态站点(
out
/ SSG)无需node_modules
,直接部署静态文件即可。 - SSR/API 场景可以使用
standalone
来减少需要拷贝的依赖;否则需要在服务器安装完整依赖或拷贝node_modules
。 - 根据是否需要动态运行时(POST、cookies、headers、服务端 API)选择合适的输出模式。