NestJS
Rspack 可以用于构建 NestJS 等 Node.js 应用。相比直接使用 tsc,Rspack 可以打包应用代码、通过 SWC 转译 TypeScript、支持开发阶段 HMR,并在需要时 external 运行时依赖。
如何使用
你可以参考当前文档,为已有 NestJS 项目手动添加所需的 Rspack 配置。rstack-examples 中的 NestJS example 也可作为参考,它包含完整的 rspack.config.mjs、开发脚本、生产构建脚本和 HMR 入口。
示例
rstack-examples 仓库包含了使用 Rspack 构建 NestJS 应用的完整示例。
安装依赖
安装 Rspack 以及 NestJS 示例中使用到的辅助依赖:
对于一个最小的 NestJS 应用,请照常安装 NestJS 运行时依赖:
基本概念
NestJS 应用运行在 Node.js 中,因此 Rspack 配置需要面向 Node.js runtime,并保留 NestJS 在运行时读取的框架 metadata。
- Node.js target(
target: 'node'):生成适用于 Node.js 而不是浏览器的产物。 - Decorator metadata:NestJS 依赖 TypeScript decorators 和生成的 metadata 来实现依赖注入、控制器、路由、守卫、拦截器等框架能力。
- External dependencies:服务端应用通常不需要把
node_modules中的所有包都打进 bundle。External 依赖可以减小 bundle 体积,并让 Node.js 在运行时正常加载依赖。 - Development HMR:开发环境下,Node.js 进程需要在 Rspack 重新构建服务端 bundle 后重启或接受更新。
配置 Rspack
以下配置改编自 NestJS 示例:
配置脚本
使用 rspack dev 进行开发,并使用 rspack build 进行生产构建:
dev:运行 Rspack Dev Server,将服务端 bundle 写入磁盘,并启动dist/main.js。build:创建不包含 HMR polling 入口的生产 bundle。start:使用 Node.js 运行生产产物。
配置 TypeScript decorators
NestJS 使用 @Module()、@Controller()、@Injectable()、@Get() 等 decorators。你需要配置 builtin:swc-loader 来解析 TypeScript decorators 并生成 decorator metadata:
如果项目同时运行 tsc,请在 tsconfig.json 中启用 experimentalDecorators 和 emitDecoratorMetadata,让 TypeScript 工具链和 Rspack 的 SWC 转换保持一致:
配置开发 HMR
只在开发入口中添加 @rspack/core/hot/poll;如果生产 bundle 中包含它,Node.js 应用会在运行时崩溃,因为 build mode 下不会启用 HMR:
由于服务端进程会从生成的 bundle 启动,因此需要启用 devServer.devMiddleware.writeToDisk:
在 NestJS bootstrap 文件中添加 HMR 处理,让旧的应用实例在接受更新前被关闭:
RunScriptWebpackPlugin 会在开发阶段启动生成的 main.js 文件:
External 依赖
使用 webpack-node-externals external node_modules 中的包:
开发环境下,HMR polling runtime 必须加入 allowlist,这样它会被打进服务端产物,而不是被当作外部依赖处理。
配置生产压缩
压缩 NestJS 服务端 bundle 时,需要保留 class name 和 function name。NestJS 的 execution context、metadata reflection 等机制可能依赖稳定的 class 和 handler function 引用。
Native node modules
当使用 Rspack 构建 Node.js 应用时,可能会碰到一些依赖包含 Node.js native addon 依赖(.node 模块)。因为 .node 模块无法打包进 JavaScript 产物里,所以通常需要特殊处理。可以使用 node-loader 处理 addon 的打包。

