当前位置: 首页 > news >正文

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),仅供参考

http://www.cnnetsun.cn/news/4197586.html

相关文章:

  • Hedge-Bench:金融智能体的硬核推理基准与实战构建指南
  • go-patterns责任链与中介者模式实战:解耦请求处理与组件通信的2个技巧
  • Lumi原理剖析:Python内省机制如何让函数自动映射为API参数?
  • Chatbox 启动教程:3 分钟搞定 npm 配置与桌面端运行
  • 3步搞定手柄键盘映射:AntiMicroX快速上手指南
  • 从树叶分类到特征工程:经典数学建模案例中的图像识别实战
  • SpaceFM|给 Linux 桌面装上一套多面板文件引擎
  • Arnis 实操教程:把真实城市搬进 Minecraft
  • Llama 3 权重下载完整指南:官方脚本与 Hugging Face 双渠道实操
  • QModMaster:免费完整的Modbus调试工具,新手5分钟连上第一台设备
  • MetricFu源码解析:Generator模板方法模式如何优雅驱动12种指标生成
  • Prism Launcher 离线启动器:十分钟完成 Minecraft 免登录离线启动配置
  • 选对一键生成论文工具告别焦虑夜!高赞工具实测 + 选择避坑
  • C++模板默认参数:提升库易用性与API设计的核心技术
  • 毕业论文选题毫无头绪,有哪些 好用的AI论文平台推荐?
  • 随机信号参数建模实战:AR/MA/ARMA模型原理、算法与应用
  • 群晖第三方包安全设计剖析:homebridge-syno-spk受限Shell与独立用户权限机制详解
  • 深入PyWebCopy配置系统:ConfigHandler与get_config的10个关键参数详解
  • IDM 激活脚本使用指南:免费激活或永久冻结 30 天试用,三步跑通
  • 3步实现《第五人格》免扫码登录:idv-login 完整使用指南
  • 模糊综合评价方法:从原理到实战,处理模糊决策的数学工具
  • DeepSeek多模态视觉理解模型上线
  • 从数学建模到工业优化:数据驱动下的催化剂组合与反应条件智能寻优
  • 基于改进MOEA/D的双目标模糊柔性作业车间调度优化
  • 计算机毕业设计之会议预约系统设计与实现
  • AI Agent 面试题 362:如何设计Agent的工具依赖管理和冲突解决?
  • ESP32 下载失败自救指南:5 分钟定位 4 类故障现场,3 条备用通路一次讲清
  • 【BFS/DFS 解决 FloodFill 算法】图像渲染
  • libuiohook 全局键盘鼠标钩子 C 库入门指南
  • GoldenDict-ng:免费词典查询工具,从装好到查出第一个词的 3 分钟攻略