NX项目手动构建后运行报错:无法找到@my-project/server模块
解决NX项目手动运行dist/main.js时模块找不到的问题
问题根源
nx start会自动处理tsconfig.json里的paths别名,把@my-project/server这类别名转成实际文件路径,所以能正常启动- 直接跑
node dist/main.js时,Node.js不认TS的paths配置,编译后的代码里还留着这些别名,自然找不到对应的模块
解决办法
办法1:用NX官方的运行命令(最省心)
NX本身就有运行构建产物的命令,直接执行:
nx serve my-project --prod
或者针对已构建好的产物,也可以用:
nx run my-project:serve:production
这个命令会自动处理别名解析,和nx start的运行逻辑一致,不用自己折腾。
办法2:手动用工具处理别名(适合自定义部署)
- 先装依赖,用
tsconfig-paths来解析别名:
npm install tsconfig-paths --save-dev
- 在项目根目录新建
start-dist.js文件,内容如下:
const { resolve } = require('path'); const { register } = require('tsconfig-paths'); // 加载项目根目录的tsconfig配置 const tsConfigPath = resolve(__dirname, 'tsconfig.json'); register({ baseUrl: './dist', // 指向构建产物的根目录 paths: { '@my-project/server': ['./server/src'], '@my-project/config': ['./config/src'] } }); // 启动构建后的main.js require('./dist/my-project/main.js');
- 运行这个脚本就行:
node start-dist.js
办法3:构建时直接替换别名(一劳永逸)
修改项目的project.json里的build配置,让编译时就把别名换成实际路径:
- 先装
@nrwl/js(如果没装的话):
npm install @nrwl/js --save-dev
- 打开
project.json,找到targets.build.options,添加transformer配置:
"assets": [ // 保留你原来的assets配置 ], "transformers": [ "@nrwl/js/plugins/tsconfig-paths-transformer" ]
重新跑nx build,这次编译后的代码里的别名会被替换成相对路径,之后直接node dist/main.js就能正常运行了。
验证
执行对应办法的命令后,看是否还会出现Cannot find module '@my-project/server'的错误,服务能正常启动就算解决了。
内容的提问来源于stack exchange,提问作者ifso
相关产品推荐
相关产品推荐

