DEBUG.WIKI
晚安云;香港 CN2 ¥15/月
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →

Vite 8.0.0 预构建报 exportsData 未定义,检查包子路径里的加号

Vite 8.0.0 导入含加号的包子路径时,依赖优化报 exportsData 未定义。定位预构建文件名映射,并核对 8.0.1 修复及原包导出。

开发服务启动时就报 Cannot destructure property 'exportsData' of 'depForEntryFileName[chunk.fileName]' as it is undefined,错误出现在 Vite 的依赖优化代码,而不是应用组件中。项目刚升级到 Vite 8.0.0,且导入的包子路径含有 + 时,可以先核对这一处文件名映射回归。

已确认的触发形式是合法的包导出,例如:

import Ravelin from 'ravelinjs/core+track+encrypt+promise';

这里的加号属于包的公开子路径。它不表示字符串拼接,也不需要改成空格或 %2B。Vite 8.0.1 已修复这条路径;其他 exportsData 错误仍须结合实际入口判断。

包能够解析,优化器却对不上输出文件

Vite 会把依赖标识转换为适合预构建输出的文件名,再根据生成的 chunk 名称找回入口信息。8.0.0 的转换处理了斜杠、点号等字符,却漏掉加号。底层打包器处理输出名后,两边使用的键不一致,查表得到 undefined,随后解构时报错。

这个顺序与“包没有导出这个子路径”不同。先检查错误中是否带有 Error during dependency optimization,再沿导入找到实际包的 exports 与对应文件。不要因为栈里出现解构,就给业务代码补一个空对象;失败的解构发生在工具内部,空对象也无法生成缺失的模块映射。

项目若使用工作区或框架封装,记录实际参与启动的 Vite 版本和锁文件解析结果。清单写着 ^8.0.0,并不能证明每台机器已经安装 8.0.1。

更新包含文件名处理的 Vite

在兼容的 Vite 8 项目中,采用包含该修复的正式版本。8.0.1 是已经核对的修复节点,选择后续版本还要满足框架和插件的支持范围;不必为了这个问题改包自身的导出名称。

修复后的转换会将 + 纳入依赖标识的文件名处理,使预期入口与实际 chunk 对应。它没有更改应用的 import 字符串,也没有要求包发布另一份不带加号的文件。

更新前保存包清单与锁文件。更新后停止旧开发进程,由原项目入口重新生成依赖优化结果。若 dev 脚本直接调用 Vite,可按原流程传入 --force 强制预构建;脚本外面还有框架启动器时,先核对参数的传递方式。无需删除整份锁文件来“刷新版本”,那会把其他依赖变化混进本次判断。

将失败依赖加入 optimizeDeps.exclude 也不是通用替代方案。若包需要 CommonJS 转换,排除后可能变成浏览器缺少导出的另一个错误。这与链接 CommonJS 包没有进入预构建的处理方向不同。

从原导入入口验收

重启后,先确认终端实际使用了修复版本,依赖优化完成,再打开真正导入这个子路径的页面。浏览器应能取得并执行对应模块,相关功能不能只是绕过初始化后显示一张空页面。

开发预构建恢复后,再走项目已有的正式构建和预览流程。生产构建与开发优化并非同一条路径,不能只用开发服务不再报错替代正式产物检查。若需要回退,恢复整套依赖与锁文件,并重新生成对应缓存,避免旧进程继续使用另一份优化结果。