## 背景
[[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として使う]] のような設定変更が必要。