news 2026/8/24 16:59:06

nvim-lspconfig Vue 语言服务器完整配置指南:vue_ls 与 vtsls 双服务器 3 场景实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
nvim-lspconfig Vue 语言服务器完整配置指南:vue_ls 与 vtsls 双服务器 3 场景实战

nvim-lspconfig Vue 语言服务器完整配置指南:vue_ls 与 vtsls 双服务器 3 场景实战

【免费下载链接】nvim-lspconfigQuickstart configs for Nvim LSP项目地址: https://gitcode.com/GitHub_Trending/nv/nvim-lspconfig

nvim-lspconfig 是 Neovim 的 LSP 快速起步配置集合,内置了几百个语言服务器的默认参数。对于 Vue 项目,当前主线版本中官方推荐的服务器组合是 vue_ls(Vue 官方语言服务器)加 vtsls(TypeScript 语言服务的 Neovim 封装)。本文按场景给出可直接粘贴的配置、排障对照表和自查清单,适合第一次在 Neovim 中搭建 Vue 开发环境的读者。

先说结论:用 vue_ls + vtsls 这套组合

如果项目基于 Vue 3,直接启用 vue_ls 与 vtsls 两个服务器,并给 vtsls 挂载 @vue/typescript-plugin 插件,即可获得模板(HTML/CSS)与 script 块(TypeScript)的完整支持。旧的 volar 配置在新版 nvim-lspconfig 中已改名并标记弃用,写volar会自动映射到 vue_ls 并触发弃用警告(见 lsp/volar.lua),存量配置建议直接改名过渡。

背景知识一句话:早期 Vue 语言服务器有 "takeover mode"(接管模式),由它一个服务器承包 .vue 文件里所有代码的智能提示;v3.0.0 起该模式被移除,服务器改为 "hybrid mode"(混合模式)——只独占处理 HTML 与 CSS 部分,TypeScript 相关请求转发给外部 TS 服务器。这就是必须引入第二个服务器的原因。

对比项旧配置:volar 单服务器新配置:vue_ls + vtsls
服务器数量1 个2 个协同
TypeScript 支持依赖服务器内置能力,随版本移除vtsls 加载 @vue/typescript-plugin 提供
在仓库中的状态已改名弃用,启用会收到警告当前主线推荐
模板 / 样式支持单服务器全权负责vue_ls 独占 HTML/CSS
Vue 2 兼容随服务器升级失效需显式设置vue.target = 2
适用场景仅存量旧配置的平滑过渡Vue 3 新项目与存量项目

安装两个服务器(需要 Node.js 与 npm 环境):

# 全局安装 Vue 官方语言服务器与 vtsls npm install -g @vue/language-server @vtsls/language-server

适用版本:新版 nvim-lspconfig 主线(volar 已更名为 vue_ls 的版本),Neovim 0.10 及以上(vtsls 的项目根判定在 0.11.3 后行为略有差异,但配置写法一致)。

场景一:最小配置——让 .vue 文件先有基础提示

本节只解决一件事:让 .vue 文件尽快具备基本提示,适合先跑通再细调的用户。

-- 启用 Vue 官方语言服务器:负责 .vue 文件的 HTML/CSS 部分 vim.lsp.enable('vue_ls') -- 启用 vtsls:负责 script 块,建议与上一行同时启用 vim.lsp.enable('vtsls')

vue_ls 默认绑定vue文件类型,并以package.json作为项目根标记(见 lsp/vue_ls.lua)。如果只启用 vue_ls,script 块里不会有任何 TypeScript 提示——这是混合模式的设计,不是配置错误。

场景二:TypeScript 完整支持——vue_ls 与 vtsls 协同配置

这是绝大多数 Vue 3 + TypeScript 项目需要的完整形态,也是本文的重点。核心动作只有一个:把 @vue/typescript-plugin 注册进 vtsls 的 globalPlugins,并让 vtsls 接管 vue 文件类型。

-- 插件位置:@vue/language-server 包内部的 node_modules local vue_language_server_path = vim.fn.stdpath('data') .. '/mason/packages/vue-language-server/node_modules/@vue/language-server' local vue_plugin = { name = '@vue/typescript-plugin', location = vue_language_server_path, -- 必须指定,缺省会直接失效 languages = { 'vue' }, -- 必须包含 'vue',即使 filetypes 已列出 configNamespace = 'typescript', } vim.lsp.config('vtsls', { settings = { vtsls = { tsserver = { globalPlugins = { vue_plugin } } }, }, -- 扩展 vtsls 支持的文件类型,纳入 Vue 单文件组件 filetypes = { 'typescript', 'javascript', 'javascriptreact', 'typescriptreact', 'vue' }, })

三点说明:

  • location示例基于 mason.nvim v2 的安装路径。若用 npm 全局安装,可改为vue-language-server可执行文件所在目录下的node_modules/@vue/language-server;mason.nvim v1 用户可用require('mason-registry').get_package('vue-language-server'):get_install_path()取路径。
  • vue_ls 侧的转发逻辑已内置:它监听tsserver/request请求,自动在当前 buffer 上寻找 ts_ls / vtsls / typescript-tools 客户端并转发,找不到时会重试 10 次。无需手写任何转发代码。
  • ⚠️ 不要同时启用 vtsls 与 ts_ls,官方文档明确不建议两者并存。

场景三:Vue 2 遗留项目的兼容性参数检查

