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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:42:28