npmとは、Node.jsに同梱されているパッケージ管理ツールで、package.json に書いた依存パッケージのインストールや、スクリプトの実行を行うコマンドです。 日常的に使うのは npm install・npm ci・npm run・npx の4つです。

この記事では、npmコマンドを目的別の早見表にまとめ、Node.js 22.22.2同梱のnpm 10.9.7で実行した出力を載せます。type・exports・workspaces まで入った完成形の package.json、^ と ~ の違い、npm ci の役割、エラーの再現と直し方、2026年7月に出たnpm 12(最新12.1.0)の変更点も実行結果で確認します。

npm コマンドの早見表

やりたいこと コマンド 省略形・主なオプション
package.jsonを作る npm init -y -w パス でワークスペース追加
すべて入れる npm install npm i
パッケージを追加 npm i パッケージ @1.2.3 で版指定、-E で固定
開発用に追加 npm i -D パッケージ --save-dev
lockどおりに入れる(CI用) npm ci --omit=dev で本番用のみ
削除 npm uninstall パッケージ npm rm / npm un
範囲内で更新 npm update パッケージ名 で個別
古いものを確認 npm outdated --all で依存の依存も
入っているものを表示 npm ls --all でツリー全体
なぜ入っているか npm explain パッケージ npm why
スクリプト実行 npm run 名前 npm test / npm start
コマンドを一時実行 npx パッケージ npm exec -- パッケージ
脆弱性チェック npm audit npm audit fix / --audit-level=high
寄付先・環境診断 npm fund / npm doctor
公開物の確認 npm pack --dry-run .tgz 作成は npm pack
版を上げる npm version patch minor / major
公開 npm publish --access public
設定の確認・変更 npm config get 名前 / set 名前=値 --location=project で .npmrc
キャッシュの検証 npm cache verify npm cache clean --force
ローカルのパッケージをつなぐ npm link / npm link 名前 npm unlink
package.jsonを編集 npm pkg set キー=値 / get delete
モノレポ操作 npm run 名前 -w パッケージ -ws で全ワークスペース
スクリプト許可(npm 12) npm install-scripts approve 名前 ls / deny

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「npm コマンド 一覧|package.json 書き方と実行結果・npm 12対応」

プロジェクトを始める:npm init

npm init -y は、質問を省略して package.json を作ります。 npm 10.9.7では name・version・description・main・scripts・keywords・author・license("ISC")の8項目が入りました(以降、出力のパスは短縮し、長い部分は ... で省略)。

npm 12.1.0では"type": "commonjs" が入り、author と license がなくなりました(リリースノートでは既定ライセンスがISCから空文字に変更)。

インストール:npm install と ^ ~ の違いを実測

$ npm i chalk@~4.0.0
added 6 packages, and audited 7 packages in 638ms
$ npm ls
p1@1.0.0 /work/p1
`-- chalk@4.0.0

$ npm i chalk@^4.0.0
changed 1 package, and audited 7 packages in 393ms
$ npm ls
`-- chalk@4.1.2
$ grep chalk package.json
    "chalk": "^4.1.2"

~4.0.0 は4.0.xの中の最新(4.0.0)、^4.0.0 は4.x.xの中の最新(4.1.2)が入りました。 ^ で指定すると、package.jsonには実際に入った版を先頭にした ^4.1.2 が書かれます。範囲の意味は、npmが内部で使う semver パッケージ(npx -y semver@7.7.2 -r "範囲" 版...)で確かめました。

指定 意味 1.2.2 / 1.2.9 / 1.3.0 / 2.0.0 のうち一致
^1.2.3 左端の0でない桁を固定 1.2.9、1.3.0
~1.2.3 マイナーまで固定 1.2.9
1.2.3 その版だけ(-E で保存) -
^0.2.3 0.xは次のマイナーが別扱い 0.2.9は一致、0.3.0は不一致

^ は「マイナー・パッチの更新」、~ は「パッチだけ」を許します。 版を完全に固定するなら npm i -E か npm config set save-exact=true を使います。

依存は dependencies(実行時、npm i)、devDependencies(開発時だけ、-D)、peerDependencies(利用者側に入れてもらう)、optionalDependencies(無くても動く、-O)の4種類です。

package-lock.json と npm ci の関係

