虚拟机环境打包问题
问题描述
在内网虚拟机环境中,使用 vite@6.4.0 打包时,报错:
[vite:build-html] The "fileName" or "name" properties of emitted chunks and assets must be strings that are neither absolute nor relative paths, received ../snapVolumesTemp/MountPoint/.../ipt-view/index.html
排查过程
-
初步定位:
- 在
node_modules中搜索报错信息,发现问题出现在rollup.js的emitFile方法中,fileName或name带路径导致报错。
- 在
-
深入分析:
emitFile方法由PluginDriver类调用,最终在vite的buildHtmlPlugin中调用了rollup的emitFile。fileName的值来源于shortEmitName = path.relative(config.root, normalizedId)。
-
发现问题:
- 在打包时,
config.root为项目真实路径,而normalizedId为快照环境中的挂载路径,导致shortEmitName计算结果为相对路径,引发报错。
- 在打包时,
解决方案
-
硬编码修复:
- 由于问题仅出现在
index.html,直接将fileName硬编码为index.html。
- 由于问题仅出现在
-
生成补丁:
-
修改源码后,执行以下命令生成补丁:
npx patch-package vite -
补丁文件会记录在
patches/vite+6.4.0.patch中。
-
-
自动应用补丁:
-
在
package.json的scripts中添加:"postinstall": "patch-package" -
提交
patches文件夹到 Git 仓库,确保其他人在运行npm install时自动应用补丁。
-
注意事项
-
适用场景:
- 适合临时解决问题,或库版本更新频率较低的情况。
- 使用
~锁定小版本,或同步package-lock.json,确保团队一致性。
-
长期方案:
- 若需与官方库保持同步,建议 fork 原库并维护私有包,团队统一从私有库安装依赖。