陷入exports未定义与require不支持ES模块的循环错误,求解决方案
解决ES模块与CommonJS循环兼容问题
你的问题根源是项目模块系统不统一,同时TypeScript编译配置和运行环境的模块规则冲突,导致在ES模块和CommonJS之间反复切换都报错。以下是两种可行的解决路径:
路径一:统一使用ES模块
- 保留
package.json中的"type": "module"配置,明确项目为ES模块环境 - 修改
tsconfig.json的编译配置,让输出和运行环境匹配:
{ "compilerOptions": { "target": "ES2020", // 选择更适配ES模块的目标版本,放弃ES5的老旧兼容 "module": "NodeNext", // 对齐Node.js的ES模块处理规则 "moduleResolution": "NodeNext", "lib": ["ES2020"], "sourceMap": true, "outDir": "./dist" // 指定编译输出目录,方便管理 }, "include": ["src/**/*"] // 确保所有源码文件被编译覆盖 }
- 适配代码与依赖:
- 将代码中所有
require()调用替换为ES模块的import语法 - 若必须使用CommonJS格式的依赖,用动态
import()语法加载,示例:const lodash = await import('lodash')
- 将代码中所有
路径二:统一使用CommonJS模块
- 移除
package.json中的"type": "module"配置,默认使用CommonJS环境 - 修改
tsconfig.json的编译配置,让TypeScript输出CommonJS格式代码:
{ "compilerOptions": { "target": "ES5", // 保留原目标版本需求 "module": "CommonJS", // 指定输出CommonJS模块格式 "moduleResolution": "Node", "lib": ["es2015"], "sourceMap": true, "outDir": "./dist" }, "include": ["src/**/*"] }
- 兼容ES模块风格导入(可选):
在tsconfig.json的compilerOptions中添加以下配置,允许用ES模块语法导入CommonJS依赖:
"allowSyntheticDefaultImports": true, "esModuleInterop": true
循环报错的原因
- 添加
"type": "module"后,Node.js将所有.js文件视为ES模块,此时代码或依赖中的require()属于CommonJS语法,自然不被支持 - 移除该配置后,Node.js默认采用CommonJS规则,但你的TypeScript编译输出是ES6模块(
module: ES6),CommonJS环境无法直接识别ES模块的export语法,因此报exports is not defined
内容的提问来源于stack exchange,提问作者pumpchief
相关产品推荐
相关产品推荐

