editorconfig 与 prettier 缩进配置冲突导致光标错位:.editorconfig 的 indent_size 仅控制回车缩进,.prettierrc 的 tabwidth 才决定保存后实际缩进;应删除前者中的缩进配置,交由后者统一管理。

EditorConfig 和 Prettier 缩进不一致导致光标新行插错空格
这是最常被忽略的“假生效”现象:.editorconfig 的 indent_size = 4 只影响你按回车时自动插入的缩进字符数;而 .prettierrc 的 tabWidth: 2 才决定保存时所有代码块的实际缩进宽度。两者值不同,就会出现“保存后缩进是 2 格,但新起一行光标却塞了 4 个空格”的错位。
解决办法不是调和二者,而是明确分工:
-
.editorconfig仅保留基础元信息:charset、end_of_line、insert_final_newline、trim_trailing_whitespace - 所有缩进、引号、分号、尾逗号等风格控制,全部交给
.prettierrc - 删掉
.editorconfig中的indent_style和indent_size行(哪怕只留着也得注释掉)
VSCode 设置里同时启用了 editor.formatOnSave 和 editor.codeActionsOnSave
这两个开关看似都跟“保存时干活”有关,但行为完全不同:editor.formatOnSave 调用的是默认格式化器(比如 esbenp.prettier-vscode),而 editor.codeActionsOnSave 可能触发 ESLint 的自动修复、TypeScript 的快速修复,甚至某些插件的隐藏副作用——比如重写 import 排序或补全缺失的 default 导出。
一旦开启 editor.codeActionsOnSave,它可能在 Prettier 格式化完后立刻再改一遍,造成属性换行错乱、空行增减异常等问题。
实操建议:
- 先清空
editor.codeActionsOnSave字段(设为{}或直接删掉) - 确认
editor.formatOnSave为true,且只对目标语言启用,例如:"[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" } - 如果真需要 ESLint 自动修复,改用
"editor.codeActionsOnSave": { "source.fixAll.eslint": true },并确保已安装eslint-config-prettier关闭所有与 Prettier 冲突的规则
Prettier 插件未识别 .prettierrc 或配置加载失败
VSCode 的 esbenp.prettier-vscode 插件不会无脑读取项目根目录下的 .prettierrc。它有一套严格的加载顺序和格式校验逻辑。常见失效原因包括:
-
.prettierrc文件名拼错(比如写成.prettier.json或prettierrc.json) - 文件内容 JSON 语法错误(多逗号、单引号、注释)——Prettier 不支持 JSONC,必须是纯 JSON 或 JS/TS 导出格式
- 配置项写错,例如把
trailingComma写成trailing_comma,或值填了"es6"(正确是"es5"或"all") - VSCode 工作区设置(
.vscode/settings.json)中覆盖了prettier.*配置,且值非法(如"prettier.tabWidth": "2"写成字符串而非数字)
验证方式:打开命令面板(Ctrl+Shift+P),运行 Prettier: Show Output,看输出窗口是否报 Failed to load config 或 Invalid configuration。
Vue/React 模板文件里 Prettier 格式化崩坏或报错
原生 Prettier 对 <template></template> 或 {% raw %}{{ }}{% endraw %} 这类非标准 HTML 结构支持有限。如果你没显式指定 parser,它会按默认 html 解析器处理,结果就是属性挤成一行、指令被截断、甚至抛出 Unexpected token 错误。
关键动作只有两个:
- 在
.prettierrc中强制指定"parser": "html"(不是vue,也不是angular;Prettier 本身不内置 vue parser) - 卸载或禁用
prettier-plugin-vue——除非你确认它已正确安装、版本匹配且在.prettierrc中通过"plugins": ["prettier-plugin-vue"]显式声明。否则它只会让 Prettier 启动时报Cannot find module 'prettier-plugin-vue'
顺带一提:vscode-html-languageservice(VS Code 内置)和 esbenp.prettier-vscode 不能同时设为 HTML 类型的默认格式器,否则保存时会随机触发其中一个,结果不可预测。











