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

尝试将TS文件编译为ESM却生成CJS,运行报错该如何解决?

报错原因与修复方案

报错原因

当你设置package.json的type: module后,Node.js会将所有.js文件视为ESM模块,但TypeScript编译输出的代码却包含CommonJS的exports语法,导致Node在处理时冲突:既把文件当作ESM,又遇到CJS的专属语法,从而抛出ReferenceError: exports is not defined。

核心问题在于:使用module: NodeNext时,TypeScript的模块编译行为依赖文件扩展名和package.json的type字段,但你的配置未让TypeScript正确生成符合ESM规范的代码,或TypeScript版本过低不支持NodeNext的完整逻辑。

修复步骤

  • 升级TypeScript版本:确保TypeScript版本在4.7.0及以上,NodeNext模块系统是该版本才正式引入的,低版本无法正确解析该配置。
  • 调整tsconfig.json配置:
    在compilerOptions中补充优化配置,确保生成标准ESM代码:
    {
      "compilerOptions": {
        "target": "es2020", // 提升目标版本,更好支持ESM特性
        "module": "NodeNext",
        "moduleResolution": "nodenext",
        "rootDir": "./src",
        "outDir": "./dist",
        "allowSyntheticDefaultImports": true,
        "esModuleInterop": true,
        "forceConsistentCasingInFileNames": true,
        "strict": true,
        "noImplicitAny": true,
        "strictNullChecks": true,
        "skipLibCheck": true
      }
    }
    
  • 规范源文件语法:所有.ts源文件使用ESM的导入导出语法(import/export),避免混用require/module.exports,否则TypeScript可能强制生成CJS代码。
  • 检查编译命令:执行编译时直接用tsc命令,不要添加覆盖配置的参数(比如--module commonjs),确保遵循tsconfig.json的设置。
  • 验证输出文件:编译完成后查看dist目录下的.js文件,确认代码使用export而非module.exports或exports语法。

内容的提问来源于stack exchange,提问作者soumyadeep.eth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:13:19