#23470·Vite

当文件监视器发出错误时(未捕获的"error"事件,例如 Windows 上的 EBUSY),开发服务器会导致整个过程崩溃

作者: MaxenceMouchard创建于 2026年9月11日更新于 2026年9月14日
标签pending triage

描述错误

createServer ()'赞同change',add'和unlink'在chokidar监视器上,但绝不`error':

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? //包/视频/src/节点/服务器/index.ts const watcher = 服务器 Config.watch!============================================================================================================================================================================================================================================== . . . . . . . . watcher.on ("改变",. watcher. on ('add', ...) (中文(简体) ). watcher.on ('unlink', ...) (中文(简体) ).


Chokidar在 " FS Watcher " 上报告 " 排放过量 " 的故障。 在没有收听器的情况下,Node的"EventEmitter"合同将它变成了一个未被发现的例外,dev服务器立即退出. 在项目根下任何地方有一个无法观察的文件杀死`vite dev'——没有消息,没有恢复。 文件不必在模块图中:chokidar走出整个根,并在Windows上在其发现的每个文件中安装单个"fs.watch".

真实世界触发器:一个ASP.NET项目,Vite根也包含.NET"bin/"输出. 后端写出一个新编译的集合并仍然握有一瞬间;chokidar对"add"事件的反应,在锁定的文件中呼唤"fs.watch ()",得到"EBUSY",服务器死亡:

节点:内部/fs/观察者:323 错误 = 新的紫外线( {) ^ 错误: EBUSY: 资源繁忙或锁定, 注意“.../ 释放/ 某些. 实体. dll ” at Object.watch(节点:fs:2608:36) (./vite/dist/node/chunks/Node.js:10735:16) (中文(简体) ). 收听器(./vite/dist/node/chunks/Node.js:10777:14) at NodeFsHandler. Watch With NodeFs (./vite/dist/node/chunks/ZNode.js:10892:20). 在NodeFsHandler. handleFile (./vite/dist/node/chunks/Node.js:10936:24) 页面存档备份,存于互联网档案馆. 在 FSWatcher 实例上发出“ error” 事件 : 在FSWatcher. handleError (./vite/dist/node/chunks/Node.js:11912:146) (中文(简体) ). 错误: -4082, syscall:"表",代码:"EBUSY"


在一个短暂锁定的文件中的`EBUSY'在节点24.16.0+上更容易被击中,这个节点将libuv撞到1.52.x(`uv fs event start ()'现在打开目标文件,可读取数据,见libuv#4948). 旁观者缺陷是独立的:任何观察者错误(`EPERM ' 、`ENOSPC ' 、耗尽的预算)总是同样致命。

* 复制

https://stackblitz.com/edit/vitejs-vite-aadpixhz?file=repro.mjs (英语).

* 复制步骤

1. 打开复制链接,加上`repro.mjs',运行`node repro.mjs':该过程死于未发现的`error'事件,而不是打印`幸存'。
2. 在有节点的Windows上,第二个脚本复制了由真实的chokidar故障所引发的同一起崩溃,没有手工排放出任何东西.

所缺少的处理器是站台独立的,因此它出现在平坦的Vite起动器中 (上方链接). 在根部添加`repro.mjs',然后运行`node repro.mjs':

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么?
从“ vite” 导入 {创建Server }

Const 服务器 = 等待创建 Server ({ configFile: false, 服务器 :{port: 0}})

control.log ('s listeners on "error" :', server. watcher. listener Count ('error')) // / 0.
control.log ('s listeners on "change" :', server. watcher. listener Count ('change')) 控制台.log (“change”上的听众)
. . . . . . .