依存関係の種類

依存関係は、多くの異なる目的を果たします。 ある依存関係はプロジェクトのビルドに必要で、他にはプログラムを実行するのに必要なものもあります。 このように様々な異なる種類の依存関係(例えば、dependenciesdevDependenciespeerDependencies) を持つことができます。

package.json には、これらの依存関係が全てふくまれます:

{
  "name": "my-project",
  "dependencies": {
    "package-a": "^1.0.0"
  },
  "devDependencies": {
    "package-b": "^1.2.1"
  },
  "peerDependencies": {
    "package-c": "^2.5.4"
  },
  "optionalDependencies": {
    "package-d": "^3.1.0"
  }
}

大抵の人は dependenciesdevDependencies だけを使用しますが、それらの各々について理解しておくことが重要です。

dependencies

これれは通常の依存関係か、もしくはコードの実行時に必要なもの(例えば React または ImmutableJS など)です。

devDependencies

これらは開発用の依存関係です。開発ワークフローのどこかで必要で、コードの実行時には必要のない依存関係です(例:Babel もしくは Flow)。

peerDependencies

peer 依存関係は特別な種類で、自身のパッケージを公開したい場合のみ扱うものです。

peer 依存関係を持つことは、あなたのパッケージがパッケージをインストールする人と全く同じ依存関係を必要とするということです。 react のように、それをインストールした人からも使用される、単一の react-dom のコピーを持つ必要があるパッケージで役に立ちます。

optionalDependencies

省略可能な依存関係とは、まさに言葉通りです:省略可能です。インストールに失敗した場合でも、Yarn はインストールに成功したと報告するでしょう。

必ずしも全てのマシン上で動作する必要がなく、インストールされなかった場合のフォールバック方法があるような依存関係で役に立ちます(例: Watchman)。

bundledDependencies

パッケージを公開する際にバンドルされるパッケージ名の配列です。

バンドルされる依存関係はプロジェクト内に配置される必要があります。機能としては通常の依存関係と基本的に同じです。 yarn pack を実行した場合にも一緒に圧縮されます。

通常の依存関係は、大抵 npm レジストリからインストールされます。バンドルされた依存関係は通常の依存関係では十分ではない場合に役に立ちます:

  • npm レジストリに存在しない、もしくは改造されたサードパーティ製のライブラリを再利用したい場合。
  • 自身のプロジェクトをモジュールとして再利用する場合。
  • モジュールと共にファイルを配布したい場合。