Vite 8(Rolldown)升级后报依赖缺少 default 导出,如何解决?
结论
优先检查 CommonJS 依赖是否经过 Vite 的依赖预构建。如果错误发生在开发服务器中,可以先将 prop-types 显式加入 optimizeDeps.include,再使用 --force 重建依赖缓存。
目前还不清楚错误发生在开发、生产构建还是 SSR 阶段,也没有 Vite 配置和依赖版本,因此无法确定唯一原因。预构建是一条有依据的排查路径,但不能保证只改一项配置就能解决问题。
为什么会提示缺少 default 导出?
报错出现在加载 react-apexcharts.esm.js 时,涉及的目标模块是:
The requested module '.../node_modules/prop-types/index.js' doesn't provide an export named: 'default'
这说明导入方请求了目标模块的 default 导出,但当前加载的模块没有提供对应的 ESM 导出。
prop-types 的官方 index.js 使用 require() 和 module.exports,属于 CommonJS。如果项目解析到这个入口,构建工具需要完成 CommonJS 到 ESM 的转换。不能仅凭报错认定包里少写了 export default。prop-types 源码
Vite 在开发环境通过依赖预构建处理这类兼容问题。如果依赖被排除、没有被扫描到,或被别名、插件解析到了其他入口,就可能绕过预期的转换。这些是根据日志提出的排查方向,目前还无法确认项目遇到了哪种情况。Vite 依赖预构建说明
开发环境如何处理?
1. 显式预构建相关依赖
将下面的配置合并到现有 vite.config.ts 中,保留原有插件和其他设置:
import { defineConfig } from 'vite'
export default defineConfig({
optimizeDeps: {
include: ['react-apexcharts', 'prop-types'],
},
})
同时检查现有配置:
- 如果
optimizeDeps.exclude中包含prop-types,先移除该项。 - 如果配置了
optimizeDeps.noDiscovery: true,确认需要转换的 CommonJS 依赖已显式列入include。 - 如果
resolve.alias或自定义插件改写了包入口,核对最终解析路径。
Vite 官方建议不要把 CommonJS 依赖排除在预构建之外。Vite 依赖优化配置
2. 上游 ESM 包必须被排除时,指定嵌套依赖
如果项目确实需要将 react-apexcharts 排除在预构建之外,可以为它使用的 prop-types 配置嵌套依赖:
import { defineConfig } from 'vite'
export default defineConfig({
optimizeDeps: {
exclude: ['react-apexcharts'],
include: ['react-apexcharts > prop-types'],
},
})
esm-dep > cjs-dep 是 Vite 支持的嵌套依赖写法。这个示例适用于上游 ESM 包需要排除、下游 CommonJS 包仍需预构建的情况。如果没有这一需求,先使用前面的普通 include 配置。嵌套 CommonJS 依赖配置说明
3. 强制重新预构建
停止现有开发服务器,然后在项目目录执行:
npx vite --force
如果使用项目启动脚本,应给实际启动 Vite 的命令传入 --force。然后在浏览器开发者工具中临时禁用缓存并刷新页面,检查报错模块的请求和响应内容,确认是否仍在加载未经转换的 CommonJS 文件。Vite 官方也提供了强制重建依赖缓存的操作说明。Vite 缓存说明
如果仍然报错,接下来检查什么?
先明确错误发生的阶段。optimizeDeps 主要用于开发环境;如果错误发生在 vite build 或 SSR 中,需要检查对应阶段的依赖解析、外部化设置和插件处理,不能把开发预构建配置直接当作通用修复。Vite 依赖优化配置适用范围
再记录实际依赖版本。使用 npm 的项目可以执行:
npm ls vite react-apexcharts apexcharts prop-types
结合浏览器请求路径或构建日志,确认报错涉及哪一份 prop-types,以及 react-apexcharts 实际使用了哪个入口。若使用其他包管理器,可以使用其对应的依赖查询命令。
Vite 8 将依赖优化器切换为 Rolldown,并调整了 CommonJS 默认导入的互操作行为。可以核对这些变化,但仅凭当前日志,无法确认报错是由互操作规则变化还是依赖没有正确转换导致的。Vite 8 迁移说明
不要直接修改 node_modules/prop-types/index.js 添加 export default,也不要通过 TypeScript 的 allowSyntheticDefaultImports 来处理这个运行时错误。如果最小项目在强制预构建后仍能复现,应保留准确版本、最小配置和完整日志,再进一步定位依赖兼容问题。
备注:内容仅供参考。
