You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:13:00