## 背景 [[nvim-lspconfig]]の[[Volar]]は `init_options.typescript.tsdk` に [[TypeScript]]の `lib` ディレクトリパスを指定することで、[[tsserver]]と連携する。デフォルトの設定は以下のようになっている。 | `init_options.typescript.tsdk` の設定値 | 実際に使う[[TypeScript]]の `lib` | | ----------------------------------- | ----------------------------- | | あり | 設定値 | | なし - 空文字(default)含む | `node_modules/typescript/lib` | 上記から何も設定をしないと、**[[TypeScript]]がローカルにインストールされていない場合は、グローバルの[[TypeScript]]([[tsserver]])を参照することはできない**。 [[JavaScript]]ファイルを編集するシーンでは、基本的にローカルへ[[TypeScript]]をインストールしていないため、結果として[[Volar]]を[[LSP]]として起動できない...というのが今回の問題。 ## 解決策 [[TypeScript]]がローカルにインストールされていない場合は、グローバルにインストールされた[[TypeScript]]を参照するようにする。つまり以下のように設定する。 ```lua lspconfig.volar.setup({ init_options = { vue = { hybridMode = false, }, typescript = { -- グローバルのTypeScriptパスを指定 (ベースはこれ) tsdk = os.getenv("HOME") .. "/.local/share/mise/installs/npm-typescript/latest/lib/node_modules/typescript/lib/", }, }, on_new_config = function(new_config, new_root_dir) local lib_path = vim.fs.find("node_modules/typescript/lib", { path = new_root_dir, upward = true })[1] -- ローカルにTypeScriptがインストールされていれば、そのパスで上書きする if lib_path then new_config.init_options.typescript.tsdk = lib_path end end, }) ``` > [!hint] > [[TypeScript]]は[[mise]]でインストールしているためパスが特殊。 > ```console > mise use -g npm:typescript > ``` この対応により、ローカルに[[TypeScript]]がインストールされていなくても、グローバルの[[TypeScript]]([[tsserver]])を参照して[[Volar]]が動作するようになる。 > [!attention] > `root_dir` のデフォルト値が `package.json` のため、`package.json` を配置せずに[[JavaScript]]ファイルだけで[[Volar]]を有効にすることはできない。`package.json` 以外のファイルをトリガーにしたければ、[[Chrome ExtensionプロジェクトでもVolarをLSPとして使う (nvim-lspconfig)|Chrome ExtensionプロジェクトでもVolarをLSPとして使う]] のような設定変更が必要。