必须显式为每种语言配置"[language]": {"editor.defaultformatter": "esbenp.prettier-vscode"},并确认文件语言模式正确(如右下角显示javascript/typescript而非plain text),否则vscode将回退使用内置格式化器。

怎么让 VSCode 用 Prettier 而不是内置格式化器
VSCode 默认对 .js 文件可能启用 vscode.typescript-language-features 的内置格式化器,它缩进逻辑松散、不尊重 .prettierrc,一保存就破坏你配好的引号或分号规则。必须显式覆盖语言级默认值。
- 右键编辑器 → “格式化文档时使用” → “配置默认格式化程序” → 选
esbenp.pretterrc-vscode(注意拼写) - 该操作会自动往
settings.json插入类似"[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }的块,只影响 JS 文件,不影响 TS 或 JSON - 如果没看到 Prettier 选项,检查扩展是否在当前工作区启用:远程开发时,插件必须装在 remote 端,本地装了也不显示
- 不要只设全局
"editor.defaultFormatter",它对多语言项目无效——[python]仍会走内置格式器,除非单独配
为什么改了 settings.json 还是调用错格式化器
常见现象:明明写了 "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },但保存 .ts 文件后还是被缩进成 4 空格、删空行。根本原因是 VSCode 没识别出文件语言模式。
- 看窗口右下角状态栏,确认显示的是
TypeScript,不是Plain Text或JavaScript;点它可手动切换 - 确保文件后缀正确:
.ts不能是.js但内容写 TS,否则语言服务不加载,格式化器直接跳过 - 多根工作区下,
settings.json必须放在对应子项目的根目录(如packages/web/settings.json),父目录的配置不会继承 - 检查有没有插件冲突:比如同时启用 ESLint 和 Prettier 的
formatOnSave,会导致两次格式化,第二次覆盖第一次结果
如何禁用 TypeScript 内置格式化器避免干扰
VSCode 的 TS 内置格式化器(vscode.typescript-language-features)无法关闭,但可以压制它的生效条件——只要你不让它成为“默认”,它就不会响应 Shift+Alt+F 或保存触发。
- 不要在
[typescript]块里留空或写null,VSCode 会 fallback 到内置器;必须明确指定另一个 ID,例如"editor.defaultFormatter": "esbenp.prettier-vscode" - 禁用
typescript.preferences.includePackageJsonAutoImports等无关设置,避免语言服务卡顿间接影响格式化响应 - 若仍被触发,检查是否启用了
editor.formatOnSave的全局开关但没配语言专属项——此时 TS 文件会走内置器,因为没语言级覆盖 - 验证方式:打开一个
.ts文件,运行命令面板(Ctrl+Shift+P)→ 输入Format Document With→ 看列表顶部是否显示 Prettier 为默认项
HTML 文件被 prettier 格式化失败的典型原因
很多人以为装了 Prettier 就能格式化 HTML,结果 Shift+Alt+F 没反应,或只缩进不处理属性换行。问题常出在 Vetur 或语言绑定上。
- Vetur 插件接管了
.vue中的<template></template>,但默认用prettyhtml;要统一用 Prettier,得加配置:"vetur.format.defaultFormatter.html": "prettier" - 纯
.html文件需确保语言模式是HTML(右下角显示),而不是Plain Text;否则 Prettier 扩展根本不注册格式化提供者 - Prettier 对 HTML 的支持依赖
prettier-plugin-html(v2.0+ 已内置),但若项目里有旧版prettier(.prettierrc 中的htmlWhitespaceSensitivity等字段 - 别在
settings.json里混用"editor.defaultFormatter"和"[html].editor.defaultFormatter",后者优先级更高,前者会被忽略











