Node/TypeScript中无扩展名导入ESM模块报错求助
Node/TypeScript转ESM后出现ERR_MODULE_NOT_FOUND的解决方案
- 让TypeScript生成带后缀的ESM导入路径
ESM要求本地模块导入必须带完整文件后缀(比如.js),TypeScript在nodenext/node16模式下需正确配置才能自动生成符合要求的导入:
修改tsconfig.json的关键配置:
{ "compilerOptions": { "module": "nodenext", "moduleResolution": "nodenext", "target": "ES2020", "rootDir": "./src", "outDir": "./dist", "esModuleInterop": true, "allowSyntheticDefaultImports": true }, "include": ["src/**/*"] }
同时在TS源码里导入本地模块时,建议显式加.ts后缀(编译后会自动转为.js):
// 原写法 import { app } from './app'; // 修改为 import { app } from './app.ts';
验证编译产物
执行npm run build后,检查dist/index.js里的导入语句是否带有.js后缀。如果还是无后缀的./app,要确认TypeScript版本在4.7以上(nodenext是TS4.7新增特性),且tsconfig.json里的module和moduleResolution确实设为了nodenext。调整package.json与启动脚本
确保package.json里的"type": "module"在顶层位置:
{ "name": "transaction-analyzer", "type": "module", "scripts": { "build": "rimraf ./dist && tsc", "start": "npm run build && node ./dist/index.js", "start:dev": "nodemon --exec 'node --loader ts-node/esm src/index.ts'", "lint": "eslint --fix src/**/*.ts", "test": "jest --config ./jest.config.js" } // 其他配置项 }
注意start:dev脚本的修改:用ts-node/esm加载器直接运行TS源码,避免nodemon默认用CommonJS模式加载。
- 处理Jest的ESM兼容(如果测试报错)
如果运行测试也出现ESM相关问题,修改jest.config.js适配ESM:
export default { preset: 'ts-jest/presets/default-esm', testEnvironment: 'node', extensionsToTreatAsEsm: ['.ts'], moduleNameMapper: { '^(\\.{1,2}/.*)\\.ts$': '$1', }, transform: { '^.+\\.tsx?$': ['ts-jest', { useESM: true }], }, };
内容的提问来源于stack exchange,提问作者Hantsy
相关产品推荐
相关产品推荐

