Node.jsプロジェクトを管理する際に重要なのが、package.jsonファイルです。
パッケージの依存関係や、自作したパッケージを公開する際のパッケージ情報など、様々なデータをこのファイルで管理します。
今回の記事では、package.jsonファイルで活用される主な項目と、その項目で書くべき内容について、詳しく解説していきたいと思います。
package.jsonとは?
package.jsonは、Node.jsプロジェクトの様々な情報が記述された設定ファイルです。
プロジェクトのメタデータ、パッケージの依存関係、スクリプトなどをJSON形式で定義します。
package.jsonファイルがあることにより、npm installコマンドを使って依存関係にあるパッケージを一括でインストールすることができたり、独自に設定したスクリプトをコマンドで実行することができるようになります。
package.jsonファイルは、対象とするプロジェクトのディレクトリ内にて、npm initコマンドを実行することで生成できます。
package.jsonの構造
上述したように、package.jsonファイルではプロジェクトに関する様々な情報が定義されています。
それぞれの項目で定義される内容について、順に解説していきたいと思います。
パッケージの基本情報のフィールド
まずは、プロジェクト自身に関する情報を定義する項目から見ていきましょう。
name
パッケージ名を記述する項目です。レジストリに公開する場合は、必須項目となります。
ここに記述した名前が、URLやコマンドの引数に指定するパッケージ名、node_modulesに記述されるディレクトリ名などとして使用されます。
公開する際は、Node.jsコアのモジュール名や既存のパッケージ名と重複した名前を付けることはできません。
その他、以下のような決まりがあります。
version
パッケージのバージョンを設定する項目です。
こちらも、レジストリに公開する場合は必須項目となります。
バージョンを設定する際は、セマンティックバージョニングと呼ばれるバージョニングルールに則って設定しましょう。
アプリケーション全般で見かける 「4.10.0」 といった形式です。
ドットで区切られた各数値のうち、一番初めをメジャーバージョン、続いてマイナーバージョン、パッチバージョンと呼びます。
それぞれの数値は、主に以下の基準で繰り上げていきます。
・メジャーバージョン … 後方互換性の無くなるような大きな変更が加えられた場合
・マイナーバージョン … 後方互換性があり、機能性を追加した場合
・パッチバージョン … 後方互換性があり、機能性を追加した場合
バージョンの更新は、package.jsonから直接行える他、「npm version」 コマンドでも変更することができます。
【コマンド実行例】
npm version patch
descriptionとkeyword
パッケージの説明や検索時のキーワードを設定する項目です。
npm searchコマンドで検索する際に使用するキーワードと、一致した際に表示されるパッケージの内容をこの項目で指定します。
mainでパッケージのエントリーポイントを指定する
mainの項目では、パッケージのエントリーポイントを指定することができます。
エントリーポイントとは、プログラムの実行が開始される地点のことを言います。
この項目で指定したファイルが、他のアプリケーションやモジュールから import または require された際に参照されるエントリーポイントとなります。
パッケージの依存関係を記述する
package.jsonファイルで特に重要な項目の1つが、パッケージの依存関係を記述する項目です。
この項目は、インストールしたパッケージの使用用途によりいくつかの種類に分かれます。
それぞれの違いについて、順に見ていきましょう。
dependencies
通常、npm installコマンドでプロジェクトに追加されたパッケージの情報は、この 「dependencies」 の項目に追加されます。
【記述例】
"dependencies": {
"express": "^5.1.0"
}
dependenciesに記述されたパッケージは、プロジェクトのディレクトリ内で installコマンドを引数なしで実行した場合や、npmレジストリに公開されているパッケージをインストールした場合の一括インストール対象となります。
devDependencies
テストやビルドといったような開発時にのみ必要とし、プロジェクトの実行には影響しないパッケージを記述するのが、この項目です。
公開済みのパッケージをインストールする際、dependenciesに記述されたパッケージとは異なり、この項目に記述されたパッケージは合わせてインストールされることはありません。
(プロジェクトのディレクトリ内で直接 npm install による一括インストールを実行した場合は、対象に含まれます)
npm install コマンドの実行時に –save-dev オプションを付けることで、この項目に記録できます。
【コマンド実行例】
npm install --save-dev パッケージ名
npm i -D パッケージ名 # 省略形
パッケージをアンインストールする際も同様に、–save-devオプションを付けて uninstall コマンドを実行することで、パッケージを削除することができます。
オプションが無い場合は、この項目に記載されたパッケージは削除対象に含まれないため、注意が必要です。
peerDependencies
peerDependenciesは、開発しているパッケージが特定のバージョンの他のパッケージと一緒に使われることを期待する場合に指定する項目です。
主に、プラグインモジュールなどを開発する際に使用されます。
複数のパッケージにおいて、同じパッケージが依存状態にある場合に、ケースによってはそれぞれのバージョン指定が異なり、実行時にエラーが発生してしまう可能性があります。
これを、npm intallの時点で明らかにするのが、peerDependenciesの主な役割です。
peerDependenciesに対象となるパッケージのバージョンを指定した場合、設定と矛盾するバージョンがインストールされようとするとエラーが発生し、インストールが中断されるようになります。
scriptsで実行するスクリプトを設定する
package.jsonファイルの scripts の項目には、コマンドとして実行可能なスクリプトを設定することができます。
スクリプトを設定する際は、以下のような形式で内容を記述します。
【記述例】
"scripts": {
スクリプト名: 実行内容
}
スクリプトの設定が完了すると、「npm run」 コマンドで指定したスクリプト名の内容を実行することができるようになります。
【コマンド実行例】
npm run スクリプト名
また、あらかじめ用意されている特別なスクリプト名がいくつかあり、それらについては 「npm ⚪︎⚪︎」 の形式で、run を付けずに実行することができます。
【コマンド実行例】
npm test
npm start
npm stop
なお、使用の際は同様に、実行するスクリプトの内容を指定する必要があります。
【記述例】
"scripts": {
"start": "node index.js"
}
スクリプト名の前に 「pre」 もしくは 「post」 を付けると、該当スクリプトの前後に実行されるスクリプトを設定することができます。
例えば、以下のようにスクリプトが設定されているとします。
【記述例】
"scripts": {
"presample": "echo 'sample実行前'",
"sample": "echo 'sample実行'",
"postsample": "echo 'sample実行後'"
}
この状態で、「$ npm run sample」 とコマンドを実行すると、自動的に presample → sample → postsample の順番でスクリプトが実行されます。
binでパッケージが実行するコマンドを定義する
bin の項目では、パッケージを実行するためのコマンドを定義することができます。
定義の際は、以下のような形式で、コマンドと実行するファイルを指定します。
【記述例】
"bin": {
コマンド: 実行ファイル
}
コマンドを定義することにより、 パッケージのインストール時に ./node_modules/.bin/ ディレクトリにシンボリックリンクが作成され、npxを使用してコマンドが実行できるようになります。
【記述例】
"bin": {
"sample": "bin/sample.js"
}
【コマンド実行例】
npx sample
また、scriptsの項目で設定したスクリプトの実行時に、 上述したディレクトリにPATHが通されるため、以下のように設定することでもコマンドが実行できます。
【記述例】
"scripts": {
"sample": "sample"
}
【コマンド実行例】
npm run sample
なお、提供するコマンドが1つのみであり、かつパッケージ名と同じ名前のコマンドにする場合は、次のように記述することもできます。
【記述例】
"bin": "bin/sample.js"
一点、注意点として、シンボリックリンクの作成時に同名のファイルが既に存在する場合、両方のファイルをディレクトリに保存することはできないため、コマンドを設定する際はパッケージ名を使用するなどして、一意の名前となるようにしましょう。
バージョン情報に書かれる”^”や”~”の意味とは?
package.jsonファイルに記述されているバージョン情報には、 「~(チルダ)」 や 「^(キャレット)」 などの記号を用いて記述されているケースがよくあります。
それぞれ、使用する記号によって、インストールや更新対象となるバージョンの範囲指定が異なります。
~(チルダ)
明記したバージョン以下の変更を許容します。
(メジャーバージョンまでならマイナー以下、マイナーバージョンまでならパッチバージョン)
- ~1.2.3 の場合 … 1.2.3 以上 かつ 1.3.0 未満
- ~1.2 の場合 … 1.2.0 以上 かつ 1.3.0 未満
- ~1 の場合 … 1.0.0 以上 かつ 2.0.0 未満
^(キャレット)
ゼロでないバージョンの内、一番左側にあるもの以下の変更を許容します。
- ^1.2.3 の場合 … 1.2.3 以上 かつ 2.0.0 未満
- ^0.2.3 の場合 … 0.2.3 以上 かつ 0.3.0 未満
- ^0.0.3 の場合 … 0.0.3 以上 かつ 0.0.4 未満
*(アスタリスク)
全てのバージョンを許容します。
例えば、 1.2.3, 1.2.4, 1.3.0, 2.0.0 のバージョンがリリースされているパッケージがあるとします。
それぞれの記号を用いて(あるいは完全に固定して)バージョンが記述されている場合、インストールやアップデートを行なった際の結果は、以下の通りになります。
- 1.2.3 で固定した場合 … 1.2.3 を取得
- ~1.2.3 の場合 … 1.2.4 を取得
- ^1.2.3 の場合 … 1.3.0 を取得
- * の場合 … 2.0.0 を取得
なお、npm install コマンドでパッケージを追加した際のデフォルト表記は、キャレットを用いたバージョン指定となっています。
まとめ
いかがでしたでしょうか?
Node.js環境では数多くのnpmパッケージを扱うため、package.jsonをしっかりと理解しておくことが開発の効率化などにも重要になってきます。
使い方をマスターするまで、ぜひこちらの記事を何度でも読み返してみてください!
Node.jsの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、Node.jsに限らず、ITスキルを身につける際どうしても課題にぶつかってしまうことはありますよね。特に独学だとわからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。