node管理方法あれこれ
Posted:
方針サマリ
- 開発端末: 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 の方が体験が良いことが多い。