Vite watch 新增子目录后不再重建:检查原子替换
watch 启动后才引入子目录模块,原地写入有效,原子保存后再次修改却不重建。核对实际 Rolldown 监听版本与连续编辑结果。
vite build --watch 开始时正常,运行期间才新增并导入一个子目录模块。原地编辑能重建,编辑器一次原子保存后,再修改同一文件却没有动静,输出里仍是旧内容。若使用 Vite 8.2.1,应把“启动后才加入的目录”和“替换后继续编辑”一起保留。
单纯在已有子目录里做原子保存,未必触发;文件完全没有从入口导入时,也可能本来就不在构建图中。这两种对照都不能代替上述时间顺序。
监听的文件名还在,原来的监听对象可能已消失
编辑器可能先写临时文件,再通过 rename 替换目标。新引入子目录的监听登记若退化为单文件监听,替换会让监听仍附着在旧文件身份上,后续同名文件的写入就不再到达原句柄。
先检查入口确实通过 import 到达该模块,并比较原地写入、第一次替换及替换后的下一次写入。还需要观察 rename 之后的下一次保存:那次重建可能成功,下一次才静默失效。
Vite 8 的构建 watch 使用 Rolldown 底层监听,不应直接拿开发服务器的全部 chokidar 选项套过来。也不要先把整个根目录或 node_modules 纳入轮询,扩大监听范围会增加负担,却未必修正已经丢失的句柄。
更新实际使用的监听依赖,再保留连续保存检查
相关底层修正在 rolldown-notify 10.5.1、Rolldown 1.2.6 的发行组合中可核对。当前正式 Vite 8.3.5 声明 Rolldown ~1.2.14,采用更新的正式组合时,仍要核对锁文件与实际安装版本,避免工作区或覆盖规则继续保留旧副本。
暂时不能更新时,在增加目录和依赖后重新启动 watch,可以重新建立这批输入的监听;这只是有限的过渡办法,不能保证后续每次原子替换都安全。若项目必须调整编辑器保存方式,应局限在该项目并保留原设置,不能把关闭原子保存当成底层修复。
构建未恢复前,不要把最后一次成功产物继续当成最新代码部署。确认输出中与该模块对应的可观察值已变化,再继续原发布流程;日志没有错误,并不表示产物没有过期。
验收从运行中的 watch 新增子目录开始,先把模块接入入口,再原地写入、原子替换,最后再连续修改两次。每一步既看重建事件,也看输出实际内容,并覆盖生产的一次性构建。网络挂载或 WSL 跨系统编辑还有其他事件边界,版本更新后若仍失败,应按实际文件系统继续定位。


