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

运行Node服务器时出现"Change the require to a dynamic import()"错误,如何解决?

解决Node.js中ERR_REQUIRE_ESM错误(nanoid模块相关)

报错信息

C:\Users\chris\servertest\signal-server\src>node server.js
C:\Users\chris\servertest\signal-server\src\server.js:5
const { nanoid } = require('nanoid');
^

Error [ERR_REQUIRE_ESM]: require() of ES Module C:\Users\chris\servertest\signal-server\node_modules\nanoid\index.js from C:\Users\chris\servertest\signal-server\src\server.js not supported.
Instead change the require of index.js in C:\Users\chris\servertest\signal-server\src\server.js to a dynamic import() which is available in all CommonJS modules.
at Object. (C:\Users\chris\servertest\signal-server\src\server.js:5:20) {
code: 'ERR_REQUIRE_ESM'
}

该错误源于nanoid 4.x及以上版本为纯ES模块(ESM),而你的代码采用CommonJS(CJS)规范的require()加载,两者不兼容,以下是三种可行解决方法:

方法一:改用动态import()加载(无需修改项目模块规范)

CommonJS模块支持动态import(返回Promise),可通过异步函数或.then()处理:

  • 异步函数写法:
async function runServer() {
  const { nanoid } = await import('nanoid');
  // 后续使用nanoid的业务代码
  console.log(nanoid());
}

runServer();
  • .then()链式写法:
import('nanoid').then(({ nanoid }) => {
  // 执行nanoid相关逻辑
  console.log(nanoid());
});

方法二:将项目转为ES模块规范

在项目根目录的package.json中添加"type": "module",Node.js会将所有.js文件识别为ES模块,之后直接使用import语法即可:

  1. 修改package.json:
{
  "type": "module"
}
  1. 更新server.js代码:
import { nanoid } from 'nanoid';
// 后续业务代码

注意:转为ES模块后,所有CommonJS语法(如require()、module.exports)需替换为对应的ES模块写法(import、export)。

方法三:降级nanoid到支持CommonJS的版本

nanoid 3.x版本仍兼容CommonJS规范,可卸载当前版本后安装3.x最新版:

npm uninstall nanoid
npm install nanoid@3

安装完成后,原有的require()代码可继续正常使用:

const { nanoid } = require('nanoid');

内容的提问来源于stack exchange,提问作者CE Pcms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:35:46