如何在使用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作为输出路径依据,需要在项目构建配置中显式声明:
- 打开
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 } } } }
- 同步调整
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"] }
- 检查根目录
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
相关产品推荐
相关产品推荐

