Node.js import/require加载ESM模块报错如何解决
问题根因
两个报错本质是Node.js两种模块规范的兼容冲突:
- 首次用
import报Cannot use import statement outside a module,是因为项目默认被识别为CommonJS(CJS)模块,CJS环境不原生支持ESM静态import语法 - 换
require后报ERR_REQUIRE_ESM,是因为@berkelium/nlp-core是纯ESM包,包内声明了"type": "module",不支持被CJS的require()语法加载。
解决方案
二选一即可,优先选方案1,适配成本最低。
方案1:将项目切换为ESM规范(推荐)
操作步骤:
- 打开项目根目录的
package.json,新增"type": "module"配置,示例:
{ "name": "your-project-name", "version": "1.0.0", "type": "module", // 其余原有配置保持不变 }
- 将
index.js中的引入代码恢复为ESM写法:
import { bkLabs } from '@berkelium/nlp-core';
- 适配ESM环境下的原有CJS语法:
- 原有
require()引入其他包的写法,统一替换为import - 原有
module.exports/exports.xxx导出写法,替换为export/export default - 原有
__dirname/__filename变量不存在,可通过以下代码实现:
import { fileURLToPath } from 'url'; import path from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); - 原有
修改完成后直接运行node index.js即可正常启动。
方案2:保留CJS规范,异步动态加载ESM包
如果不想改动整个项目的模块规范,可以在CJS环境下用动态import()加载纯ESM包,注意动态import返回Promise对象,需要在异步逻辑中使用:
(async () => { const { bkLabs } = await import('@berkelium/nlp-core'); // 所有依赖bkLabs的业务逻辑都需要写在该异步函数内部 })();
注意:不要尝试修改
node_modules目录下依赖包的源码或配置(比如删除依赖包package.json中的"type": "module"、修改文件后缀),重新安装依赖后改动会直接失效,还可能触发依赖内部的其他运行错误。
内容的提问来源于stack exchange,提问作者dr_fg2
相关产品推荐
相关产品推荐

