运行Node服务器时出现"Change the require to a dynamic import()"错误,如何解决?
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语法即可:
- 修改
package.json:
{ "type": "module" }
- 更新
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

