DEBUG.WIKI
晚安云;香港 CN2 ¥15/月
PanstarCloud:部署应用,接入 AI,云服务器与 AI 网关
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →

Vite build --watch 不更新内联资源:new URL 的查询参数漏进文件监听

资源首次正确内联,修改文本却不触发 watch 构建。检查 new URL 的查询参数是否让真实文件未被登记为监听输入。

vite build --watch 首次输出正常,修改 message.txt 后却没有重建;改动导入它的 JS 又能得到新内容。若代码使用 new URL('./message.txt?inline', import.meta.url),检查资源有没有真正进入构建监听输入。

这一具体表现已在 Vite 8.3.4、7.3.6 中出现。资源转换能处理 ?inline,但后面的文件存在性检查仍拿着包含查询参数的路径。文件系统中没有名为 message.txt?inline 的文件,因此监听登记被跳过。普通不带查询的相对 URL 可能一直正常。

不要把内联成功当成监听成功

先保留原表达式和输出,比较修改 JS 与只修改资源时的构建日志。确认编辑器保存的确实是构建引用的那份文件;同名文件、另一个工作目录或忽略规则,也会造成看似相同的现象。

?no-inline、版本查询及 fragment 也应按实际版本逐项检查,不能因为其中一项有效就认定另外几项受支持。这里说的是转换器已接受的 URL,其磁盘监听路径没有清掉后缀;不是让文件名本身包含问号。

为确定的资源补充 watch 输入

不能立即采用包含正式修复的工具链时,可以在项目原插件列表里补一个范围明确的构建插件。下面假设配置文件位于项目根目录,实际文件是 src/message.txt:

import { fileURLToPath } from 'node:url';
import { defineConfig } from 'vite';

const messageFile = fileURLToPath(
  new URL('./src/message.txt', import.meta.url),
);

export default defineConfig({
  plugins: [{
    name: 'watch-message-asset',
    apply: 'build',
    buildStart() {
      this.addWatchFile(messageFile);
    },
  }],
});

这里的 Node URL 只用于定位配置旁边的真实文件,不含 ?inline。addWatchFile 登记构建输入,不改变应用里的资源 URL、内联选项或输出内容。已有插件时追加这一项,不能覆盖整份配置。

只补确实依赖的资源;动态资源集合需要明确目录变化与成员变化如何触发构建,不宜把磁盘根目录或整个 node_modules 加入监听。源文件本来就不存在时,先修路径;插件不会替项目生成缺失文件。

用两次独立修改检查输出

重启原 watch 任务,只改文本资源,确认收到重建事件,输出内联内容也随之改变;再改一次,排除只有首次重建有效的情况。继续检查没有关联的文件不会引发异常重建风暴,以及普通一次性生产构建仍能正确内联。

这项补充会增加指定文件的监听,适合作为有限的临时配置。保留原配置和锁文件,后续升级先用原带查询表达式回归,再移除冗余插件。已核对的 8.3.4 正式代码仍在带查询路径上做文件检查,关闭状态不能代替修复版本核验。