构建
NestJS 默认用 tsc 编译,项目变大后全量编译动辄 30s+。SWC(Rust 编写)可将编译提速约 20 倍,是开发体验与 CI 效率的关键优化。
SWC 高速编译
pnpm add -D @swc/cli @swc/core
// .swcrc
{
"$schema": "https://swc.rs/schema.json",
"sourceMaps": true,
"jsc": {
"parser": {
"syntax": "typescript",
"decorators": true
},
"transform": {
"legacyDecorator": true,
"decoratorMetadata": true
},
"baseUrl": "./",
"keepClassNames": true
},
"minify": false
}
// package.json
{
"scripts": {
"build": "nest build -b swc",
"start:dev": "nest start -b swc --watch --type-check"
}
}
装饰器元数据必须显式开启
NestJS 的依赖注入依赖 emitDecoratorMetadata,.swcrc 中 legacyDecorator + decoratorMetadata 缺一不可,否则启动时全部注入失效。这是 SWC 迁移的最高频事故点。
SWC 不做类型检查
SWC 只转译、不校验类型,类型错误会被静默放过。两条防线必须同时存在:
- 开发时:
nest start -b swc --watch --type-check,后台并行tsc --watch实时报类型错误 - CI 门禁:独立的
pnpm run typecheck(tsc --noEmit)阶段——本项目 CI 流水线 已内置
路径别名需在 .swcrc 同步声明
若使用 @/ 等路径别名,tsconfig.json 的 paths 对 SWC 不生效,必须在 jsc.paths 中再声明一次:
{
"jsc": {
"baseUrl": "./",
"paths": {
"@/*": ["./src/*"]
}
}
}
开发模式
日常开发使用 SWC watch:保存即整进程重启,毫秒级。
nest start -b swc --watch --type-check
与 CI / Docker 的关系
镜像构建走 Docker 多阶段(builder 阶段执行 pnpm run build,即 nest build -b swc),CI 只触发 docker build: