DEBUG.WIKI
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS

Vite 构建后还请求源 b.js:检查 HTML 首行相邻的 module 脚本

两个 module 脚本紧挨在 index.html 第一行,Vite 可能打包了模块却留下第二个源标签,导致额外 404。通过源 HTML 换行避开位置计算错误。

Vite 构建退出 0,两个模块也都进了哈希 bundle,打开产物却仍请求 /b.js 并报 404。查看 dist/index.html,如果除了新 bundle 标签,还留着原来的第二个 module 脚本,检查源 HTML 的第一行。

Vite 8.3.1、8.3.4 的具体触发形状是两个 module 标签紧挨着出现在首行,第二个标签前没有其他未被移除的内容。源文件若恰好在第二个标签结束,产物还可能丢掉最后的 >。8.3.5 正式 HTML 插件仍保留相同位置计算,不能仅凭版本较新认定已修。

先确认源标签不该保留

最小结构如下,两个路径均为示例:

<script type="module" src="/a.js"></script><script type="module" src="/b.js"></script>

正常构建会处理这些入口并移除对应源标签,再注入打包后的入口。异常产物里,第二个原标签仍在,但 dist 没有可供它加载的 b.js。这和发布后旧页面引用已删除哈希 chunk 不同:残留引用已经存在于刚生成的 HTML。

保留源文件和产物对照,核对两个模块是否确实都进入 bundle。如果 b.js 本来是要原样交付的 public 资源,或脚本被特定插件刻意保留,应先查那个约定,不能按本题删除。

在源模板里分开两条脚本

对符合这组条件的 HTML,可把两个标签放到各自一行:

<script type="module" src="/a.js"></script>
<script type="module" src="/b.js"></script>

只调整空白,保留标签顺序、属性与模块内容;随后用项目原构建流程重新生成产物。模板若由其他工具生成,应修改生成模板或关闭相应的合行处理,否则下次构建前又会恢复成同一行。

问题涉及节点列号与字符串删除区间。首行的列号按 1 起算,位置计算可得到 -1;代码切片时做了下界保护,返回删除起点时却没有同样保护。前一个标签已删除后,后一个节点可能被误判为行前没有内容,最终删错区间。这个解释针对已核对的源结构,不表示所有少一个尖括号的 HTML 都有同一原因。

不要为消除 404 再把 b.js 复制到 public。它已经进了 bundle 时,多交付一份源入口可能带来重复执行和两套状态。也不要只在 dist 中手工删标签,那样无法由下一次构建重现。

检查标签和实际执行次数

重新查看生成 HTML:两个旧源标签应按预期消失,新的打包入口完整,标签没有残缺。再通过原生产预览访问页面,确认不再请求源文件,模块需要的初始化和页面行为仍正确,尤其检查注册监听器等副作用是否执行了两次。

同时保留原有其他入口与资源加载检查。换行避开这条位置错误,不会修复 base、public 路径、部署漏文件或多页 CSS 图的其他问题。采用后续正式修复后,可用原首行结构回归,再决定是否还需要模板层的空白限制。