本节仅适用于仍在维护 Vue 2 代码库的团队。vue_ls 默认按 Vue 3 处理,Vue 2 项目需要显式声明 target,并确认编译器包版本配套。

-- 告诉语言服务器按 Vue 2 语法解析模板 vim.lsp.config('vue_ls', { settings = { vue = { target = 2 } }, }) vim.lsp.enable('vue_ls')

若模板仍报语法错误,💡 优先检查项目依赖:需要@vue/compiler-sfc的 2.x 版本,而不是 3.x。

场景四:大型项目——按需加载与 Mason 统一管理

面向多包大仓库、或希望降低 Neovim 启动开销的用户。思路是延迟到打开 Vue 文件时才拉起服务器,并交给 mason.nvim 统一安装,省去手写安装路径。

-- 按需加载:打开 vue 文件时才启用两个服务器 vim.api.nvim_create_autocmd('FileType', { pattern = 'vue', callback = function() vim.lsp.enable('vue_ls') vim.lsp.enable('vtsls') end, })
-- 由 mason.nvim 统一安装与管理,场景二的 location 路径即由此而来 require('mason').setup() require('mason-lspconfig').setup({ ensure_installed = { 'vue_ls', 'vtsls' } })

monorepo 无需特殊处理:vtsls 会自动为每个子包定位对应的 tsconfig.json / jsconfig.json,不会为每个包多开实例(见 lsp/vtsls.lua 的 root_dir 逻辑)。建议整个工作区使用同一版本的 TypeScript。

症状诊断表

按症状对号入座,从上往下逐行核对:

症状最可能原因修复方式
.vue 的 script 块无补全、无诊断vtsls 未启用,或 globalPlugins 的languages缺少'vue'确认vim.lsp.enable('vtsls')存在;检查vue_plugin.languages = { 'vue' }
报错 "Could not findts_ls,vtsls, ortypescript-toolslsp client"vue_ls 发出 TS 请求时找不到可用的 TS 客户端启用 vtsls 并确认其成功附着;内置 handler 会重试 10 次,仍报错说明 TS 服务器未启动
打开 .vue 文件后服务器不启动npm 包未安装或不在 PATH重新执行全局安装命令,用:checkhealth lsp检查状态
Vue 2 项目模板报错、提示 Vue 3 语法问题未声明 Vue 版本,vue_ls 默认按 Vue 3 处理设置settings.vue.target = 2,并确认@vue/compiler-sfc为 2.x
monorepo 子包没有 TS 支持子包缺少 tsconfig.json / jsconfig.json为各包补齐配置;vtsls 自动按包定位,无需多开实例

配置完成后的自查清单

逐项打勾,全部通过即可收工:

  • vue_ls 与 vtsls 均已通过vim.lsp.enable启用
  • vue_plugin.languages包含'vue'
  • vtsls 的filetypes包含'vue'
  • 没有同时启用 ts_ls 与 vtsls
  • :checkhealth lsp中,两个服务器对 .vue buffer 均显示已附着

延伸阅读

  • 全部内置服务器的完整文档:doc/configs.md
  • vue_ls 默认配置与请求转发源码:lsp/vue_ls.lua
  • vtsls 默认配置,含 Vue 插件示例与 monorepo 说明:lsp/vtsls.lua

如配置中遇到问题,建议直接在 nvim-lspconfig 项目仓库提交 issue,附上:checkhealth lsp的输出与 Neovim 版本,方便维护者复现。

【免费下载链接】nvim-lspconfigQuickstart configs for Nvim LSP项目地址: https://gitcode.com/GitHub_Trending/nv/nvim-lspconfig

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 16:57:17

Hedge-Bench:金融智能体的硬核推理基准与实战构建指南

1. 项目概述:为什么我们需要一个“硬核”的金融推理基准?最近和几个做量化策略和金融科技的朋友聊天,大家都有一个共同的痛点:现在市面上各种大语言模型(LLM)和智能体(Agent)满天飞&…

作者头像 李华
网站建设 2026/8/24 16:53:57

Lumi原理剖析:Python内省机制如何让函数自动映射为API参数?

Lumi原理剖析:Python内省机制如何让函数自动映射为API参数? 【免费下载链接】lumi Lumi is an nano framework to convert your python functions into a REST API without any extra headache. 项目地址: https://gitcode.com/gh_mirrors/lu/lumi …

作者头像 李华
网站建设 2026/8/24 16:53:12

Chatbox 启动教程:3 分钟搞定 npm 配置与桌面端运行

Chatbox 启动教程:3 分钟搞定 npm 配置与桌面端运行 【免费下载链接】chatbox Powerful AI Client 项目地址: https://gitcode.com/GitHub_Trending/ch/chatbox 把 Chatbox 的仓库拉到本地,下一步却不知道怎么启动——仓库里看不到可执行文件&…

作者头像 李华
网站建设 2026/8/24 16:51:26

3步搞定手柄键盘映射:AntiMicroX快速上手指南

3步搞定手柄键盘映射:AntiMicroX快速上手指南 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https://gitcode.com/GitHub_Trendi…

作者头像 李华
网站建设 2026/8/24 16:50:30

从树叶分类到特征工程:经典数学建模案例中的图像识别实战

1. 项目概述:从一片叶子到一套算法2012年的全国大学生数学建模竞赛A题“树叶的分类”,即使放在今天来看,也是一个极具启发性的经典赛题。它要求参赛者仅凭一片叶子的扫描图像,就能判断出它属于哪种树。这听起来像是植物学家的专长…

作者头像 李华