一、报错完整日志
failed to load config from /home/luomor/git/ezdata/web/vite.config.ts
error during build:
Error [ERR_REQUIRE_ESM]: require() of ES Module /home/luomor/git/ezdata/web/node_modules/@rolldown/pluginutils/dist/index.mjs not supported.
Instead change the require of /home/luomor/git/ezdata/web/node_modules/@rolldown/pluginutils/dist/index.mjs to a dynamic import() which is available in all CommonJS modules.
at Object.<anonymous> (/home/luomor/git/ezdata/web/node_modules/@vitejs/plugin-vue-jsx/dist/index.cjs:8:21)
at _require.extensions.<computed> [as .js] (file:///home/luomor/git/ezdata/web/node_modules/vite/dist/node/chunks/dep-Dm0c1Wj2.js:49604:9)
at Object.<anonymous> (/home/luomor/git/ezdata/web/vite.config.ts:378:37)
二、报错核心根源
1. 本质冲突
Node.js 模块语法强限制:CommonJS(.cjs) 文件禁止使用 require() 导入纯 ESM(.mjs) 模块,仅支持动态 import() 导入。
2. 依赖链路冲突
@vitejs/plugin-vue-jsx 4.x+新版内置集成 rolldown 编译工具链;- 内置依赖
@rolldown/pluginutils新版仅打包输出 ESM 格式index.mjs; - plugin-vue-jsx 本体编译为 CommonJS 格式
index.cjs,内部用 require 加载 mjs,直接触发模块报错。
3. 高发环境
三、分级解决方案(按优先级:最简→适配→改造)
✅ 方案一:降级插件【全网最优、零改代码、推荐首选】
回退无 rolldown 依赖的稳定版 plugin-vue-jsx,彻底规避模块冲突,无需修改vite配置、项目代码。
# npm 执行
npm uninstall @vitejs/plugin-vue-jsx
npm i @vitejs/plugin-vue-jsx@3.1.0 -D
# pnpm 执行
pnpm remove @vitejs/plugin-vue-jsx
pnpm add @vitejs/plugin-vue-jsx@3.1.0 -D
# yarn 执行
yarn remove @vitejs/plugin-vue-jsx
yarn add @vitejs/plugin-vue-jsx@3.1.0 -D
适配:所有Vue2/Vue3、Vite全版本老旧项目,执行完直接重启构建即可修复。
✅ 方案二:锁定依赖版本【保留新版JSX插件专用】
业务必须使用 4.x+ 新版vue-jsx插件,强制锁定低版本兼容rolldown工具包。
- 安装兼容版工具包
npm i @rolldown/pluginutils@0.0.13 -D
- package.json 顶层添加依赖锁定(npm/pnpm生效)
{
"resolutions": {
"@rolldown/pluginutils": "0.0.13"
}
}
- 重装依赖生效:
npm install
✅ 方案三:项目全局改为ESM模式【新项目改造使用】
适配全新前端项目,将项目整体转为ESM模块,消除CJS/ESM导入壁垒,老旧项目慎用,会导致原有require代码报错。
- 根目录package.json新增顶层配置
{
"type": "module"
}
- 改造vite.config.ts语法
- 所有
require()改为import - 所有
module.exports改为export default
- 所有
- 重启本地开发/构建命令
✅ 方案四:修改配置动态导入【临时兜底,不长期使用】
定位报错行:vite.config.ts 第378行,改造静态导入为Node支持的动态import,配置改为异步导出。
// 原有报错代码(CJS静态导入)
const xxx = require('@rolldown/pluginutils')
// 修改后代码(动态ESM导入)
const { xxx } = await import('@rolldown/pluginutils')
// 整文件改为异步配置导出
export default async defineConfig({
// 原有全部vite配置不变
})
四、通用兜底清理步骤(修改后仍报错执行)
清除依赖、缓存、锁文件,彻底重置依赖环境,解决依赖残留兼容问题
# Linux/Mac 一键清理
rm -rf node_modules package-lock.json .vite-cache
# Windows cmd 执行
rd /s /q node_modules
del package-lock.json
# 重装依赖
npm cache clean --force
npm install
五、项目避坑总结
- Node版本最优选择:固定 Node20 LTS,规避绝大多数ESM/CJS模块兼容问题;
- 老旧企业Vite项目:禁止升级 @vitejs/plugin-vue-jsx 至4.x及以上版本,固定3.1.0永稳;
- 区分模块规则:CJS文件只能动态import ESM包,不能直接require ESM包;
- 报错快速判定:只要报错关键字包含 ERR_REQUIRE_ESM + rolldown,优先降级vue-jsx插件即可。
正文完
可以使用微信扫码关注公众号(ID:xzluomor)