Node.js require引入nanoid报ERR_REQUIRE_ESM错误解决方法
报错原因
nanoid 4.0.0及以上版本不再提供CommonJS规范的构建产物,仅支持ES Module格式的引入方式,当前项目使用CommonJS规范的require()语法加载该版本nanoid,就会触发ERR_REQUIRE_ESM错误。
可选修复方案
方案1:降级nanoid到兼容CommonJS的v3版本(改动最小,推荐)
这个方案不需要修改任何现有业务代码,操作步骤:
- 在服务端目录执行命令卸载当前高版本nanoid:
npm uninstall nanoid - 安装兼容CommonJS的v3稳定版本:
npm install nanoid@3.3.4 - 原代码中
const { nanoid } = require("nanoid");的写法可以保留,直接执行node server.js启动服务即可。v3版本的nanoid生成唯一ID的能力和v4完全一致,完全满足聊天应用的用户ID、消息ID生成需求。
方案2:将项目切换为ES Module规范适配v4版本nanoid
如果需要使用nanoid v4的新特性,可以把整个项目的模块规范切换为ES Module:
- 打开服务端目录下的
package.json,在配置最外层添加字段:"type": "module" - 将所有JS文件中的
require()引入写法替换为ES Module的import写法,示例:// 原CommonJS写法替换为对应import写法 import express from 'express'; import { createServer } from 'http'; import { Server } from 'socket.io'; import { nanoid } from 'nanoid'; - 修改完成后重启服务即可正常运行。
方案3:CommonJS环境下动态import加载nanoid
如果不想修改全项目模块规范、也不想降级依赖,可以使用CommonJS支持的动态异步import方式加载ES Module格式的nanoid,注意该方式为异步,需要把服务初始化逻辑包裹在异步函数中,示例:
// 移除原第4行的nanoid require语句 async function bootstrap() { // 动态加载nanoid const { nanoid } = await import('nanoid'); // 其余原有服务逻辑放到该函数内,require写法的其他依赖不需要改动 const express = require('express'); const app = express(); const httpServer = require('http').createServer(app); const io = require('socket.io')(httpServer, { cors: { origin: "*" } }); // 业务逻辑中可正常调用nanoid() io.on('connection', (socket) => { const userId = nanoid(); // 其余聊天逻辑... }) httpServer.listen(3000, () => { console.log('服务运行在 http://localhost:3000'); }) } // 启动服务 bootstrap();
内容的提问来源于stack exchange,提问作者Sutarpat Thummanon
相关产品推荐
相关产品推荐

