Node.jsプロジェクトを始める際、最初に作成するのがpackage.jsonファイルです。このファイルはプロジェクトのメタデータ、依存関係、スクリプトなどを一元管理する設定ファイルであり、Node.js開発の基盤となります。本記事では、npm initによるプロジェクト初期化からpackage.jsonの詳細な構造、セマンティックバージョニング、npmスクリプトの活用方法までを体系的に解説します。
実行環境
| 項目 | バージョン |
|---|---|
| Node.js | 20.x LTS以上 |
| npm | 10.x以上 |
| OS | Windows/macOS/Linux |
前提条件
- JavaScriptの基礎文法を理解していること
- ターミナル(コマンドライン)の基本操作ができること
- Node.jsとnpmがインストール済みであること
バージョンは以下のコマンドで確認できます。
|
|
npm initによるプロジェクト初期化
新しいNode.jsプロジェクトを始める際は、npm initコマンドを使用してpackage.jsonファイルを作成します。
対話形式での初期化
まず、プロジェクト用のディレクトリを作成し、移動します。
|
|
npm initコマンドを実行すると、対話形式でプロジェクト情報を入力できます。
|
|
以下のような質問が順番に表示されます。
|
|
各項目について説明します。
| 項目 | 説明 | デフォルト値 |
|---|---|---|
| package name | パッケージ名(小文字、ハイフン区切り推奨) | ディレクトリ名 |
| version | 初期バージョン | 1.0.0 |
| description | プロジェクトの説明 | 空文字 |
| entry point | メインエントリーポイントファイル | index.js |
| test command | テスト実行コマンド | 空文字 |
| git repository | Gitリポジトリ URL | 空文字 |
| keywords | 検索用キーワード(カンマ区切り) | 空配列 |
| author | 作者情報 | 空文字 |
| license | ライセンス | ISC |
すべての質問に回答すると、確認画面が表示されます。内容を確認して「yes」を入力すると、package.jsonファイルが生成されます。
クイック初期化
すべてデフォルト値で素早くpackage.jsonを作成したい場合は、-yフラグを使用します。
|
|
このコマンドを実行すると、対話なしで即座にpackage.jsonが生成されます。
|
|
デフォルト値のカスタマイズ
npm configコマンドで、npm initのデフォルト値を事前に設定できます。
|
|
設定した値はnpm config listで確認できます。
|
|
package.jsonの構造を理解する
package.jsonはJSON形式のファイルで、プロジェクトに関するあらゆる情報を定義します。主要なフィールドを詳しく見ていきましょう。
基本フィールド
name(パッケージ名)
パッケージ名は以下のルールに従う必要があります。
- 214文字以下
- 小文字のみ使用(npmレジストリに公開する場合)
- ハイフン(-)とアンダースコア(_)は使用可能
- URLセーフな文字のみ使用
|
|
スコープ付きパッケージの場合は、@scope/package-name形式で指定します。
|
|
version(バージョン)
セマンティックバージョニング(後述)に従ったバージョン番号を指定します。
|
|
description(説明)
プロジェクトの簡潔な説明を記述します。npmレジストリでの検索結果に表示されます。
|
|
main(エントリーポイント)
パッケージがrequireまたはimportされたときに読み込まれるメインファイルを指定します。
|
|
type(モジュールタイプ)
ES Modulesを使用する場合は"module"を指定します。CommonJSを使用する場合は"commonjs"(デフォルト)です。
|
|
実際のpackage.json例
典型的なNode.jsプロジェクトのpackage.jsonを見てみましょう。
|
|
dependenciesとdevDependenciesの違い
package.jsonにおける依存関係管理は、Node.js開発で最も重要な概念の一つです。
dependencies(本番依存関係)
dependenciesには、アプリケーションの実行に必要なパッケージを記述します。これらは本番環境でも必要になるパッケージです。
|
|
パッケージをdependenciesに追加するには、以下のコマンドを使用します。
|
|
devDependencies(開発依存関係)
devDependenciesには、開発時にのみ必要なパッケージを記述します。テストフレームワーク、リンター、ビルドツールなどが該当します。
|
|
パッケージをdevDependenciesに追加するには、--save-devまたは-Dフラグを使用します。
|
|
使い分けの判断基準
以下の図は、依存関係の分類方法を示しています。
flowchart TD
A[パッケージをインストールする] --> B{本番環境で必要?}
B -->|はい| C[dependencies]
B -->|いいえ| D{開発時に必要?}
D -->|はい| E[devDependencies]
D -->|いいえ| F[インストール不要]
C --> G["npm install package"]
E --> H["npm install -D package"]具体的な例を挙げると以下のようになります。
| パッケージ | 種類 | 理由 |
|---|---|---|
| express | dependencies | サーバー実行に必要 |
| dotenv | dependencies | 環境変数読み込みに必要 |
| eslint | devDependencies | コード品質チェックは開発時のみ |
| jest | devDependencies | テストは開発時のみ |
| typescript | devDependencies | コンパイルは開発時のみ |
peerDependencies(ピア依存関係)
プラグインやライブラリを開発する場合、ホストパッケージとの互換性を示すためにpeerDependenciesを使用します。
|
|
optionalDependencies(オプション依存関係)
インストールに失敗しても問題ないパッケージはoptionalDependenciesに記述します。
|
|
セマンティックバージョニングを理解する
セマンティックバージョニング(Semantic Versioning、略してSemVer)は、バージョン番号に意味を持たせる規約です。npmはこの規約に基づいてバージョン管理を行います。
バージョン番号の構造
セマンティックバージョニングでは、バージョン番号をMAJOR.MINOR.PATCHの3つの数字で表現します。
|
|
各要素の意味は以下の通りです。
| 要素 | 変更タイミング | 例 |
|---|---|---|
| MAJOR | 互換性のないAPI変更 | 1.0.0 → 2.0.0 |
| MINOR | 後方互換性のある機能追加 | 1.0.0 → 1.1.0 |
| PATCH | 後方互換性のあるバグ修正 | 1.0.0 → 1.0.1 |
バージョン範囲指定子
npmでは、依存パッケージのバージョンを柔軟に指定できます。
キャレット(^)
最も一般的な指定方法です。MAJOR バージョンを固定し、MINOR と PATCH のアップデートを許可します。
|
|
この場合、4.21.0以上5.0.0未満の最新バージョンがインストールされます。
チルダ(~)
MAJOR と MINOR バージョンを固定し、PATCH のアップデートのみを許可します。
|
|
この場合、4.17.21以上4.18.0未満の最新バージョンがインストールされます。
その他の指定方法
|
|
バージョン指定の比較表
| 指定 | 意味 | 1.2.3での許容範囲 |
|---|---|---|
^1.2.3 |
互換性のある変更を許可 | >=1.2.3 <2.0.0 |
~1.2.3 |
パッチバージョンのみ許可 | >=1.2.3 <1.3.0 |
1.2.3 |
厳密にこのバージョン | 1.2.3のみ |
1.2.x |
パッチバージョンは任意 | >=1.2.0 <1.3.0 |
1.x |
マイナー以降は任意 | >=1.0.0 <2.0.0 |
* |
任意のバージョン | すべて |
プレリリースバージョン
開発中のバージョンには、プレリリース識別子を付加できます。
|
|
プレリリースバージョンは、通常のバージョンよりも優先度が低くなります。
|
|
npmスクリプトの活用方法
package.jsonのscriptsフィールドを使用すると、よく使うコマンドをエイリアスとして定義できます。
scriptsフィールドの基本
|
|
定義したスクリプトはnpm run <script-name>で実行できます。
|
|
特別なスクリプト名
一部のスクリプト名には特別な意味があり、runを省略して実行できます。
| スクリプト名 | 実行コマンド | 用途 |
|---|---|---|
| start | npm start |
アプリケーション起動 |
| test | npm test または npm t |
テスト実行 |
| stop | npm stop |
アプリケーション停止 |
| restart | npm restart |
再起動(stop → start) |
|
|
ライフサイクルスクリプト
npmは特定のタイミングで自動的にスクリプトを実行します。
flowchart LR
A[preinstall] --> B[install] --> C[postinstall]
D[prepublish] --> E[prepare] --> F[prepublishOnly]
G[prepack] --> H[pack] --> I[postpack]代表的なライフサイクルスクリプトは以下の通りです。
| スクリプト | 実行タイミング |
|---|---|
| preinstall | npm install実行前 |
| install | npm install実行時 |
| postinstall | npm install完了後 |
| prepare | npm install完了後、npm publish前 |
| prepublishOnly | npm publish前のみ |
|
|
pre/postフック
任意のスクリプトにpreとpostプレフィックスを付けることで、前後に実行されるフックを定義できます。
|
|
npm run buildを実行すると、以下の順序で実行されます。
prebuild(distディレクトリを削除)build(TypeScriptコンパイル)postbuild(package.jsonをコピー)
スクリプトの連結と並列実行
複数のコマンドを組み合わせる方法があります。
順次実行(&&)
|
|
並列実行
npm-run-allパッケージを使用すると、スクリプトの並列実行が可能です。
|
|
|
|
| コマンド | 機能 |
|---|---|
run-s |
順次実行 |
run-p |
並列実行 |
run-s lint:* |
lint:で始まるすべてのスクリプトを順次実行 |
run-p build:* |
build:で始まるすべてのスクリプトを並列実行 |
環境変数とスクリプト
スクリプト内で環境変数を使用できます。
|
|
Windowsでも動作させるには、cross-envパッケージを使用します。
|
|
|
|
引数の受け渡し
スクリプトに引数を渡すには--を使用します。
|
|
package.jsonでデフォルト引数を設定することもできます。
|
|
enginesフィールドでNode.jsバージョンを指定する
プロジェクトが特定のNode.jsバージョンを必要とする場合、enginesフィールドで指定できます。
|
|
この設定により、互換性のないNode.jsバージョンを使用している開発者に警告が表示されます。
.npmrcファイルでengine-strict=trueを設定すると、互換性のないバージョンでのインストールがエラーになります。
|
|
package-lock.jsonの役割
npm installを実行すると、package-lock.jsonファイルが自動生成されます。このファイルは以下の役割を持ちます。
- 再現性の確保: 依存関係の正確なバージョンを記録し、異なる環境でも同じバージョンがインストールされることを保証します
- 高速なインストール: 依存関係ツリーが事前に計算されているため、インストールが高速化されます
- セキュリティ: 各パッケージの整合性ハッシュ(integrity)を記録し、改ざんを検知できます
package-lock.jsonは必ずバージョン管理(Git)にコミットしてください。
|
|
npm ciコマンド
CI/CD環境やチーム開発では、npm installではなくnpm ciの使用が推奨されます。
|
|
npm ciの特徴は以下の通りです。
| npm install | npm ci |
|---|---|
| package-lock.jsonを更新する | package-lock.jsonを変更しない |
| 既存のnode_modulesを保持 | node_modulesを削除して再作成 |
| バージョン範囲で最新を取得 | package-lock.json通りにインストール |
| 開発時に使用 | CI/CD環境で使用 |
実践: プロジェクトを初期化する
ここまでの知識を活かして、実際にプロジェクトを初期化してみましょう。
ステップ1: プロジェクトの作成
|
|
ステップ2: package.jsonの編集
生成されたpackage.jsonを編集します。
|
|
ステップ3: 依存関係のインストール
|
|
ステップ4: ディレクトリ構造の作成
|
|
ステップ5: エントリーポイントの作成
src/index.jsを作成します。
|
|
ステップ6: 動作確認
|
|
別のターミナルで動作確認します。
|
|
まとめ
本記事では、Node.jsプロジェクトの始め方として、以下の内容を解説しました。
npm initコマンドによるプロジェクト初期化方法- package.jsonの構造と主要フィールドの意味
- dependenciesとdevDependenciesの使い分け
- セマンティックバージョニングとバージョン範囲指定子
- npmスクリプトの定義と活用方法
- enginesフィールドによるNode.jsバージョン制約
- package-lock.jsonの役割とnpm ciコマンド
package.jsonはNode.jsプロジェクトの心臓部です。その構造を正しく理解し、依存関係とスクリプトを適切に管理することで、保守性の高いプロジェクトを構築できます。
次回は、Node.jsの組み込みオブジェクト(process、global、Buffer)について解説します。