npm スクリプトは package.json の scripts フィールドに定義されたコマンドで、npm run <name> で実行します。プロジェクトのタスク(start、build、test、lint)を標準化し、チーム全体と CI が同じコマンドを使えるようにします。ライフサイクルフックは、特定のタイミングで npm が自動的に実行する特別なスクリプトです。
{
"scripts": {
"start": "node server.js",
"dev": "nodemon server.js",
"build": "tsc && vite build",
"test": "vitest",
"lint": "eslint src",
"format": "prettier --write ."
}
}
npm run dev # 任意のスクリプト
npm start # `start` と `test` にはショートカットがある("run" が不要)
npm test
スクリプトは && でコマンドを連結でき(順番に実行し、失敗で停止する)、ローカルにインストールされたバイナリ(node_modules/.bin 内)にパスなしでアクセスできます。そのため vitest がグローバルでなくても "test": "vitest" が動作します。
{
"scripts": {
"prebuild": "rimraf dist", // "build" の前に自動的に実行される
"build": "tsc",
"postbuild": "echo done" // "build" の後に自動的に実行される
}
}
npm は任意のスクリプト <name> の前に pre<name> を、後に post<name> を自動的に実行します。そのため npm run build は prebuild → build → postbuild の順に実行されます。セットアップ / クリーンアップのステップに便利です。
{
"scripts": {
"postinstall": "node setup.js", // `npm install` 完了後に実行される
"prepare": "husky install" // install 後に実行される(よく git フックのセットアップに使う)
}
}
postinstall や prepare のようなフックは、install ライフサイクルの定められたタイミングで実行されます。git フック(husky)のセットアップやネイティブ依存関係のコンパイルによく使われます。(注意: 依存関係内の postinstall スクリプトはサプライチェーンのセキュリティ上の考慮点でもあります。)
npm run test -- --watch # -- の後にスクリプトへ引数を渡す
NODE_ENV=production npm start # この実行向けに環境変数を設定する
✓ 自己文書化 — `package.json` に利用可能なすべてのタスクが表示される
✓ ある程度クロスプラットフォーム、グローバルインストール不要(ローカルの node_modules/.bin を使う)
✓ JS エコシステム全体で標準 — どの開発者も `npm run` を知っている
npm スクリプトは Node/JS プロジェクトの標準的なタスクランナーです。アプリの起動、ビルド、テスト、lint の方法を一元化して文書化し、全員(と CI)が同一のコマンドを実行することを保証します。
スクリプトの合成、自動的な pre/post フック(セットアップ / クリーンアップ向け)、postinstall/prepare のようなライフサイクルフックを理解すれば、プロジェクトのワークフローをきれいに自動化できます。
これらはプロジェクトツールの接着剤であり、事実上すべての Node リポジトリに現れます。