調べたことメモ。
- dependencies:
→「アプリ本体で使うよー」なパッケージ
- devDependencies:
→「開発のときだけ使うよー」なパッケージ
インストール方法
例えば、パッケージA
をインストールする場合は、それぞれ以下のように書きます。
npm install A
→A
をdependenciesに追加する
npm install -D A
→A
をdevDependenciesに追加する
使い分け
この2つを使い分ける理由は、主に以下の2つらしい。
- 「開発のときだけ使うパッケージ」と「アプリ本体で使われているパッケージ」が一目で分かるから
- 本番環境で使わないパッケージをインストールしないため
1つはそのままです。
package.json
のdevDependencies
を見るだけで「このアプリではテストにJestを使ってるのね!」みたいに一目で分かりますよね!って話です。
2つ目もそのままなのですが、
例えば
- テストパッケージ(Jestなど)
- バンドルパッケージ(Babel、Webpackなど)
などのパッケージは本番環境では使いません。
こんなときに、本番環境では使わないパッケージをdevDependencies
に書いておくと、無駄なインストールを省けます。
具体的に言うと、npm install
を実行するときに以下のどちらかのように設定しておくと、devDependencies
に書かれたパッケージはインストールしないようにできます。
--production
というオプションを付ける- 要するに
npm install --production
と書いて実行するだけ
- 要するに
- 環境変数の
NODE_ENV
にproduction
を指定する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に書いても特に問題ないけど
・色々気にするなら、上で書いたように使い分けたほうが良いっぽい
おわり
コメント