NX单体仓库中SWC构建NestJS应用未打包libs代码的配置问题
解决SWC打包NestJS单体仓库时合并libs源码的问题
问题根源
SWC不像Webpack会自动递归打包所有依赖源码,默认只处理当前项目目录的文件,对monorepo里libs目录的引用会保留原相对路径,导致运行时找不到已编译的模块,直接抛出“cannot find module”错误。
分步解决配置
1. 修正TSConfig的路径与范围
根目录和项目目录的tsconfig.json都得配置到位,让TypeScript和SWC都能识别libs的位置:
- 根目录
tsconfig.json:
{ "compilerOptions": { "baseUrl": ".", "paths": { "@lib/*": ["libs/*"] } } }
- 项目目录(
services/monolith/tsconfig.json):
{ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "./dist", "rootDir": "./src", "paths": { "@lib/*": ["../../libs/*"] } }, "include": ["src/**/*", "../../libs/**/*"] }
重点是把libs/**/*加入include,强制TS和SWC把libs源码纳入编译流程。
2. 配置SWC的解析与编译规则
修改根目录的.swcrc,补上路径映射和完整解析配置:
{ "$schema": "https://json.schemastore.org/swcrc", "jsc": { "parser": { "syntax": "typescript", "decorators": true }, "transform": { "legacyDecorator": true, "decoratorMetadata": true }, "baseUrl": ".", "paths": { "@lib/*": ["libs/*"] } }, "module": { "type": "commonjs", "resolveFully": true }, "include": ["services/monolith/src/**/*", "libs/**/*"], "exclude": ["node_modules"] }
resolveFully: true:让SWC把所有模块路径解析成绝对路径,避免运行时相对路径出错。include包含libs目录:确保SWC编译libs源码,而不是直接引用原TS文件。
3. 调整构建命令
在项目package.json里修改build命令,直接把libs目录加入编译输入:
{ "scripts": { "build": "swc services/monolith/src libs -d services/monolith/dist" } }
这样SWC会把libs的代码编译到项目的dist目录,保持目录结构一致,运行时就能找到对应模块。
4. 统一导入方式
项目代码里全部用别名@lib/xxx导入libs模块,比如:
import { ConfigModule } from '@lib/config/config.module';
别再用../../../libs/xxx这种相对路径,避免SWC解析混乱。
排查要点
- 确保用的是最新稳定版SWC,旧版本对paths的支持有bug。
- 检查
.swcrc的exclude规则,别不小心把libs排除了。 - 每次构建前清空dist目录,避免缓存干扰。
内容的提问来源于stack exchange,提问作者SebastianG
相关产品推荐
相关产品推荐

