You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Neovim LSP的tsserver.setup中配置compilerOptions?

解决Neovim tsserver全局compilerOptions配置与root_dir冲突问题

你的核心问题在于:tsserver会根据root_dir优先查找项目本地的tsconfig.json,当你强制root_dir为项目目录时,它会忽略你在init_options里的无效配置项;而直接加载全局tsconfig又会导致root_dir变为主目录,影响LSP的项目感知能力。

以下是两种可靠的解决方案:

方案一:动态加载全局tsconfig(无本地配置时)

通过on_new_config钩子,在LSP初始化前检查项目目录是否存在本地tsconfig,不存在则指定全局tsconfig路径,同时保持root_dir为项目目录:

local util = require('lspconfig.util')

lspconfig.ts_ls.setup({
  root_dir = function(fname)
    -- 优先以.git目录作为项目根,找不到则用当前工作目录
    local root = util.root_pattern('.git')(fname)
    return root or vim.fn.getcwd()
  end,
  on_new_config = function(config, root_dir)
    -- 检查项目根目录下是否有本地tsconfig
    local local_tsconfig = util.path.join(root_dir, 'tsconfig.json')
    if not vim.loop.fs_stat(local_tsconfig) then
      -- 初始化settings结构
      config.settings = config.settings or {}
      config.settings.typescript = config.settings.typescript or {}
      config.settings.typescript.serverOptions = config.settings.typescript.serverOptions or {}
      
      -- 指定全局tsconfig路径
      config.settings.typescript.serverOptions.configFile = '/your/home/dir/tsconfig.json'
      
      -- 若需支持JS项目,同步配置javascript选项
      config.settings.javascript = config.settings.javascript or {}
      config.settings.javascript.serverOptions = config.settings.javascript.serverOptions or {}
      config.settings.javascript.serverOptions.configFile = '/your/home/dir/tsconfig.json'
    end
  end,
})

方案二:直接在LSP配置中定义compilerOptions

如果不想维护全局tsconfig文件,可以直接在configOverrides中写入compilerOptions,同样通过钩子仅在无本地配置时生效:

local util = require('lspconfig.util')

lspconfig.ts_ls.setup({
  root_dir = function(fname)
    local root = util.root_pattern('.git')(fname)
    return root or vim.fn.getcwd()
  end,
  on_new_config = function(config, root_dir)
    local local_tsconfig = util.path.join(root_dir, 'tsconfig.json')
    if not vim.loop.fs_stat(local_tsconfig) then
      config.settings = config.settings or {}
      
      -- 配置TypeScript的compilerOptions
      config.settings.typescript = {
        serverOptions = {
          configOverrides = {
            compilerOptions = {
              baseUrl = "./",
              moduleResolution = "bundler",
              allowJs = true,
            }
          }
        }
      }
      
      -- 同步配置JavaScript
      config.settings.javascript = {
        serverOptions = {
          configOverrides = {
            compilerOptions = {
              baseUrl = "./",
              moduleResolution = "bundler",
              allowJs = true,
            }
          }
        }
      }
    end
  end,
})

关键说明

  • 你之前使用的init_options.tsconfig并非ts_ls(原tsserver)的有效配置项,所以会被忽略,正确的配置位置是settings.typescript.serverOptions下的configFile或configOverrides。
  • 两种方案都会优先使用项目本地的tsconfig(符合团队开发需求),仅在无本地配置时应用全局/内置的compilerOptions。
  • root_dir的逻辑保持不变,确保LSP始终以项目目录为根,不会影响其他LSP功能(如代码跳转、诊断范围等)。

内容的提问来源于stack exchange,提问作者Adamson Vispo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:25:21