package-lock.json は、依存の依存まで含めて「実際に入った版」を記録するファイルです。 ^4.0.0 のような範囲指定でも、lockがあれば全員が同じ版を再現できます。lockはGitにコミットします。

npm install npm ci
基準 package.json(lockは参考) package-lock.jsonのみ
node_modules 差分を更新 いったん削除して入れ直す
package.jsonとlockが不一致 lockを書き換える エラーで止まる

rm -rf node_modules && npm ci は added 6 packages ... in 1s で完了しました。package.jsonに ms を手で追加し、lockを更新せずに npm ci すると次のように止まります。

npm error code EUSAGE
npm error `npm ci` can only install packages when your package.json and package-lock.json or npm-shrinkwrap.json are in sync. Please update your lock file with `npm install` before continuing.
npm error Missing: ms@2.1.3 from lock file

npm install でlockを更新してコミットすれば解消します。 CIで npm ci を使うと、lockの更新漏れにすぐ気づけます。

確認と更新:outdated・update・ls・explain

dayjs@1.11.0 を入れた状態(package.jsonは ^1.11.0)で確認しました。

$ npm outdated
Package  Current   Wanted   Latest  Location            Depended by
dayjs     1.11.0  1.11.23  1.11.23  node_modules/dayjs  p3
$ npm update
changed 1 package, and audited 2 packages in 559ms
$ npm ls
`-- dayjs@1.11.23

Wanted は範囲内の最新、Latest はレジストリの最新で、npm update は Wanted まで上げます(package.jsonの ^1.11.0 はそのまま)。範囲外の Latest へは npm i パッケージ@latest で明示的に上げます。npm outdated は古いものがあると終了コード1を返します。

「このパッケージはなぜ入っているのか」は npm explain(別名 npm why)で調べます。

$ npm why has-flag
has-flag@4.0.0
  has-flag@"^4.0.0" from supports-color@7.2.0
    supports-color@"^7.1.0" from chalk@4.1.2
      chalk@"^4.1.2" from the root project

スクリプト実行:npm run と npx

$ npm pkg set scripts.prebuild='echo pre' scripts.build='echo build' scripts.greet='node greet.js'
$ npm run build
> p4@1.0.0 prebuild
> echo pre
pre
> p4@1.0.0 build
> echo build
build
$ npm run greet -- --name=abc
> p4@1.0.0 greet
> node greet.js --name=abc
[ '--name=abc' ]

pre名前 / post名前 のスクリプトは自動で前後に実行されます。 スクリプトに引数を渡すときは -- の後ろに書きます。スクリプト内では node_modules/.bin にパスが通ります。存在しない名前は npm error Missing script: "nope" になり、npm run だけで一覧が出ます。

npx(npm exec)は、インストールせずにパッケージのコマンドを実行します。 npx -y semver@7.7.2 -r '~1.2.0' 1.2.5 1.3.0 は 1.2.5 を返しました(-y で確認を省略)。

セキュリティ:audit と fund

$ npm i lodash@4.17.20
$ npm audit
lodash  <=4.17.23
Severity: high
Command Injection in lodash - https://github.com/advisories/GHSA-35jh-r3h4-6jhm
...(ほか4件)
fix available via `npm audit fix`
node_modules/lodash

1 high severity vulnerability
$ npm audit fix
found 0 vulnerabilities
$ npm ls lodash
`-- lodash@4.18.1

npm audit は既知の脆弱性を一覧にし、npm audit fix は範囲内で直せる版へ更新します。 --force はメジャー更新を含むため動作確認とあわせて行います。--audit-level=critical ではhighのみの今回は終了コード0でした。npm fund は寄付先URLを表示します。

公開まわり:pack・version・publish

$ npm version patch --no-git-tag-version
v1.0.1
$ npm pack --dry-run
...
npm notice 17B index.js
npm notice 426B package.json
...

npm version は版を上げ、Gitリポジトリ内ならコミットとタグも作ります。 npm pack --dry-run で公開されるファイルを確認し、files で絞ります。npm publish(今回は未実行)でスコープ付きを初めて公開するときは --access public を付けます。

設定と保守:config・cache・doctor

$ npm config get registry
https://registry.npmjs.org/
$ npm config set save-exact=true --location=project
$ npm cache verify
Content verified: 2 (645635 bytes)
Finished in 0.042s

