npm、yarn、pnpm それぞれのコマンドを覚えるのに疲れた方へ

# はじめに
皆さんは`npm`, `yarn`, `pnpm`どのPackage Managerを使っていますか？
`yarn`しか使わない！という方もいるかもしれませんが、`pnpm`評判いいみたいだし使ってみようかなとか、チーム開発では安定の`npm`なんだよなとか、複数のPackage Managerを使用するケースって少なくないかと思います。
そういった場合、それぞれのコマンドを覚えるのも面倒ですし、プロジェクトに応じて頭の切り替えをしないといけないのは大変です。
本記事は、そういった悩みを解決する方法を紹介します。

# ni
`ni`は`npm`,`yarn`,`pnpm`,`bun`に対応していて、それぞれのlockfileを読み取って、適切なコマンドを実行してくれるPackage Managerです。
`ni`のコマンドは短く、わかりやすいのですぐ覚えられると思います。
ちなみに、作者はVueやNuxt、ViteなどのコアチームメンバーのAnthony Fu氏です。

## インストール

```bash
npm i -g @antfu/ni
```

<details><summary>Windows PowerShellで発生するコマンド競合の対策</summary>

Windows PowerShellでは既定で`ni`が`New-Item`の省略形として登録されており、そのまま使うと競合します。
一時的に`ni`をパッケージマネージャーのコマンドとして使いたい場合は
```ps
Remove-Item Alias:ni -Force -ErrorAction Ignore
```
を実行します。
この方法はシェル再起動で変更が失われるので、以降も`ni`を使い続ける場合はシェルのプロファイルに上記コマンドを保存する必要があります。
```ps
$profile
```
で表示されたファイル
（基本的には`C:\Users\ユーザー名\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1`）を作成。テキストエディタで上記コマンドを記述し保存します。
`ni`コマンドを元の仕様に戻すときはこのファイルを削除します。
いずれの場合もシェル再起動後に変更が反映されます。
</details>

## コマンド
### `ni` install

```bash
ni

# npm install
# yarn install
# pnpm install
# bun install
```

```bash 
ni vite

# npm i vite
# yarn add vite
# pnpm add vite
# bun add vite
```

```bash
ni @types/node -D

# npm i @types/node -D
# yarn add @types/node -D
# pnpm add -D @types/node
# bun add -d @types/node
```

```bash
ni --frozen

# npm ci
# yarn install --frozen-lockfile (Yarn 1)
# yarn install --immutable (Yarn Berry)
# pnpm install --frozen-lockfile
# bun install --no-save
```

```bash
ni -g eslint

# npm i -g eslint
# yarn global add eslint (Yarn 1)
# pnpm add -g eslint
# bun add -g eslint

# これは作業ディレクトリに関係なく、デフォルトで使用しているPackage Managerを使用します。
```

### `nr` run

```bash
nr dev --port=3000

# npm run dev -- --port=3000
# yarn run dev --port=3000
# pnpm run dev --port=3000
# bun run dev --port=3000
```

```bash 
nr

❯ nr
? script to run › 
❯   dev - vite dev
    build - vite build
    preview - vite preview
    lint - eslint .
    format - prettier --write .

# 実行するスクリプトを選択して実行することができます。
# https://www.npmjs.com/package/npm-scripts-infoのルールをサポート
```

```bash
nr -

# 最後に実行したコマンドを再実行します。
```

### `nix` execute

```bash
nix vitest

# npx vitest
# yarn dlx vitest
# pnpm dlx vitest
# bunx vitest
```

### `nu` upgrade

```bash
nu

# npm upgrade
# yarn upgrade (Yarn 1)
# yarn up (Yarn Berry)
# pnpm update

# bunでは使用できません。
```

```bash
nu -i

# yarn upgrade-interactive (Yarn 1)
# yarn up -i (Yarn Berry)
# pnpm update -i

# npmとbunでは使用できません。
```

### `nun` uninstall

```bash 
nun webpack

# npm uninstall webpack
# yarn remove webpack
# pnpm remove webpack
# bun remove webpack
```

```bash
nun -g silent

# npm uninstall -g silent
# yarn global remove silent
# pnpm remove -g silent
# bun remove -g silent
```

### `nci` clean install

```bash
nci

# npm ci
# yarn install --frozen-lockfile
# pnpm install --frozen-lockfile
# bun install --no-save
```

### `na` agent alias

```bash
na

# npm
# yarn
# pnpm
# bun
```

```bash
na run foo

# npm run foo
# yarn run foo
# pnpm run foo
# bun run foo
```

### Change Directory

```bash
ni -C packages/foo vite
nr -C playground dev
```

### Config
```ini:~/.nirc
# lockfileが存在しない場合に使用するPackage Manager
defaultAgent=npm

# グローバルインストールする場合に使用するPackage Manager
globalAgent=npm
```

```ini:~/.bashrc
# 設定ファイルのパス
export NI_CONFIG_FILE="$HOME/.config/ni/nirc"
```

# さいごに
`ni`を使用して、１つのコマンドで適切なPackage Managerを自動的に使用してくれる方法を紹介しました。
各プロジェクトのlockfileを読み取って、適切なPackage Managerを使用してくれるのが楽でいいですね！
打つ文字数が2~3文字と少ない文字数で実行できるのは魅力的ですね。
好き嫌いは分かれるかもしれませんが、普段からaliasを張って使ってる方は違和感なく使えるかもしれません。
是非、`npm`、`yarn`、`pnpm` それぞれのコマンドを覚えるのに疲れた方は使ってみてください！