Typescript ESM模块解析在nodemon开发环境中失效问题
解决方案:区分开发/生产环境的路径映射配置
核心问题是共用一套TS配置导致开发和生产的路径映射冲突,以下是具体解决步骤:
1. 拆分TS配置文件
将公共配置和环境专属配置分离,避免路径映射冲突:
基础配置文件 tsconfig.base.json
存放所有环境共用的配置:
{ "compilerOptions": { "target": "ESNext", "module": "NodeNext", "moduleResolution": "NodeNext", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": ["src/**/*"], "exclude": ["node_modules", "build"] }
开发环境配置 tsconfig.dev.json
扩展基础配置,将路径映射指向src,同时配置ts-node的ESM支持:
{ "extends": "./tsconfig.base.json", "compilerOptions": { "paths": { "#src/*": ["./src/*"] }, "ts-node": { "esm": true, "require": ["tsconfig-paths/register"] } } }
生产环境配置 tsconfig.prod.json
扩展基础配置,将路径映射指向构建后的build目录:
{ "extends": "./tsconfig.base.json", "compilerOptions": { "paths": { "#src/*": ["./build/*"] }, "outDir": "./build" } }
2. 调整nodemon启动命令
让nodemon明确使用开发环境的TS配置,确保ts-node加载正确的路径规则:
修改package.json的scripts:
{ "scripts": { "start:dev": "nodemon --exec 'ts-node --project tsconfig.dev.json' src/index.ts", "build": "tsc --project tsconfig.prod.json" } }
或者创建独立的nodemon.json配置文件:
{ "watch": ["src"], "ext": "ts,json", "exec": "ts-node --project tsconfig.dev.json src/index.ts" }
3. 配置package.json的条件imports
Node.js的ESM规范支持条件导入,在package.json中添加环境区分的映射,确保Node.js层面也能正确解析路径:
{ "type": "module", "imports": { "#src/*": { "development": "./src/*", "production": "./build/*" } } }
4. 安装必要依赖
确保安装tsconfig-paths来辅助ts-node在ESM模式下处理路径映射:
npm install tsconfig-paths --save-dev
完成以上配置后,运行npm run start:dev时,nodemon会通过ts-node加载开发环境的TS配置,路径映射指向src目录;生产构建后,TS配置和package.json的imports都会指向build目录,解决模块找不到的问题。
内容的提问来源于stack exchange,提问作者Hamed
相关产品推荐
相关产品推荐

