TypeScript命令行工具动态导入模块失败求助
解决TypeScript动态导入模块路径解析问题
问题场景
开发TypeScript命令行工具时,代码从指定文件夹动态导入TypeScript模块,执行ts-node src/index.ts或ts-node --esm src/index.ts时,动态导入的contracts/CheckContract.ts尝试导入src/check/Check失败,报错Cannot find module 'src/check/Check',但相同代码在Jest单元测试中运行正常。
原因分析
Jest配置中通过modulePaths: ["<rootDir>"]将项目根目录加入了模块搜索路径,因此能正确解析以src/开头的绝对路径导入。但Node.js本身不识别TypeScript的baseUrl配置,ts-node默认也不会自动将tsconfig.json中的baseUrl映射为Node.js的模块搜索路径,导致运行时无法找到对应模块。
解决方案
方案1:使用tsconfig-paths辅助解析(推荐)
- 安装依赖包:
npm install --save-dev tsconfig-paths
- 运行命令时添加
tsconfig-paths/register钩子:
ts-node -r tsconfig-paths/register src/index.ts
- (可选)在
package.json中添加脚本简化操作:
{ "scripts": { "start": "ts-node -r tsconfig-paths/register src/index.ts" } }
之后直接运行npm start即可。
方案2:在tsconfig中配置ts-node自动加载钩子
修改tsconfig.json,添加ts-node配置项,让它自动启用tsconfig-paths:
{ "compilerOptions": { // 原有配置保持不变 }, "ts-node": { "require": ["tsconfig-paths/register"] }, "include": [/* 原有配置 */], "exclude": [/* 原有配置 */] }
配置完成后,直接运行ts-node src/index.ts即可正常解析路径。
方案3:临时使用NODE_PATH(不推荐)
通过设置NODE_PATH环境变量将项目根目录加入模块搜索路径:
NODE_PATH=. ts-node src/index.ts
注意:NODE_PATH在Node.js中已被标记为废弃,仅适合临时测试,不建议长期使用。
验证
执行对应命令后,动态导入的模块应能正确解析src/check/Check路径,不再出现MODULE_NOT_FOUND错误。
内容的提问来源于stack exchange,提问作者Árpád Magosányi
相关产品推荐
相关产品推荐