--location=project はプロジェクトの .npmrc、user は ~/.npmrc に書きます。 効いている設定は npm config list で確認します。npm doctor は接続・権限・版を点検し、今回は Checking npm version で Use npm v12.1.0 と最新版を案内しました。

link と workspaces:ローカルのパッケージを使う

ライブラリのフォルダで npm link、使う側で npm link mylib とすると、node_modules/mylib -> ../../mylib のシンボリックリンクができ、公開せずに変更を試せます。同じリポジトリ内で複数パッケージを管理するなら workspaces が便利です。

$ npm init -y && npm init -y -w packages/utils
$ npm init -y -w packages/app
$ npm i utils -w app
$ npm run start -w app
5
$ npm ls
+-- app@1.0.0 -> ./packages/app
`-- utils@1.0.0 -> ./packages/utils

-w で対象を指定し、npm i はルートで1回実行します。 ルートには "workspaces" が自動で追記され、各パッケージは node_modules にリンクされます。

package.json の書き方:完成形とフィールド解説

ESM(import)とCommonJS(require)両対応で、CLIも持つ完成形です。 別プロジェクトから import・require・npx で呼び出して確認しました。

{
  "name": "@example/task-utils",
  "version": "1.0.0",
  "description": "タスク管理用の小さなユーティリティ",
  "type": "module",
  "main": "./dist/index.cjs",
  "exports": {
    ".": {
      "import": "./dist/index.js",
      "require": "./dist/index.cjs"
    },
    "./package.json": "./package.json"
  },
  "bin": { "task-utils": "./bin/cli.js" },
  "files": ["dist", "bin"],
  "scripts": {
    "start": "node bin/cli.js",
    "test": "node --test"
  },
  "engines": { "node": ">=22" },
  "license": "MIT"
}
ESM: { id: 1, done: true }
CJS: { id: 2, done: true }
$ npx task-utils
{ id: 1, title: '備品を発注', done: true }
$ node -e 'require("@example/task-utils/dist/internal.js")'
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './dist/internal.js' is not defined by "exports" in .../package.json
フィールド 役割 ポイント
name / version 名前と版 公開しないなら省略可
type .js の扱い "module" でESM、省略時はCommonJS
main 旧来の入口 exports があればそちらが優先
exports 外から読める入口 書いていないパスは読めない。import / require で出し分け
bin コマンド名とファイル 先頭に #!/usr/bin/env node
files 公開に含めるファイル npm pack --dry-run で確認
engines 対応するNode.jsの版 既定は警告のみ
packageManager 使うツールと版 "npm@12.1.0" の形式
overrides 依存の依存の版を上書き 脆弱性対応などに使う
workspaces モノレポのパッケージ globも可(packages/*)
allowScripts インストールスクリプトを許可する依存(npm 12) npm install-scripts approve が書き込む

engines は既定では警告だけで、>=30 を要求するパッケージを入れると npm warn EBADENGINE Unsupported engine と required: { node: '>=30' }、current: { node: 'v22.22.2', npm: '10.9.7' } が表示されて処理は続きます。止めたい場合は --engine-strict で npm error code EBADENGINE にできます。

overrides は依存の依存を指定した版に置き換えます。 chalk@4 が使う color-name に対し npm pkg set overrides.color-name=1.1.3 && npm i を実行すると、npm ls color-name に color-name@1.1.3 overridden と表示されました。

npm 12の変更点(2026年7月リリース)

npm 12の最大の変更は、依存パッケージの preinstall・install・postinstall スクリプトが既定で実行されなくなったことです。 サプライチェーン攻撃(依存パッケージ経由の攻撃)への備えです。npm 12.1.0で postinstall を持つ esbuild を入れた結果です。

$ npm i esbuild
added 2 packages, and audited 3 packages in 2s
found 0 vulnerabilities
npm warn install-scripts 1 package had install scripts blocked because they are not covered by allowScripts:
npm warn install-scripts   esbuild@0.28.2 (postinstall: node install.js)
npm warn install-scripts
npm warn install-scripts Run `npm install-scripts ls` to review, or `npm install-scripts approve <pkg>` to allow.
$ npm install-scripts approve esbuild
Approved esbuild:
  added esbuild@0.28.2
$ grep -A2 allowScripts package.json
  "allowScripts": {
    "esbuild@0.28.2": true
$ npm rebuild esbuild
rebuilt dependencies successfully

確認したパッケージだけを approve し、allowScripts をコミットします。 グローバルや npx では --allow-scripts=名前 を使います。主な変更点です(公式リリースノートより)。

変更 内容 実測
インストールスクリプト 依存のスクリプトは allowScripts で許可したものだけ実行 上記
--allow-git / --allow-remote 既定が none。Git・URL指定の依存は明示的な許可が必要 -
未知の設定・フラグ 警告ではなくエラー --save-exat → EUNKNOWNCONFIG(npm 10は警告なしで続行)
npm view --json 常に配列 ["1.11.23"](npm 10は "1.11.23")
npm init 既定ライセンスが空 上記
対応Node.js ^22.22.2 || ^24.15.0 || >=26.0.0 -

よくあるエラーと直し方

ERESOLVE(peer依存の衝突) は、react@19 と react@17 用の react-dom@17 を同時に入れて再現しました。

npm error code ERESOLVE
npm error ERESOLVE unable to resolve dependency tree
npm error Found: react@19.3.0
npm error Could not resolve dependency:
npm error peer react@"17.0.2" from react-dom@17.0.2
npm error Fix the upstream dependency conflict, or retry
npm error this command with --force or --legacy-peer-deps

npm view react-dom@17 peerDependencies で要求を確認し、npm i react@19 react-dom@19 と版をそろえると解消しました。 --legacy-peer-deps はpeerの確認を省く一時的な手段です。

EACCES(権限不足) は、書き込み権限のないフォルダに npm i -g して Error: EACCES: permission denied, mkdir を再現しました。npm公式は、sudo ではなくnvmなどでNode.jsを入れ直すか、npm config set prefix ~/.npm-global とし PATH に ~/.npm-global/bin を追加する方法を案内しています。

エラー 主な原因 直し方
ERESOLVE peer依存の版が合わない 版をそろえる。一時的に --legacy-peer-deps
EACCES グローバルの置き場所に権限がない nvm等で入れ直す、prefix をユーザー配下へ
EUSAGE(npm ci) lockとpackage.jsonが不一致 npm install してlockをコミット
ERR_PACKAGE_PATH_NOT_EXPORTED exports にないパス 公開された入口から読む
EUNKNOWNCONFIG(npm 12) フラグのつづり誤り npm help config で確認

pnpm・yarn・bun との対応表

操作 npm pnpm yarn(v4) bun
追加 npm i x pnpm add x yarn add x bun add x
lockどおり npm ci pnpm i --frozen-lockfile yarn install --immutable bun i --frozen-lockfile
一時実行 npx x pnpm dlx x yarn dlx x bunx x
スクリプト npm run a pnpm run a yarn run a bun run a

lockファイルの形式はツールごとに異なるため、1つのプロジェクトでは1つにそろえ、packageManager で明示します。

よくある質問

Q. npm install と npm ci はどちらを使えばよいですか? A. 開発中の追加・更新は npm install、CI・本番ビルド・クローン直後は npm ci です。

Q. package-lock.jsonはGitに入れますか? A. 入れます。 全員が同じ版を再現でき、npm ci が使えます。

Q. npm 12にするとインストールが失敗しますか? A. インストールは完了しますが、依存の postinstall などが実行されません。 警告に出たパッケージを確認し、npm install-scripts approve 名前 で許可して npm rebuild します。

まとめ

  • 日常の操作は npm i・npm ci・npm run・npx の4つ。確認は outdated・ls・why
  • ^ はマイナーまで、~ はパッチまで。0.x系の ^ はマイナーを固定
  • lockはコミットし、CIでは npm ci。不一致は EUSAGE で止まる
  • package.jsonは type と exports で入口を決める。書いていないパスは読めない
  • engines は既定で警告のみ、overrides で依存の依存を差し替え
  • npm 12は依存のインストールスクリプトが既定で止まる。npm install-scripts approve で許可
  • ERESOLVEは版をそろえる、EACCESは sudo ではなく置き場所を見直す

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「npm コマンド 一覧|package.json 書き方と実行結果・npm 12対応」

株式会社RJCでは、開発環境のツールの変化を実際に試して確かめ、その結果をプロジェクトの中で仲間と共有しています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?