volar是vue 3官方推荐的唯一语言支持插件,必须禁用vetur以避免类型提示错乱、ref解析失败和defineprops类型丢失;其基于@vue/language-core深度集成vue编译器接口,精准推导响应式类型与模板语义。

Vue 3 项目里,Volar 是唯一应启用的 Vue 语言支持插件,Vetur 必须禁用——两者共存会导致类型提示错乱、ref() 解析失败、defineProps 类型丢失等硬伤。
为什么 Volar 要替代 Vetur
Vue 3 的响应式系统和组合式 API(如 setup()、defineProps、defineEmits)依赖 TypeScript 的语义分析能力,而 Vetur 基于旧版 AST 解析,无法正确推导泛型参数或响应式包装后的类型。Volar 使用官方维护的 @vue/language-core,直接对接 Vue 编译器的类型接口,能精准提示 props.msg 的类型、emit('update:modelValue') 的参数签名。
-
Vetur在.vue文件中对<script setup></script>的支持是模拟的,补全项常为空或仅显示any -
Volar启用后,Ctrl+Click跳转到defineProps定义处可看到完整类型定义,hover显示props: { id: number; name?: string } - 若已装
Vetur,必须在插件列表中右键 → “禁用工作区” 或 “禁用全局”,不能只停用;否则它仍会劫持.vue文件的语言模式
Vue Volar extension Pack 一键配齐
单独安装 Volar 扩展(由 Vue 官方发布)虽可行,但需手动启用 TypeScript Vue Plugin 并配置 tsconfig.json 中的 "plugins" 字段。更稳的方式是装 Vue Volar extension Pack——它自动包含:Volar(语言服务器)、TypeScript Vue Plugin(TS 类型桥接)、Volar: Vue Language Features(语法高亮与 Emmet 支持)。
微软正式发布 Visual Studio Code 1.118 版本 。本次更新重点强化了 AI 开发体验与企业管理能力,其中最引人注目的是新增 Copilot CLI 远程控制功能,允许开发者通过手机或网页远程监控和接管 AI 会话 。同时,为了提高 AI 的运行性价比,新版本优化了令牌缓存策略以降低成本 。此外,1.118 版还引入了 Chronicle 本地历史追踪、TypeScript 7.0 支持以及更严格的企业级访问管控 。
- 安装后务必重启 VS Code,否则
language-features不加载,Tab补全template标签会失效 - 打开任意
.vue文件,状态栏右下角应显示Vue (Volar),而非Vue (Vetur)或HTML - 若仍显示
HTML,说明文件关联被覆盖:右键编辑器标签 → “重新选择语言模式” → 选Vue,并勾选“将 '.vue' 保存为 Vue”
路径别名和组件自动导入补全
import { useUser } from '@/composables/user' 这类写法能补全,前提是项目有正确的 jsconfig.json 或 tsconfig.json,且 Volar 已识别该配置。否则 @/ 会被当作普通路径,补全只列出文件夹,不解析映射关系。
- 检查根目录是否存在
tsconfig.json,其中必须含:{ "compilerOptions": { "baseUrl": ".", "paths": { "@/*": ["src/*"] } } } -
paths中的通配符*不能省略,写成"@/": ["src/"]会导致补全失效 - 使用
unplugin-auto-import或unplugin-vue-components时,其生成的声明文件(如auto-imports.d.ts)需被 TS 语言服务读取:确保tsconfig.json的"include"包含该路径,例如"include": ["src/**/*", "auto-imports.d.ts"]
Template 中 class 和 ref 的补全为何不生效
<div :class="xxx"> 里的 <code>xxx 不提示,或 <input ref="inputRef"> 后 inputRef 在 setup() 中无类型推导,通常不是插件问题,而是缺少 defineComponent 封装或 ref 类型未显式标注。
- 纯
<script setup></script>中,const inputRef = ref<htmlinputelement null>(null)</htmlinputelement>必须写泛型,否则 Volar 无法推断 DOM 类型 -
<template></template>内的 class 补全依赖HTML CSS Support插件,但该插件需配合项目中真实存在的.css/.scss文件;若用unocss或tailwindcss,要额外装Tailwind CSS IntelliSense - Emmet 补全(如输入
div.my-class+Tab)需确认设置中emerald.emmet.includeLanguages已添加"vue-html",否则只在.html文件生效
最易被忽略的一点:Volar 的类型提示深度依赖 node_modules 中 @vue/runtime-dom 和 @vue/reactivity 的类型声明。如果项目用 pnpm 或 yarn pnp,且未生成 .pnp.cjs 兼容层,Volar 可能静默跳过类型加载——此时 ref 提示只有 any,需检查 Developer Tools 控制台是否有 Cannot find module '@vue/runtime-dom' 报错。










