尝试将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
相关产品推荐
相关产品推荐

