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

Node 20.10+TypeScript5构建生产代码运行报错,求助解决

问题核心

你遇到的是TypeScript编译输出的模块格式与Node.js模块系统不兼容的问题:

  • 初始报错是因为Node默认将.js文件视为CommonJS模块,但编译后的代码用了ES模块的import语法,却没在package.json里声明模块类型。
  • 添加"type": "module"后报错,说明编译产物中仍存在CommonJS的exports语法,和ES模块环境冲突。
解决方案

方案一:统一使用ES模块(推荐,适配Node20+)

1. 调整package.json配置

确保package.json包含以下关键配置:

{
  "type": "module",
  "scripts": {
    "build": "tsc",
    "start": "node dist/你的入口文件名.js" // 替换为实际的编译后入口路径
  }
}

2. 修改tsconfig.json适配ES模块

更新编译选项,让TypeScript输出纯ES模块代码:

{
  "compilerOptions": {
    "module": "ESNext", // 或ES2020及以上版本,确保输出ES模块语法
    "moduleResolution": "bundler", // Node20+推荐使用该配置,也可选择Node16
    "target": "ES2020", // 匹配Node20原生支持的ES版本
    "outDir": "./dist",
    "esModuleInterop": true,
    "skipLibCheck": true,
    "strict": true,
    "resolveJsonModule": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

⚠️ 注意:module字段不能设为CommonJS,否则编译后会生成exports语法,和"type": "module"冲突。

3. 检查迁移文件语法

确保src/migrations/6204401116637-InitDatabase.ts只使用ES模块的import/export语法,不要混用module.exports或require。如果用了第三方迁移工具(比如TypeORM),需确认工具支持ES模块,同时工具的配置文件也要遵循ES模块规范。

4. 重新构建并运行

清理旧编译产物后重新构建:

rm -rf dist
npm run build
npm start

方案二:改用CommonJS(兼容旧代码场景)

如果不想切换到ES模块,移除package.json中的"type": "module",并修改tsconfig.json:

{
  "compilerOptions": {
    "module": "CommonJS",
    "moduleResolution": "Node",
    "target": "ES2020",
    // 其余选项保持不变
  }
}

这样TypeScript会把代码中的import/export编译成CommonJS的require/exports,Node就能正常识别运行。

内容的提问来源于stack exchange,提问作者HP . Htet Phyo Naing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:56:32