You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:43:17