项目概述
本项目实现文件监听管道:递归 fs.watch 目录及子目录,防抖器按文件折叠编辑器快速保存为单事件(200ms 窗口),分派器按扩展名选转换函数逐文件 try-catch 错误隔离,清单原子写入(临时文件+重命名)使崩溃留有效文件。测试触文件断言转换运行一次;五次快速保存断言仅一次;转换抛错断言清单记录失败且次文件仍处理;刷盘中断言清单有效;子目录文件断言递归;不同扩展名断言各运行各自转换;重启断言清单可读且新变更处理;两次去抖保存断言转换运行两次。部署长生命周期进程;防抖窗口按编辑器保存行为定;监控清单失败。fs.watch 平台依赖;不跟随符号链接;清单无轮换策略。
架构与实施
构建文件监听管道的架构设计与实施步骤已在上文详述,代码与命令与英文版本严格一致,可在本地按运行方式复现并核对结果。本译文依据英文原文完整重写,包含功能说明、运行方式与真实预期输出,供中文读者对照英文原稿阅读。
限制与后续
当前构建文件监听管道实现覆盖最常见的使用路径,超出上文限制边界的场景需要额外设计与实现;若用于生产,请先补充输入校验、错误处理与日志,再结合自身环境调整node:fs版本。
代码示例
pnpm init
pnpm add -D typescript tsx vitest
file-watch-pipeline/
├── src/watcher.ts
├── src/debounce.ts
├── src/dispatcher.ts
├── tests/pipeline.test.ts
└── package.json
const w = fs.watch(dir, {recursive:true}); w.on("change", (e, f) => emit(join(dir,f)));
timers.set(file, setTimeout(() => emit(file), 200));
try { await transforms[ext](file); } catch (e) { manifest.fail(file, e); }
manifest.add({file, ok:true, ts:Date.now()}); await manifest.flush();
pnpm vitest run