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

如何在使用NX(tsc)转译时移除src目录实现扁平化输出?

NX构建类库移除输出目录多余src层级的解决方案
  • NX搭建的lib项目构建后输出目录存在多余src嵌套,实际结构为dist/core/src
  • 包安装后导入必须带src前缀,即import { XService } from '@magnetarise/src/services';,期望路径为import { XService } from '@magnetarise/services';
  • 直接修改packages/core/tsconfig.lib.json中的rootDir为src不生效,核心原因是NX的构建executor有独立配置,会覆盖tsconfig中的部分推导规则。

方案1:使用@nx/js:tsc(含旧版@nrwl/js:tsc)作为构建执行器

这是改rootDir不生效的最常见场景,tsc执行器不会直接读取tsconfig里的rootDir作为输出路径依据,需要在项目构建配置中显式声明:

  1. 打开packages/core/project.json,找到targets.build.options节点,新增rootDir配置:
{
  "targets": {
    "build": {
      "executor": "@nx/js:tsc",
      "options": {
        "outputPath": "dist/core",
        "main": "packages/core/src/index.ts",
        "tsConfig": "packages/core/tsconfig.lib.json",
        // 新增以下配置,指定构建源文件根目录
        "rootDir": "packages/core/src",
        "updateBuildableProjectDepsInPackageJson": true
      }
    }
  }
}
  1. 同步调整packages/core/tsconfig.lib.json配置,确保文件扫描范围正确:
{
  "extends": "../../tsconfig.base.json",
  "compilerOptions": {
    "outDir": "../../dist/core",
    "rootDir": "./src"
  },
  // 仅包含src下的业务文件,不要把其他层级的配置文件纳入扫描范围,否则rootDir会被自动推导到上层目录导致src层级重现
  "include": ["src/**/*.ts"],
  "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"]
}
  1. 检查根目录tsconfig.base.json中的路径映射,确保开发环境的路径别名和期望的导入规则一致:
{
  "compilerOptions": {
    "paths": {
      "@magnetarise": ["packages/core/src/index.ts"],
      "@magnetarise/*": ["packages/core/src/*"]
    }
  }
}

方案2:使用rollup/vite作为构建执行器

如果用的是@nx/rollup:rollup、@nx/vite:build这类打包类执行器,不需要调整rootDir,直接通过构建器的导出配置生成正确的路径映射即可:
打开packages/core/project.json的构建配置项,新增如下参数:

{
  "targets": {
    "build": {
      "executor": "@nx/rollup:rollup",
      "options": {
        "outputPath": "dist/core",
        "entryFile": "packages/core/src/index.ts",
        "tsConfig": "packages/core/tsconfig.lib.json",
        // 自动生成package.json的exports字段,对齐子路径导入规则
        "generateExportsField": true,
        // 有多少个子路径需要直接导入,就把对应入口加到这个数组里
        "additionalEntryPoints": [
          "packages/core/src/services/index.ts",
          "packages/core/src/utils/index.ts"
        ]
      }
    }
  }
}

构建完成后会自动在输出的package.json中生成不带src前缀的路径映射,导入时不需要额外加src层级。

验证方法

  • 先清空旧构建缓存:执行nx reset,手动删除根目录下的dist文件夹
  • 重新构建目标包:nx build core
  • 检查dist/core目录结构,正常应该直接展示services、utils等业务文件夹,不存在嵌套的src目录
  • 本地验证可以进入dist/core目录执行npm link,在测试项目中link该包后,测试import { XService } from '@magnetarise/services'是否能正常解析。

避坑:不要手动修改dist目录下的文件结构,或者强行改outDir绕开src层级,NX每次构建都会清空输出目录,临时修改的内容会被覆盖,必须从构建配置层面调整才能永久生效。

内容的提问来源于stack exchange,提问作者Geoffrey Migliacci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:16:17