尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

vetur和Volar是什么?Vue 项目 VS Code 插件选型与 TypeScript 支持对比

vetur和Volar是什么?Vue 项目 VS Code 插件选型与 TypeScript 支持对比 1. 从 Vue2 迁移到 Vue3 时Vetur 和 Volar 到底该留哪个如果你正在把一个跑了两三年的 Vue2 项目往 Vue3 上搬打开 VS Code 的那一刻大概率会先愣一下.vue文件里的script setup一片灰模板里绑定的变量点进去没有类型提示defineProps写错了也不报红。这不是你的代码写错了而是编辑器里那个叫 Vetur 的插件根本不认识 Vue3 的新语法。Vetur 是 Vue2 时代的官方 VS Code 插件它让编辑器能读懂.vue文件提供语法高亮、组件补全、错误检查和格式化。在 Vue2 的 Options API 时代它几乎是每个 Vue 开发者的必装项。但 Vue3 带来了script setup、Composition API、模板类型推导这些新东西Vetur 对它们的支持只停留在“能高亮、不报错”的层面类型提示基本靠猜。Volar 就是来接班的。它现在在 VS Code 扩展商店里的正式名字叫Vue - Official底层跑的是vue/language-server这个语言服务器。你可以把 Volar 理解成 Vue 文件的“专属智能引擎”它把template、script、style三块当成一个整体来分析模板里用的变量能准确追溯到 script 里的定义defineProps声明的类型能直接作用到模板的补全上。这是 Vetur 做不到的。关键问题是Vetur 和 Volar 不能同时启用。两个插件都会去接管.vue文件的语言服务同时开着会出现补全错乱、类型提示闪烁、甚至 VS Code 卡死。所以迁移的第一步不是改代码而是先把编辑器插件理清楚。这篇文章面向的就是从 Vue2 往 Vue3 迁移的开发者我会给出可直接复制的settings.json配置、插件启用/禁用的具体步骤以及用同一个.vue文件对比 Vetur 和 Volar 在模板补全与类型报错上的差异。你跟着做一遍就能判断自己的项目该留哪个、怎么配。2. TaoToken 前置给 Vue3 项目接一个稳定的模型补全后端在正式对比 Vetur 和 Volar 之前先说一个实际开发中绕不开的环节。Volar 的类型提示是本地语言服务器算出来的不依赖网络但如果你在 VS Code 里装了 Copilot 类的 AI 补全插件或者用 Cline、Continue 这类工具做代码生成它们需要一个模型 API 后端。迁移 Vue3 的过程中script setup的写法、defineEmits的类型签名、withDefaults的用法这些新语法问模型比翻文档快得多。我自己的做法是把模型调用统一走 TaoToken 的 API。它的接口地址是https://taotoken.net/api兼容 OpenAI 的请求格式所以在 VS Code 插件里配置时Base URL 填这个地址就行。API Key 在控制台里生成地址是https://taotoken.net/api-keys生成后复制出来注意不要提交到 Git 仓库里。模型 ID 这块做 Vue3 代码补全和类型解释用claude-sonnet-4-20250514或者gpt-4o都行前者在长上下文和代码理解上更稳一些。如果你只是偶尔问一下语法用gpt-4o-mini也够成本低很多。具体在插件里怎么填取决于你用哪个工具如果你用Cline在 VS Code 设置里找到 Cline 的配置API Provider 选 OpenAI CompatibleBase URL 填https://taotoken.net/apiAPI Key 填你生成的 keyModel ID 填claude-sonnet-4-20250514。如果你用Continue编辑~/.continue/config.json在models数组里加一项provider写openaiapiBase写https://taotoken.net/apiapiKey写你的 keymodel写模型 ID。如果你用Claude Code它的配置文件在~/.claude/settings.json里面可以配env字段把ANTHROPIC_BASE_URL指向https://taotoken.net/apiANTHROPIC_API_KEY填你的 key。不过 Claude Code 默认走 Anthropic 的协议TaoToken 这边对 Anthropic 协议的支持情况建议先到接入文档里确认一下地址是https://taotoken.net/doc。这里要提醒一句TaoToken 是模型 API 的接入层不是编辑器插件它不会替代 Volar 做类型检查。Volar 负责的是 Vue 语言服务TaoToken 负责的是你问模型时的请求转发两者各管各的。你可以在 Volar 报类型错误的时候把错误信息复制出来问模型让它解释defineProps的泛型该怎么写这样配合起来效率最高。配置完之后建议先用一个最简单的请求验证一下通不通。在终端里执行curl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer 你的API_KEY \ -d { model: claude-sonnet-4-20250514, messages: [{role: user, content: 用一句话解释 Vue3 的 defineProps 泛型写法}] }如果返回里有choices字段和正常的文本内容说明 key 和地址都没问题。如果返回 401检查 key 是不是复制错了或者过期了如果返回local proxy failed之类的错误检查 Base URL 是不是多写了/v1或者少写了。这些排查动作在后面的章节里还会展开。3. 可复制配置settings.json 里 Vetur 与 Volar 的启用/禁用写法这一节是整篇文章最核心的操作部分。VS Code 的插件启用状态和配置都落在settings.json里路径分两级用户级在~/.config/Code/User/settings.jsonLinux/macOS或%APPDATA%\Code\User\settings.jsonWindows工作区级在项目根目录的.vscode/settings.json。迁移 Vue3 项目时我建议把插件相关的配置写在工作区级这样不同项目可以有不同的插件策略不会互相干扰。先看 Vetur 的禁用写法。Vetur 的插件 ID 是octref.vetur在settings.json里可以用extensions.recommendations和extensions.unwantedRecommendations来管理但真正控制启用状态的是vetur相关的配置项。如果你已经装了 Vetur 但想在当前 Vue3 项目里禁用它最干净的做法是在工作区设置里把 Vetur 的所有功能关掉{ vetur.validation.template: false, vetur.validation.script: false, vetur.validation.style: false, vetur.format.enable: false, vetur.completion.autoImport: false, vetur.experimental.templateInterpolationService: false }这样配完之后Vetur 虽然还装在 VS Code 里但对当前项目不再提供任何语言服务不会和 Volar 抢.vue文件的控制权。如果你确定整个机器上都不再需要 Vetur可以直接在扩展面板里卸载它卸载后上面的配置项会变成灰色不影响使用。再看 Volar 的配置。Volar 的插件 ID 是vue.volar在扩展商店里显示为Vue - Official。它的核心配置项是vue.server和vue.editor开头的。一个适合 Vue3 迁移项目的settings.json片段如下{ vue.server.hybridMode: true, vue.server.maxFileSize: 2097152, vue.editor.templateInterpolation: true, vue.editor.templateInterpolationSyntax: vue3, vue.editor.autoInsertDot: true, vue.editor.formatScriptBlock: true, vue.editor.formatTemplateBlock: true, typescript.tsdk: node_modules/typescript/lib, typescript.enablePromptUseWorkspaceTsdk: true }这里有几个点值得展开。vue.server.hybridMode设为true是让 Volar 在混合模式下运行对 Vue2.7 和 Vue3 的兼容性更好如果你项目里还有少量 Vue2 的 Options API 组件这个选项能减少误报。vue.editor.templateInterpolationSyntax设为vue3是明确告诉 Volar 按 Vue3 的模板语法来解析避免它把v-model的参数当成 Vue2 的写法处理。typescript.tsdk指向项目本地的 TypeScript 版本这一点在迁移项目里特别重要。Vetur 时代很多人用的是 VS Code 内置的 TypeScript版本可能和项目package.json里声明的不一致导致类型提示和实际编译结果对不上。把tsdk指到node_modules/typescript/libVolar 就会用项目自己的 TS 版本做类型检查vue-tsc跑出来的结果和编辑器里看到的就一致了。如果你用的是 Vue2.7 项目想试试 Volar 而不是 Vetur还需要在tsconfig.json或jsconfig.json里加一个vueCompilerOptions字段{ compilerOptions: { target: es2020, module: esnext, moduleResolution: bundler, strict: true, jsx: preserve, resolveJsonModule: true, isolatedModules: true, esModuleInterop: true, lib: [es2020, dom, dom.iterable] }, vueCompilerOptions: { target: 2.7, plugins: [vue/language-plugin-pug] }, include: [src/**/*.ts, src/**/*.d.ts, src/**/*.tsx, src/**/*.vue] }vueCompilerOptions.target设为2.7是告诉 Volar 按 Vue2.7 的语义来解析模板和脚本。如果你不设这个字段Volar 默认按 Vue3 处理Vue2.7 里的一些写法比如this.$refs的类型可能会报错。plugins字段是给 Pug 模板用的如果你项目里没用 Pug可以删掉。配置写完之后需要重启 VS Code 的语言服务才能生效。按CtrlShiftPmacOS 是CmdShiftP打开命令面板输入Developer: Reload Window回车。窗口重载后打开一个.vue文件看右下角状态栏如果显示Vue Language Server并且旁边有版本号说明 Volar 已经接管了。如果显示的是Vetur或者什么都不显示说明配置没生效检查一下settings.json的 JSON 格式有没有写错比如多了一个逗号或者少了一个引号。4. 验证请求用同一个 .vue 文件对比模板补全与类型报错配置写好了怎么确认 Volar 真的在干活、Vetur 真的没在捣乱最直接的办法是拿同一个.vue文件分别在“只开 Vetur”和“只开 Volar”两种状态下打开对比模板补全和类型报错的表现。先准备一个测试文件放在src/components/UserCard.vuescript setup langts interface User { id: number name: string email: string role: admin | editor | viewer } const props defineProps{ user: User showEmail?: boolean }() const emit defineEmits{ (e: update, id: number): void (e: delete, id: number): void }() function handleUpdate() { emit(update, props.user.id) } /script template div classuser-card h3{{ user.name }}/h3 p v-ifshowEmail{{ user.email }}/p span{{ user.role }}/span button clickhandleUpdate更新/button /div /template这个文件用到了script setup、defineProps泛型、defineEmits类型签名、模板里的v-if和事件绑定。Vetur 对script setup的支持很有限它大概率会把defineProps和defineEmits当成未定义的函数模板里的user和showEmail也拿不到类型信息。第一步只开 Vetur 的状态下验证。在扩展面板里禁用 Vue - Official启用 Vetur然后重载窗口。打开UserCard.vue把鼠标悬停在模板里的user.name上。Vetur 下你看到的提示大概率是any或者干脆没有提示。再把user.role改成user.rolVetur 不会报错因为模板里的类型检查它基本不做。在script setup里把defineProps拼错成definePropVetur 可能也不报红因为它不认识这个宏。第二步只开 Volar 的状态下验证。禁用 Vetur启用 Vue - Official重载窗口。同样打开UserCard.vue悬停在user.name上Volar 会显示(property) User.name: string因为defineProps的泛型已经传到了模板里。把user.role改成user.rolVolar 会在模板里直接标红提示Property rol does not exist on type User。把emit(update, props.user.id)改成emit(update, props.user.name)Volar 会报类型错误因为update事件的参数类型是number你传了string。第三步验证模板补全。在模板里输入span{{ user.Volar 会弹出id、name、email、role四个属性并且每个属性后面标注类型。Vetur 下这个补全列表要么不出现要么只出现id、name这种从data里猜出来的role的联合类型admin | editor | viewer不会显示。第四步验证vue-tsc命令行结果和编辑器一致。在项目根目录执行npx vue-tsc --noEmit如果 Volar 配置正确命令行报出来的错误应该和编辑器里标红的位置一致。如果命令行报错但编辑器不报或者反过来说明typescript.tsdk没指对或者 Volar 的语言服务和vue-tsc用的 TS 版本不一致。这时候回到settings.json确认typescript.tsdk指向的是node_modules/typescript/lib并且typescript.enablePromptUseWorkspaceTsdk是true。这套对比做完你就能明确判断Vue3 项目里 Volar 在类型提示和模板补全上确实比 Vetur 强一个量级而 Vetur 在script setup场景下基本处于“能高亮但帮不上忙”的状态。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth迁移过程中除了插件本身的配置问题模型 API 的调用也容易出岔子。这一节把几个高频报错和对应的排查动作列出来你遇到的时候可以按图索骥。报错一401 Unauthorized。这个最常见出现在你调用 TaoToken API 的时候。原因通常是 API Key 没填、填错、或者过期了。排查步骤先到https://taotoken.net/api-keys确认 key 还在有效期内然后检查你配置文件里的Authorization头是不是Bearer 你的key的格式注意Bearer和 key 之间有一个空格。如果你用的是 Cline 或 Continue检查插件设置里的 API Key 字段有没有多余的空格或换行。还有一种情况是 key 被提交到了 Git 仓库然后被自动吊销了检查一下.gitignore里有没有把配置文件排除掉。报错二local proxy failed。这个报错通常出现在你通过某个本地代理工具转发请求的时候。TaoToken 的 API 地址是https://taotoken.net/api如果你在插件里把 Base URL 填成了http://localhost:xxxx或者http://127.0.0.1:xxxx而本地代理没启动或者端口不对就会报这个错。排查步骤确认 Base URL 直接填https://taotoken.net/api不要经过本地转发。如果你确实需要本地代理做日志记录检查代理进程是不是在运行端口是不是和配置里的一致。另外有些插件会在 Base URL 后面自动拼/v1如果拼出来是https://taotoken.net/api/v1/v1/chat/completions也会报错检查一下插件的 URL 拼接逻辑。报错三reading choices 或 Cannot read properties of undefined (reading choices)。这个报错说明请求发出去了但返回的 JSON 结构里没有choices字段。原因可能是模型 ID 填错了服务端返回了一个错误对象而不是正常的补全结果。排查步骤先用第 2 节里的curl命令手动请求一次看返回的 JSON 里有没有choices。如果没有把完整的返回内容打印出来通常会有一个error字段说明原因比如model not found或者invalid request。确认模型 ID 拼写正确比如claude-sonnet-4-20250514不要写成claude-sonnet-4或者claude-3-sonnet。如果你用的是 Continue检查config.json里的model字段和provider字段是否匹配provider写openai时model要填 OpenAI 兼容的模型 ID。报错四OAuth 相关的错误比如 invalid_grant 或 redirect_uri_mismatch。这个通常出现在你用 Claude Code 或者某些需要 OAuth 登录的工具时。Claude Code 默认走 Anthropic 的 OAuth 流程如果你把它指向了 TaoToken 的 API 地址OAuth 流程可能走不通。排查步骤确认你用的是 API Key 模式而不是 OAuth 模式。在 Claude Code 的settings.json里把ANTHROPIC_API_KEY填成你的 TaoToken key而不是留空走 OAuth。如果工具强制要求 OAuth那就换一个支持 API Key 的工具比如 Cline 或 Continue。TaoToken 的接入文档https://taotoken.net/doc里有各工具的配置示例照着改就行。报错五Volar 和 Vetur 同时启用导致的补全错乱。这个不是 API 报错但表现很像模板里补全出来的组件名重复、类型提示一会儿有一会儿没有、VS Code 右下角的语言模式在Vue和Vetur之间跳。排查步骤打开扩展面板搜索Vetur确认它是禁用状态搜索Vue - Official确认它是启用状态。然后在命令面板里执行Developer: Reload Window。如果还是错乱检查工作区.vscode/settings.json里有没有残留的vetur.*配置项把它们全部删掉或者设为false。报错六vue-tsc报错但编辑器不报。这个说明编辑器的语言服务和命令行的 TS 版本不一致。排查步骤在 VS Code 里按CtrlShiftP输入TypeScript: Select TypeScript Version选择Use Workspace Version。然后在settings.json里确认typescript.tsdk指向node_modules/typescript/lib。如果项目里没装 TypeScript执行npm install -D typescript装一个。装完之后重启语言服务再跑npx vue-tsc --noEmit两边应该就一致了。6. 迁移收尾插件选型定了之后模型补全怎么接Vetur 和 Volar 的选型其实没有太多纠结的空间Vue3 项目用 VolarVue - OfficialVue2.7 以下的项目继续用 Vetur两者不要同时开。迁移到 Vue3 的过程中先把 Vetur 在工作区里禁用装上 Vue - Official配好settings.json里的vue.server.hybridMode和typescript.tsdk然后用一个带script setup和defineProps泛型的.vue文件验证模板补全和类型报错。这套动作走完编辑器层面的迁移就完成了。接下来是模型补全的接入。如果你在 VS Code 里用 Cline 或 Continue 做代码生成把 Base URL 指向https://taotoken.net/apiAPI Key 在https://taotoken.net/api-keys生成模型 ID 按你的场景选日常补全用gpt-4o-mini复杂类型推导和重构用claude-sonnet-4-20250514。配置写完后用curl验证一次确认返回里有choices字段。遇到 401 就检查 key遇到local proxy failed就检查 Base URL 有没有被本地代理拦截遇到reading choices就检查模型 ID 拼写。如果你打算长期在 Vue3 项目里用 AI 辅助编码比如让模型帮你把 Options API 的组件批量改成script setup或者生成defineEmits的类型签名可以考虑用 Coding Plan 把调用额度固定下来地址是https://taotoken.net/coding-plan。模型对话的入口在https://taotoken.net/chat适合临时问一些语法问题。接入文档在https://taotoken.net/doc里面有各工具的完整配置示例遇到不确定的字段可以先去那里查。最后说一个我踩过的坑迁移项目的时候不要一上来就把 Vetur 卸载了。先在当前项目的工作区设置里禁用它跑一周确认 Volar 没出问题再考虑全局卸载。因为有些老项目里可能还有 Vue2 的组件没迁完Vetur 在 Options API 下的格式化行为比 Volar 更稳定留着它作为备用等所有组件都迁到script setup之后再彻底移除。
返回列表