根本原因是VS Code按语言ID单独绑定格式化器,未配置的语言(如typescriptreact、json、html)不会默认使用Prettier,必须在settings.json中用"[language-id]"块逐一指定editor.defaultFormatter。

为什么“Format Document With”列表里有 Prettier,但 JS/TS/HTML/Python 混排时总有一两个不生效
根本原因不是插件没装全,而是 VS Code 对每种语言 ID 都要单独绑定 editor.defaultFormatter。它不认“通用格式化器”,只看当前文件右下角显示的语言模式(比如 typescriptreact、html、jsonc)是否被显式配置过。没配,就弹窗让你选;选了也不记,下次打开另一个同类型文件还得再选。
- 右下角语言模式必须是真实语言 ID,不是
Plain Text或Unsupported;点它可手动切换 -
javascript和typescriptreact是两个独立语言,得分别配:"[javascript]": {...}和"[typescriptreact]": {...} -
json文件默认用内置格式器,若想走 Prettier,必须加"[json]": {"editor.defaultFormatter": "esbenp.prettier-vscode"} -
html文件需额外满足:项目根目录有prettier.config.js且含plugins: ['prettier-plugin-html'],否则 Prettier 直接跳过
settings.json 里怎么写才不漏语言、不冲突
全局设置 "editor.defaultFormatter": "esbenp.prettier-vscode" 几乎没用——它只对“未识别语言”的文件生效,现实中几乎不存在。真正起效的是带方括号的语言专属块,且必须一一对应。
- 每个语言块必须用双引号包裹,键名格式为
"[language-id]",ID 来自 VS Code 官方语言标识(如python、markdown、vue),不是文件后缀 - 确保插件 ID 完全匹配:是
esbenp.prettier-vscode,不是prettier-vscode、prettier或少了个r - Python 推荐用
ms-python.black-formatter,别强行塞 Prettier;它和black的 tabWidth / line-length 规则天然不兼容 - 如果用了 ESLint 做代码检查,关掉它的格式能力:
"eslint.format.enable": false,避免和 Prettier 抢着改分号、引号
保存时部分文件不格式化,但 Shift+Alt+F 可以 —— 这说明什么
这暴露了一个关键断点:editor.formatOnSave 开了,但某个语言的 editor.formatOnSave 被覆盖为 false。VS Code 会优先采用语言级或工作区级设置,全局设置只是兜底。
- 按
Ctrl+Shift+P→Preferences: Open Workspace Settings (JSON),检查是否有类似"[javascript]": {"editor.formatOnSave": false}的行 - 工作区
.vscode/settings.json会覆盖用户级设置,团队协作时建议把语言专属配置放这里,保证一致 -
editor.formatOnSaveMode设为modifications后,首次保存可能不触发(因无“修改标记”),可先手动改一行再保存测试 - 某些语言(如 Go)依赖
gopls提供的格式化能力,此时editor.defaultFormatter应设为golang.go,而非硬塞 Prettier
插件装了、配置写了、语言也对了,还是静默失败
这时候大概率是格式化器本身没加载成功,VS Code 不报错,只当它不存在。常见于路径、依赖或配置文件语法错误。
- 运行
npx prettier --debug-check index.js,它会明确指出.prettierrc哪一行非法(比如用了单引号、尾随逗号、注释) - Prettier 插件若依赖本地
prettier包,而你用的是pnpm或yarn v4+,需显式指定:"prettier.prettierPath": "./node_modules/prettier/index.cjs" - 按
Ctrl+Shift+P→Developer: Toggle Developer Tools,在 Console 标签页过滤esbenp.prettier-vscode,看有没有activate failed报错 - 某些插件(如
clang-format)需要系统 PATH 中存在可执行文件,路径不对就静默失败,连提示都不给
vue、typescriptreact、jsonc 这些都不是“顺手就能猜对”的名字,它们必须和 VS Code 状态栏显示的一模一样,差一个字符,格式化链就断在那。


















