禁用 Vetur 是唯一可行的过渡动作,因其不支持 Vue 3 的 defineProps、ref、v-model 补全及模板类型推导,且解析器未实现 script setup 响应式追踪与泛型声明识别。

停用 Vetur,不是“配置它”,而是彻底让出控制权——Vue 3 的 defineProps、ref、v-model 补全、模板内类型推导,Vetur 根本不支持,硬配只会让红线越来越多。
为什么禁用 Vetur 是唯一可行的过渡动作
Vetur 是 Vue 2 时代的语言服务器,它的解析器没实现 script setup 的响应式绑定追踪,也不认识 defineEmits<{ click: [] }>() 这类泛型声明。你看到的 Module '"xxx.vue"' has no default export、Cannot find name 'defineProps'、Unknown html tag 全是它在用 Vue 2 规则强行校验 Vue 3 代码的结果。
所谓“过渡方案”,不是调低 Vetur 的校验等级,而是切断它对 .vue 文件的接管链路:
- 在 VSCode 扩展面板中搜索
Vetur,点击齿轮图标 → 选择「禁用工作区」(推荐)或「卸载」 - 检查
settings.json(全局或工作区)是否残留"vetur.*"配置项,全部删掉 - 确认右下角状态栏显示的是
Vue(来自 Volar 或 Vue - Official),不是Vetur或HTML
必须开启 Volar 的 experimental.templateInterpolationService
禁用 Vetur 后,如果模板里 {{ count + 1 }} 还是没类型提示、跳转不到 count 定义处,说明 Volar 的模板插值服务没开——它默认关闭,因为会对性能有轻微影响。
立即学习“前端免费学习笔记(深入)”;
手动启用方式(二选一):
- 打开设置(
Ctrl+,),搜volar experimental template,勾选Volar > Experimental: Template Interpolation Service - 或在项目根目录
.vscode/settings.json中添加:"volar.experimental.templateInterpolationService": true
注意:该选项只对 <script setup> 有效;若项目混用 Options API,还需额外加 "volar.optionsApiSetupHelper": true。
defineProps 类型不生效?补显式泛型声明
写 defineProps({ msg: String }),Volar 推不出 msg 是 string | undefined,导致 {{ msg.trim() }} 报错。这不是插件问题,是 TS 类型信息缺失。
正确写法必须带泛型,且推荐使用 PropType 断言:
import { defineProps, PropType } from 'vue'
<p>const props = defineProps({
msg: {
type: String as PropType<string>,
required: true
}
})或者更简洁的运行时 + 编译时双保险写法(Vue 3.3+):
const props = defineProps<{ msg: string }>()不写泛型 → 模板内所有基于 props 的访问都会失去类型保护,Volar 无法标记合法/非法调用。
重启窗口这一步不能跳过
Volar 的 Take Over Mode、文件关联("files.associations": {"*.vue": "vue"})、TS 类型服务加载,全部依赖 VSCode 窗口级重启。改完配置按 Ctrl+Shift+P → 输入 Developer: Reload Window 才算真正生效。
最常被忽略的其实是语言模式识别:哪怕装了 Volar,VSCode 仍可能把 .vue 当作 Plain Text 处理。务必点右下角语言标识,手动选 Vue —— 如果列表里没有,说明 Volar 插件未激活或项目缺少 vue 依赖。


















