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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:51:23