dependenciesとdevDependenciesの違い【package.json】

調べたことメモ。

  • dependencies
    →「アプリ本体で使うよー」なパッケージ
  • devDependencies
    →「開発のときだけ使うよー」なパッケージ

インストール方法

例えば、パッケージAをインストールする場合は、それぞれ以下のように書きます。

  • npm install A
    Adependenciesに追加する
  • npm install -D A
    AdevDependenciesに追加する

使い分け

この2つを使い分ける理由は、主に以下の2つらしい。

  1. 「開発のときだけ使うパッケージ」と「アプリ本体で使われているパッケージ」が一目で分かるから
  2. 本番環境で使わないパッケージをインストールしないため

 

1つはそのままです。

package.jsondevDependenciesを見るだけで「このアプリではテストにJestを使ってるのね!」みたいに一目で分かりますよね!って話です。

 

2つ目もそのままなのですが、

例えば

  • テストパッケージ(Jestなど)
  • バンドルパッケージ(Babel、Webpackなど)

などのパッケージは本番環境では使いません。

こんなときに、本番環境では使わないパッケージをdevDependenciesに書いておくと、無駄なインストールを省けます。

 

具体的に言うと、npm installを実行するときに以下のどちらかのように設定しておくと、devDependenciesに書かれたパッケージはインストールしないようにできます。

  • --productionというオプションを付ける
    • 要するにnpm install --production と書いて実行するだけ
  • 環境変数のNODE_ENVproductionを指定する
    • NODE_ENV=production npm installというように実行時に環境変数を一時的に設定する
    • もしくは事前に環境変数としてして設定しておく(Linuxのexportコマンドを使う)
    • CI/CIサービスで実行する場合は、yamlファイルに環境変数を設定できる
      参考環境変数 – GitHub Docs

 

ちなみに、npm ciコマンドを実行するときも同じように、上のように設定しておくことでdevDependenciesに書かれたパッケージはインストールしないようにできます。

npm ciは文字通り、CIのときに実行すると便利なインストールコマンドです)

 

あと、npmに自作パッケージを登録するときも気をつけないとダメっぽいです。

例えば、自作パッケージAをnpmに登録した場合、第三者がnpm install Aとしてインストールした際には、devDependenciesのパッケージはインストールされないみたいです。なのでnpmに登録するようなツールを作る場合は、devDependenciesはかなり重要っぽいです。

結論

・「個人開発でテキトーに作ったやつをテキトーにデプロイする」みたいな場合は、全部dependenciesに書いても特に問題ないけど

・色々気にするなら、上で書いたように使い分けたほうが良いっぽい

 

おわり

Node.js
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。WEBエンジニア。

技術スタック:TypeScript/Next.js/Express/Docker/AWS

フォローする
フォローする

コメント

タイトルとURLをコピーしました