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
2
3
export default {
output: 'export'
}

然后执行:

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
2
3
export default {
output: 'standalone'
}

执行:

1
npm run build

构建结果会在 .next 下生成 standalone/(包含 server.js 和运行时需要的精简 node_modules)以及 static/(前端静态资源)。部署步骤:

  1. .next\standalone 整个目录拷到目标服务器(或容器镜像)。
  2. .next\static 拷到 standalone\.next\static
  3. public 拷到 standalone\public
  4. standalone 目录运行:
1
node server.js

示例 Windows 拷贝命令(可替换为 robocopy):

1
2
robocopy .next\static standalone\.next\static /E
robocopy public standalone\public /E

优点:

  • 只包含服务端运行必须的依赖,体积显著减小(示例:19MB)。
  • 部署更快,网络传输成本低。

限制与注意事项:

  • 目标环境仍需安装 Node.js。
  • standalone 会带上运行时必须的 native 模块和 server-side 依赖,但不是零依赖。
  • 若项目中有需要在构建时或运行时才安装的可选依赖,需额外处理。

总结

  • 纯前端静态站点(out / SSG)无需 node_modules,直接部署静态文件即可。
  • SSR/API 场景可以使用 standalone 来减少需要拷贝的依赖;否则需要在服务器安装完整依赖或拷贝 node_modules
  • 根据是否需要动态运行时(POST、cookies、headers、服务端 API)选择合适的输出模式。