node管理方法あれこれ

方針サマリ

  • 開発端末: Volta もしくは asdf で Node ランタイムを固定。パッケージはプロジェクトローカルにのみ入れる。
  • CI/CD: Volta/asdf でバージョン固定 or actions/setup-node + corepack。Lockfile を必ず使用。
  • Docker/本番: node:<version> の公式イメージ起点。corepack enable でパッケージマネージャをピン留め。グローバル npm は原則使わない。
  • グローバルCLI: できるだけ npx / npm exec / pnpm dlx、もしくは aqua で管理(OSに汚さない)。

Node.js本体の管理

A. 開発端末(複数プロジェクトを切り替えるなら)

Volta(推奨) JS ツール専用のバージョンマネージャ。高速・安定。プロジェクトごとに Node / npm / yarn / pnpm をピンできます。

curl https://get.volta.sh | bash
volta pin node@20
volta pin pnpm@9

curl | bash は取得したスクリプトをそのまま実行するため、公式URLであることと内容を確認してから実行する。

B. サーバ/Docker

公式イメージで固定:FROM node:20-bookworm-slim など。 OS の apt(Debian/Ubuntu)だけで入れると古いことが多く、推奨しません(NodeSource を使う手もあるが、Docker なら公式イメージが楽)。 マルチステージでビルドキャッシュを効かせ、最終ステージは slim/alpine を使用。

パッケージマネージャ & 依存の管理

どれを使う?

  • npm(デフォルト・十分に成熟)
    • 迷ったらこれでOK。npm ci が速くて再現性も高い。
  • pnpm(大規模/モノレポで速く省容量)
    • 共有ストアにより依存重複を削減。モノレポや大量依存でメリット大。
  • Yarn
    • Classic(v1)は保守的。Berry(v2+)は強力だが学習コストが上がる。

グローバルインストールを避ける

原則 ローカル依存 + npm exec/npx/pnpm dlx で動かす。 CLI をしょっちゅう使うなら package.json の scripts に書いて npm run … で実行。

aqua を使うか?どう使うか?

使いどころ

  • OS に汚さず グローバル CLI をまとめて管理したいときに有効。

    • 例: eslint, prettier, ts-node, turbo, pnpm など 単体バイナリ配布があるもの は特に相性が良い。
  • Node 本体も aqua で入れられますが、プロジェクトごとの切り替えが頻繁なら Volta/asdf の方が体験が良いことが多い。