vscode自动保存需设files.autosave为off/afterdelay/onfocuschange/onwindowchange之一;选afterdelay必须同步配置files.autosavedelay(单位毫秒),否则默认0延迟导致高频刷盘或卡顿。

VSCode 的自动保存不是“开/关”二选一,而是四个明确的字符串值:off、afterDelay、onFocusChange、onWindowChange——选错模式或漏配参数,就等于没开。
files.autoSave 设为 "afterDelay" 却不保存?检查 files.autoSaveDelay
这个模式常被误认为“设了就生效”,但实际必须配对使用:files.autoSaveDelay 才是触发阈值。默认值是 1000(毫秒),但如果你没显式写入该配置项,VSCode 会按 0 处理,导致高频刷盘甚至卡顿。
- 延迟太小(如
100):每次敲字间隙都可能触发保存,尤其在大文件或慢磁盘上明显拖慢响应 - 延迟太大(如
5000):编辑长段落中途崩溃,可能丢失 5 秒内容 - 只改
files.autoSave不配files.autoSaveDelay:VSCode 读不到延迟值,行为退化为不可预测 - 多根工作区下,该配置建议写进
.vscode/settings.json,避免被用户级设置覆盖
onFocusChange 和 onWindowChange 的触发边界容易混淆
两者都依赖“焦点变化”,但范围差一个层级:onFocusChange 是编辑器标签页级失焦,onWindowChange 是整个 VSCode 窗口级失焦。实际表现差异很大:
-
onFocusChange:切到终端、点侧边栏、切换到另一个 .ts 文件标签 → 当前文件立刻保存 -
onWindowChange:Alt+Tab 切到 Chrome 或 Finder → 所有已修改文件统一保存;但在 VSCode 内部切换标签页、打开命令面板,完全不触发 - 用
onFocusChange编辑 Python 脚本时顺手切去终端跑python main.py,脚本会自动存;但若用onWindowChange,这一步不会保存,可能运行的是旧版本 - 远程开发(SSH/WSL)中,
onWindowChange在窗口最小化时仍算“有焦点”,不一定触发保存
哪些文件不该自动保存?用 files.autoSaveExclude 显式排除
VSCode 不会自动识别生成文件或临时产物,全靠你告诉它:“这些路径别碰”。否则自动保存可能反复触发构建、污染 Git、或写坏只读资源。
- 常见需排除路径:
"**/dist/**"、"**/build/**"、"**/__pycache__/**"、"**/*.log" - 路径必须用
/,即使在 Windows 上也不允许用\ - glob 模式支持双星号递归,但不支持正则;想排除单个文件得写全名,如
"public/manifest.json" - 该配置仅对自动保存生效,不影响手动保存(Ctrl+S 仍可强制写入)
和 Prettier/ESLint 的 formatOnSave 冲突?顺序问题才是关键
很多人开了 editor.formatOnSave 又设 files.autoSave: "afterDelay",结果发现代码“看起来没格式化”——其实格式化执行了,但发生在保存之后,而自动保存又把未格式化的版本刷回磁盘。
- VSCode 默认执行链是:用户停止输入 → 延迟结束 → 触发保存 → 保存完成 → 触发 formatOnSave
- 所以你看到的是“刚保存完就被格式化覆盖”,但磁盘里仍是未格式化的内容
- 解法不是关自动保存,而是关
editor.formatOnSave,改用editor.formatOnType或手动格式化(Shift+Alt+F) - 如果坚持要“格式化完再保存”,目前 VSCode 无原生支持,需借助插件如
prettier-vscode的prettier.requireConfig+ 自定义 task 绕过
最易被忽略的一点:工作区设置优先级高于用户设置,且图形界面改的可能是用户级,而项目真正生效的是工作区级 .vscode/settings.json。哪怕你确认在设置里选了 onFocusChange,右下角若显示「工作区」,就得去那个 JSON 里核对是否被覆盖为 "off"。











