## 背景
現状、[[npm]]でしかインストールできないものは `npm -g install` コマンドでモジュールを管理している。しかし、[[mise]]で[[npm]]を管理している都合上、[[Node.js]]のバージョンを更新するたびに関連モジュールすべての再インストールが必要になる。これを避けたい。
そこで[[mise]]の[[npm Backend (mise)|npm Backend]]機能を使用する。
## owl-playbookの更新
[[🦉owl-playbook]]の`provision.sh`を変更する。現状は以下のようになっている。
```bash
# miseでインストールされている全Node.jsバージョンでインストール
# $1: インストール対象, $2: コマンド名($1と異なる場合のみ)
function npm_install() {
target="$1"
command=${2:-${target}}
mise use -g node@20
mise_no "${command}" && mise x -- npm i -g "${target}"
mise use -g node@22
mise_no "${command}" && mise x -- npm i -g "${target}"
return 0
}
npm_install pyright
npm_install bash-language-server
npm_install @fsouza/prettierd prettierd
npm_install vscode-langservers-extracted vscode-css-language-server
npm_install vscode-langservers-extracted vscode-json-language-server
npm_install @olrtg/emmet-language-server emmet-language-server
npm_install @tailwindcss/language-server tailwindcss-language-server
npm_install yaml-language-server
npm_install typescript tsc
npm_install typescript-language-server
npm_install @vue/language-server vue-language-server
npm_install svelte-language-server svelteserver
```
これを[[mise]]コマンドに置き換えていく。
## 1つインストールしてみる。
[[Pyright]]をインストールしてみる。まずは[[npm]]でアンインストール。
```console
npm uninstall -g pyright
```
[[mise]]を使ってインストール。
```console
mise use -g npm:pyright
```
エラーになった。
```error
mise npm backend is experimental. Enable it with `mise settings set experimental true`
```
experimentalの機能を使うには設定が必要とのこと。
```console
mise settings set experimental true
```
リトライ。
```bash
$ mise use -g npm:pyright
Reshimming mise 22...
mise npm:
[email protected] ✓ installed
mise ~/.config/mise/config.toml tools: npm:
[email protected]
```
## 構造を確認する
場所を確認。
```console
$ which pyright
/home/tadashi-aikawa/.local/share/mise/installs/npm-pyright/latest/bin/pyright
```
[[Node.js]]とは依存せず`npm-pyright`としてインストールされていそう。さらに確認してみる。
```console
$ ll /home/tadashi-aikawa/.local/share/mise/installs/npm-pyright/latest/bin
lrwxrwxrwx - 14 Sep 17:40 pyright -> ../lib/node_modules/pyright/index.js
lrwxrwxrwx - 14 Sep 17:40 pyright-langserver -> ../lib/node_modules/pyright/langserver.index.js
```
実体は`lib`の方にありそう。`index.js`を見てみる。
```js
#!/usr/bin/env node
/* eslint-disable @typescript-eslint/ban-ts-comment */
// @ts-nocheck
// Stash the base directory into a global variable.
global.__rootDirectory = __dirname + '/dist/';
require('./dist/pyright');
```
ここで初めて `#!/usr/bin/env node` の指定が出てくる。現在activateされている[[Node.js]]にて実行されることが分かる。
## パフォーマンスの懸念はあるか?
今のローカルはこういう状況。
```console
$ mise list node
Plugin Version Config Source Requested
node 18.15.0
node 18.19.0
node 20.12.2
node 20.15.0
node 22.5.1
node 22.6.0 (outdated) ~/.config/mise/config.toml 22
```
[[Node.js]] `v20.15.0` の `node_modules` 配下を見ると、今まではこのように[[Pyright]]が配置されていたことが分かる。
```
/home/tadashi-aikawa/.local/share/mise/installs/node/20.15/lib/node_modules/pyright/index.js
```
`index.js`の内容は全く同じ。
```js
#!/usr/bin/env node
/* eslint-disable @typescript-eslint/ban-ts-comment */
// @ts-nocheck
// Stash the base directory into a global variable.
global.__rootDirectory = __dirname + '/dist/';
require('./dist/pyright');
```
このことから **[[npm Backend (mise)|npm Backend]]の機能を使っても、shimsのようにパフォーマンスが劣化する心配はなさそう** ということが分かる。
## すべてのNode.jsをアンインストールする
すべてスッキリさせて書き直したものでインストールする。(書き直しは省略)
```console
$ mise remove --all node
mise
[email protected] ✓ uninstalled
mise
[email protected] ✓ uninstalled
mise
[email protected] ✓ uninstalled
mise
[email protected] ✓ uninstalled
mise
[email protected] ✓ uninstalled
mise
[email protected] ✓ uninstalled
$ mise use -g node@22
mise
[email protected] ✓ installed
mise ~/.config/mise/config.toml tools:
[email protected]
```
このあとにインストール。
## 懸念点
activateされている[[Node.js]]バージョンによって、利用するモジュールのバージョンを変更したい (バージョンごとに固定化したい) 場合、何もしないとできない。しかし、それらのモジュールは[[Node.js]]のバージョンよりもプロジェクトバージョンに依存すべき。それなら、ディレクトリベースの[[mise]]設定をしたほうがいい。
普段使う[[Node.js]]は最新が望ましいし、意図的に古いバージョンを使うのは開発対象がそのバージョンに対応しているという制約上の理由であることがほとんど。その場合は `mise.toml` に設定すればいい話だ。
## 他
[[Go]]と[[pipx]]にも対応しており気になったが、それぞれ1つしかインストールしていないので experimental が外れてからにする。なお、オプションで[[uvx]]にすることも可能だとか。[[Cargo BInstall]]もいけるのか...。