Prettier 默认情况下无法格式化 Vue、WXML 等文件,根本原因在于语言 ID 不匹配——必须通过 documentSelectors 手动绑定;ESLint 检查内联 JavaScript 代码时,必须借助 eslint-plugin-html 插件;eslint-config-prettier 与 eslint-plugin-prettier 需要成对安装并按照正确顺序配置;在 VS Code 中,prettier.enable 和语言映射设置缺一不可。这些配置项看似琐碎,但缺少任何一环,编辑器都会在你按下 Ctrl+S 时保持沉默,格式化毫无反应。

在 HTML 项目中使用 Prettier 进行格式化,按理说应该很简单,但实际开发中经常遇到“保存后没有反应”“内联 JS 代码未被检查”“Vue 或 WXML 文件中格式化失效”等问题。问题根源不在于工具本身,而在于默认配置根本没有覆盖真实业务场景。
为什么 Prettier 默认只格式化 .html 文件?
Prettier 的 parser 默认只识别 html 这个语言 ID,但 VS Code 在遇到 .vue、.wxml、.astro 等文件时,会自动将其识别为对应的语言类型(比如 vue),而不是 html。这就导致了一个尴尬局面:你按下了保存快捷键,Prettier 却根本收不到任何格式化请求。
- 首先检查右下角状态栏的语言模式,如果显示的是
Vue或WXML,说明语言 ID 没有匹配上。 - 需要显式配置
prettier.documentSelectors,例如设置为["*.vue", "*.wxml", "*.html"]。 - 对于
.vue文件,还需要开启prettier.vueIndentScriptAndStyle: true,否则和代码块内的缩进规则将无法生效。 - 如果使用的是旧版 Prettier(比如 3.x 版本),其对小程序语法的支持可能不够稳定,建议降级到
2.8.8版本,同时关闭htmlWhitespaceSensitivity这类选项。
eslint-plugin-html 是 HTML 内联脚本检查的唯一入口
ESLint 默认会将 HTML 文件中的 代码块当作普通字符串直接跳过,不会对其解析 AST。因此,即便你在 中写了 console.log 或者遗留了未使用的变量,no-console 和 no-unused-vars 规则也完全不会触发。
- 必须安装并启用
eslint-plugin-html插件,它会将 HTML 文件拆解开来,把代码块提取为 JavaScript 文本,再交给 ESLint 进行处理。 - 在
.eslintrc.cjs配置文件的plugins数组中添加"html"。 - 同时需要配置
overrides来匹配 HTML 文件路径,例如{ files: ["**/*.html"], processor: "html/html" }。 - 如果项目中还包含
.vue文件,更推荐直接使用@vue/eslint-config-prettier来替代通用插件,因为它已经内置了 HTML 脚本提取的相关逻辑。
eslint-config-prettier 和 eslint-plugin-prettier 必须成对出现
如果只安装了 eslint-plugin-prettier 会带来什么后果?ESLint 一方面执行自身的 indent、quotes 等规则,另一方面又让 Prettier “再格式化一遍”,最终导致大量冲突警告——比如 Expected indentation of 2 characters 和 Strings must use singlequote 同时亮起红灯,令人困惑。
eslint-plugin-prettier负责将 Prettier 的规则转换为 ESLint 可执行的规则(例如prettier/prettier)。eslint-config-prettier的作用正好相反:它会关闭 ESLint 原生所有与格式相关的规则(包括indent、semi、quotes等)。- 在
extends数组中,"plugin:prettier/recommended"必须放在最后一位,否则会被前面的配置(比如airbnb)覆盖掉。 - 验证配置是否生效也很简单:运行
npx eslint --print-config index.html | grep -A5 prettier,如果看到"prettier/prettier": "error"且没有quotes类规则残留,说明配置成功。
VS Code 中 prettier.enable 和语言标识缺一不可
即使项目配置文件全部就绪,如果 VS Code 插件没有启用或者语言 ID 绑定错误,格式化依然无法正常工作。这并非项目配置的问题,而是编辑器层面遗漏了关键开关。
- 无论是用户设置还是工作区设置,都必须将
prettier.enable: true打开(默认值为false)。 - 确认
files.associations是否正确映射了文件扩展名,例如"*.wxml": "wxml",否则插件连语言类型都无法识别。 - 如果使用
.prettierrc.cjs配置文件,请确保导出的是对象而不是函数——Prettier 2.8 以上版本已经不再支持动态配置函数。 - 最好禁用其他格式化插件(比如 Beautify),避免它们与 Prettier 争夺
formatOnSave的控制权。
真正麻烦的从来不是配置了多少行代码,而是当 HTML 中混合了 JS、CSS、模板语法时,每个环节都需要单独打通语言识别、AST 解析、规则注入这三层链路。少一个 documentSelectors,少一个 processor,就会卡死在“看起来配好了,实际上没生效”的状态里。
