vs code 未识别 prettier 是因语言模式错误或未委任格式化器,需检查右下角语言模式、设置 editor.defaultformatter、配置 .vscode/settings.json 中的 vue 支持,并排除插件冲突与 eslint 干扰。

Format Document With… 列表里没有 Prettier 怎么办
说明 VS Code 根本没识别到 esbenp.prettier-vscode 对当前语言的支持,不是插件没装,而是“没被委任”。
常见原因和操作建议:
- 右下角状态栏确认语言模式是否正确(比如显示的是
Plain Text而非JavaScript或HTML)——模式不对,VS Code 不会加载对应语言的格式化器 - 打开设置(
Ctrl+,),搜editor.defaultFormatter,展开对应语言项(如[javascript]),手动填入esbenp.prettier-vscode(注意拼写,不能是prettier-vscode或prettier) - 如果用的是
.vue文件,[vue]不是 VS Code 原生语言 ID,需在.vscode/settings.json中显式配置:"[vue]": { "editor.defaultFormatter": "esbenp.prettier-vscode" } - 检查插件是否被禁用:插件面板(
Ctrl+Shift+X)中搜索prettier,确保状态为“启用”,且未被工作区禁用
保存后没格式化,但 editor.formatOnSave 是 true
这个设置本身有效,但会被更高优先级的配置覆盖,尤其是语言专属或工作区级设置。
必须检查以下三处:
- 执行
Ctrl+Shift+P→Preferences: Open Workspace Settings (JSON),查看.vscode/settings.json是否存在类似"[typescript]": { "editor.formatOnSave": false }的语句——它会直接屏蔽 TS 文件的自动格式化 - 打开命令面板,输入
Format Document With,看当前文件是否能手动触发格式化;如果能,说明插件正常,问题出在保存钩子被关了 - 确认项目根目录下没有
.editorconfig或.prettierrc语法错误(比如用了单引号、尾随逗号),Prettier 遇到解析失败会静默退出,不报错也不格式化
Prettier 和 ESLint 同时启用导致格式化错乱
二者都试图改代码,但规则冲突(比如 ESLint 强制双引号,Prettier 设了 singleQuote: true),结果要么互相覆盖,要么保存时反复重排。
推荐做法是明确分工:
- 让 Prettier 全权负责格式化(缩进、空格、换行、引号等),ESLint 只做校验 + 自动修复(
eslint --fix) - 在 VS Code 设置中关闭 ESLint 的格式化能力:
"eslint.format.enable": false - 安装
eslint-config-prettier并在.eslintrc.js中启用,它会禁用所有与 Prettier 冲突的 ESLint 样式规则 - 避免在
.vscode/settings.json中同时开启"editor.formatOnSave": true和"eslint.autoFixOnSave": true,后者已废弃,且易引发竞争
二分法排查插件冲突:3 分钟定位真凶
当格式化结果“越来越乱”、右键菜单异常、或开发者工具里出现 Command 'xxx' is already registered 报错,基本可以断定是插件打架。
别逐个禁用,按步骤快速收网:
- 终端执行
code --disable-extensions启动干净 VS Code,测试格式化是否恢复——若恢复,100% 是插件问题 - 插件面板(
Ctrl+Shift+X)→ 右上角 “⋯” →Disable All Installed Extensions,重启 - 按功能分组启用:先开语言支持类(如
ms-python.python、ms-vscode.vscode-typescript-next),再开格式化类(esbenp.prettier-vscode、dbaeumer.vscode-eslint) - 每组启用后,立即用对应文件测试(如 JS 文件保存、Vue 模板格式化);一旦复现问题,就在该组内继续二分,比如只留
prettier,关掉eslint插件再试
最容易被忽略的是:多个格式化插件对同一语言注册了处理器,比如 esbenp.prettier-vscode 和 HookyQR.beautify 同时监听 HTML,VS Code 不会警告,只会随机选一个执行——结果就是“有时生效,有时失效”。











