はじめに
2026年6月9日、GitHubは npm v12 における破壊的変更を発表しました。
発表内容を見て最初に感じたのは、
「かなり思い切った変更だな」
ということです。
特に影響が大きいのは、
- ライフサイクルスクリプト
- Git依存
- リモートURL依存
の扱いです。
今回は、npm v12で何が変わるのか、開発者への影響は何かを整理してみます。
まず結論
npm v12を一言で表すなら、
「デフォルトで信頼しない」
への転換です。
これまでは、
npm install
↓
依存取得
↓
スクリプト実行
↓
完了
でした。
しかし npm v12では、
npm install
↓
依存取得
↓
危険な処理は実行しない
↓
必要なものだけ許可
という考え方になります。
変更点① ライフサイクルスクリプトがデフォルト無効化
最も大きな変更です。
現在のnpmでは、
{
"scripts": {
"preinstall": "...",
"install": "...",
"postinstall": "..."
}
}
が存在すると、
npm install
時に自動実行されます。
例えば、
- バイナリダウンロード
- ネイティブモジュールビルド
- セットアップ処理
などに利用されています。
しかし npm v12では、
これらのスクリプトはデフォルトで実行されなくなります。
必要な場合は明示的に許可する必要があります。
今まで
npm install
↓
postinstall実行
↓
完了
npm v12
npm install
↓
postinstall実行されない
↓
必要なら許可
変更点② Git依存が制限される
これまでは、
{
"dependencies": {
"my-lib": "git+https://github.com/example/lib.git"
}
}
のような指定が可能でした。
つまり npmレジストリ以外から直接取得できました。
npm v12では、
このような依存関係の利用に制限が加わります。
今まで
npm install
↓
GitHubから取得
↓
完了
npm v12
npm install
↓
取得しない
↓
明示的な許可が必要
変更点③ Remote URL依存が制限される
これも影響が大きい変更です。
例えば、
{
"dependencies": {
"my-lib": "https://example.com/lib.tgz"
}
}
のような指定です。
これまではURLから直接取得できました。
しかし npm v12では、
こちらもデフォルトで制限されます。
なぜここまで厳しくするのか
便利さだけを考えれば、
今までの方が圧倒的に楽です。
しかしセキュリティの観点では、
npm install
↓
任意コード実行
という状態でもありました。
依存パッケージや取得元が侵害された場合、
開発者は気付かないまま影響を受ける可能性があります。
実務で影響を受けそうなケース
今回の変更によって、
以下のようなライブラリは注意が必要です。
- esbuild
- node-gyp
- ネイティブアドオン系ライブラリ
- postinstallを利用するツール
環境によっては、
npm v12に上げたら動かなくなった
というケースも出てくるかもしれません。
アップデート前に依存関係の確認が必要になりそうです。
最近のサプライチェーン攻撃を見て感じたこと
最近は、
- Miasma
- tj-actions インシデント
- XZ Utils
など、ソフトウェアサプライチェーンを狙った攻撃が話題になっています。
今回のnpm v12の変更は、それらの事例への直接的な対策として発表されたわけではありません。
ただ、
自動的に信頼する
↓
明示的に信頼する
という方向性への変化は感じます。
個人的には、
開発者が「何を実行しているのか」をより意識する時代になってきたのではないかと思いました。
まとめ
npm v12では、
- ライフサイクルスクリプトのデフォルト無効化
- Git依存の制限
- Remote URL依存の制限
という大きな変更が予定されています。
一見すると不便になるようにも見えますが、
その背景にはソフトウェアサプライチェーンを取り巻くリスクの増加があります。
今後 npm v12 が普及するにつれ、
開発者側も依存関係との付き合い方を見直す必要がありそうです。
参考
- GitHub Changelog: Upcoming breaking changes for npm v12
https://github.blog/changelog/2026-06-09-upcoming-breaking-changes-for-npm-v12/