onfocuschange是防丢首选,因它在切终端、标签页等真实工作流节点即时保存,不依赖延迟或整窗失焦;需确保非untitled文件、无工作区覆盖配置、remote环境配远程设置,并启用files.hotexit:onexitandwindowclose兜底。

选 onFocusChange,不是 afterDelay,也不是 onWindowChange —— 这是防丢最实际、最可靠的触发时机。
为什么 onFocusChange 是防丢首选
你写完几行代码,下意识切到终端跑一下 npm run dev,或者点开浏览器看效果,或者切换标签页查文档——这些动作都会让当前编辑器失去焦点,onFocusChange 就在此刻把文件真正写入磁盘。它不依赖“停顿多久”,不赌那 1 秒内 VSCode 不崩溃,也不等你 Alt+Tab 切出整个窗口才反应。
常见错误现象:设了 "files.autoSave": "afterDelay",延迟 1000ms,结果改完代码立刻 Ctrl+S 手动保存(以为更保险),反而暴露了“手动保存”这个脆弱环节;更糟的是,改完直接切终端,结果 VSCode 崩溃,最后 1 秒的改动全丢。
-
onFocusChange在你真实工作流的关键节点落地,不是靠时间猜 - 它对性能影响极小,不产生高频小写入,不拖慢 WSL2 或低端 SSD
- 和 Prettier、ESLint 等格式化插件兼容性好,只要格式化成功,保存就完成(失败时右下角会报错,你能立刻看到)
onFocusChange 失效的三个高发原因
开了开关、选了模式,但切出去没保存?别急着换模式,先排查这三处:
- 正在编辑的是
Untitled-1(标题栏带“未命名”字样):这类临时文件根本不会写入磁盘,自动保存完全不生效。必须先按Ctrl+S指定路径,再继续编辑 - 项目根目录下存在
.vscode/settings.json,里面写了"files.autoSave": "off"或其他值:工作区设置优先级高于用户设置,直接覆盖全局配置。删掉这行或改成"onFocusChange" - 用了 Remote-SSH 或 WSL:自动保存设置在远程机器上生效,不是本地。需登录远程环境,修改
~/.vscode/settings.json,而非你本地的设置
afterDelay 不是不能用,但得清楚它的边界
如果你坚持用 afterDelay,必须接受它本质是「有保护窗口」的模式:从你停止输入,到磁盘真正落稳,中间存在不可控间隙。这不是 bug,是设计使然。
- 默认
1000毫秒太短,建议调到1500,给内核缓存和监听工具(如 nodemon)留出余量 - 不要设低于
500:频繁小写入在 WSL2 的/mnt/c或老旧 SSD 上可能引发 I/O 阻塞 - 它和文件系统监听强耦合:若
inotify限制过低(Linux 默认8192),Webpack 可能读到旧内容,看起来“保存了但没生效”
别漏掉 files.hotExit 这个兜底项
onFocusChange 解决“编辑中丢失”,files.hotExit 解决“关机/崩溃后恢复”。两者不是替代关系,是叠加防护。
务必确认它设为 "onExitAndWindowClose"(不是默认的 onExit),这样即使你强制杀掉 VSCode 进程,重启后仍能看到未保存更改的恢复提示。
容易被忽略的一点:如果项目用了 files.exclude 把 .vscode/.history/ 排除了,VSCode 的本地历史记录就失效——而这是你找回误删代码的最后一道线。检查并确保该路径没被意外排除。











