VSCode 更新后格式化失效并非需退回旧版,而是新版插件或配置机制变化导致旧配置被跳过或不兼容;应检查 settings.json 合法性、语言 ID 绑定、配置优先级及插件冲突。

VSCode 更新后格式化失效,**不是必须“退回旧版本”,而是新版插件或配置机制变了,旧配置被跳过或不兼容**。强行降级 VSCode 或插件反而容易引发扩展冲突、语言服务崩溃、甚至 UI 卡死——真正要做的,是让当前版本“认出并正确加载”你的格式化逻辑。
检查 settings.json 是否被静默忽略
VSCode 遇到非法 JSON 会直接跳过整个 settings.json,不报错也不提示,你看到的全是默认值,误以为“配置丢了”。这是更新后最常踩的坑。
- 用
Ctrl+Shift+P→ 输入Preferences: Open Settings (JSON)打开文件 - 确认内容只含标准 JSON:不能有
// 注释、不能有尾随逗号、所有字符串必须用双引号("editor.formatOnSave"✅,'editor.formatOnSave'❌) - 如果不确定,删掉全部内容,只留
{},保存后彻底退出 VSCode 再重启——若界面变干净,说明原配置确实没生效 - 特别注意:某些旧版 Prettier 配置里写了
"prettier.eslintIntegration": true,该字段在 Prettier 3.x 后已移除,会导致整个配置块被忽略
Format Document With 列表为空?绑定语言 ID 是关键
插件更新(尤其是 Volar 2.x、ESLint v3+、Prettier v3)大量改了语言 ID,[vue] 变成 [vue-html],[typescript] 可能被 [typescriptreact] 分走,导致 editor.defaultFormatter 绑定失效。
- 右下角状态栏点语言模式(如显示
Vue),确认它不是Plain Text或HTML - 运行
Ctrl+Shift+P→Format Document With…,看列表是否为空;若为空,说明没有 formatter 被注册到当前语言 ID - 在
settings.json中显式声明语言块,例如:{ "[vue-html]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[typescriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode" } } - 别依赖 GUI 下拉菜单选“Prettier”——它可能填的是
prettier或prettier-vscode,实际 ID 必须是esbenp.prettier-vscode
editor.formatOnSave 开了却没反应?优先级和覆盖链得理清
全局设了 "editor.formatOnSave": true 没用,因为工作区或语言专属配置会直接覆盖它。更新后,很多插件(如 ESLint 插件)会悄悄把 [javascript] 块里的 formatOnSave 设为 false。
- 打开工作区设置:
Ctrl+Shift+P→Preferences: Open Workspace Settings (JSON),检查是否有类似"[javascript]": { "editor.formatOnSave": false }的语句 - 不要只信 GUI 设置界面——它可能显示“开启”,但底层被更细粒度的配置锁死了。必须查 JSON 文件本身
- 若只想对某类文件启用,必须写成语言块形式,例如:
"[jsonc]": { "editor.formatOnSave": true, "editor.defaultFormatter": "vscode.json-language-features" } - 某些插件(如 Red Hat XML)升级后默认关掉
xml.format.enable,即使formatOnSave开着也无响应,需手动设为true
最麻烦的不是配置写错,而是多个插件同时声明同一语言的格式化权(比如 ESLint 和 Prettier 都想管 .ts 文件),VSCode 不报错,只是随机选一个执行——结果就是有时生效、有时静默。稳定的关键,是删掉所有非必要格式化插件,只留 esbenp.prettier-vscode + 语言支持插件(如 Volar、Python),再逐个加回,观察 Format Document With 列表变化。


















