prettier 单独无法正确格式化 vue 文件,因其默认只处理 部分且不识别 和 语法;必须配合 volar 插件,由其整体解析 .vue 文件并调用对应语言服务分别格式化各区块。

Prettier 是 Vue 项目代码自动格式化的事实标准,但单独装它不够——必须配合 Volar 和正确配置,否则 .vue 文件的模板、脚本、样式三部分会格式错乱或完全不生效。
为什么 Prettier 单独不能正确格式化 Vue 文件
Vetur 已被官方弃用,而旧版 Prettier 插件(esbenp.prettier-vscode)默认不识别 .vue 中的 <template></template> 和 <style></style> 块语法。它只处理 <script></script> 部分,且可能把 HTML 模板当成普通字符串胡乱换行。
真正起作用的是 Volar 提供的内置格式化能力,它把 .vue 当作整体解析,并调用对应语言服务(如 TypeScript、CSS、HTML)分别处理各区块。
- 确保已卸载
vetur(冲突严重,会导致格式化失效或报错Cannot find module 'vue-language-tools') - 安装
volar(ID:johnsoncodehk.volar),它是 Vue 3 官方推荐的唯一语言支持插件 -
prettier仍需保留,用于统一<script></script>和<style></style>的风格(比如单引号、缩进),但必须交由 Volar 触发,而非直接设为editor.defaultFormatter
Vue 项目 settings.json 关键配置项
以下配置直接写入工作区(.vscode/settings.json)最稳妥,避免全局设置污染其他项目:
{
"editor.formatOnSave": true,
"editor.formatOnPaste": true,
"[vue]": {
"editor.defaultFormatter": "johnsoncodehk.volar"
},
"[typescript]": {
"editor.defaultFormatter": "johnsoncodehk.volar"
},
"[javascript]": {
"editor.defaultFormatter": "johnsoncodehk.volar"
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[scss]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"volar.format.enable": true,
"volar.format.scriptInitialIndent": false,
"volar.format.styleInitialIndent": false
}
注意点:
分析 Vue 3 Composition API 使用情况——审计响应式模式、可组合函数设计、ref 与 reactive 的选择、计算属性、watcher 使用及组件……
-
"[vue]"必须指向volar,不是prettier;否则保存时无反应 -
volar.format.enable默认为true,但显式声明可防被 workspace 设置覆盖 -
scriptInitialIndent和styleInitialIndent设为false,否则<script setup></script>里的代码会被多缩进一层
如何验证格式化是否真在工作
别依赖快捷键 Shift+Alt+F —— 它可能调用错 formatter。用命令面板更可靠:
- 按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS) - 输入
Format Document With...→ 回车 - 选择
Configure Default Formatter...→ 点击vue→ 选Vue - Volar - 再试一次
Format Document With...,这次应明确显示 “Volar” 在顶部
如果仍失败,检查右下角状态栏:点击语言模式(如 “Vue”),确认它显示的是 Vue (Volar) 而非 Vue 或 Vue (Vetur)。后者说明插件未正确激活。
常见格式化失败原因与绕过方案
遇到 Failed to format document 或保存后无变化,优先排查:
-
node_modules没装全?运行npm install或yarn install确保@vue/language-core存在 - 项目根目录有
tsconfig.json或jsconfig.json吗?没有的话 Volar 无法推导类型,格式化会退化为纯文本处理 - 用了
defineProps<...>()</...>但没配compilerOptions.isCustomElement?不影响格式化,但可能导致类型提示失效,间接让 Volar 拒绝格式化脚本块 - 临时救急:右键 →
Format Document With→ 选Prettier,仅对<script></script>部分生效,但会破坏<template></template>结构
真正稳定的格式化,永远建立在 Volar 正确加载 + 项目配置完整的基础上。任何跳过这一步、硬塞 Prettier 到 [vue] 的做法,迟早会在 <template></template> 里看到莫名其妙的换行和引号转义。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










