问题记录

51 阅读1分钟

虚拟机环境打包问题

问题描述

在内网虚拟机环境中,使用 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

排查过程

  1. 初步定位

    • node_modules 中搜索报错信息,发现问题出现在 rollup.jsemitFile 方法中,fileNamename 带路径导致报错。
  2. 深入分析

    • emitFile 方法由 PluginDriver 类调用,最终在 vitebuildHtmlPlugin 中调用了 rollupemitFile
    • fileName 的值来源于 shortEmitName = path.relative(config.root, normalizedId)
  3. 发现问题

    • 在打包时,config.root 为项目真实路径,而 normalizedId 为快照环境中的挂载路径,导致 shortEmitName 计算结果为相对路径,引发报错。

解决方案

  1. 硬编码修复

    • 由于问题仅出现在 index.html,直接将 fileName 硬编码为 index.htmlimage-2.png
  2. 生成补丁

    • 修改源码后,执行以下命令生成补丁:

      npx patch-package vite
      
    • 补丁文件会记录在 patches/vite+6.4.0.patch 中。 image-1.png

  3. 自动应用补丁

    • package.jsonscripts 中添加:

      "postinstall": "patch-package"
      
    • 提交 patches 文件夹到 Git 仓库,确保其他人在运行 npm install 时自动应用补丁。

注意事项

  1. 适用场景

    • 适合临时解决问题,或库版本更新频率较低的情况。
    • 使用 ~ 锁定小版本,或同步 package-lock.json,确保团队一致性。
  2. 长期方案

    • 若需与官方库保持同步,建议 fork 原库并维护私有包,团队统一从私有库安装依赖。