TL;DR
- npm の依存には
dependencies、devDependencies、peerDependenciesなどの種類がある。 - TypeScript は開発ツールで、型情報は実行時に存在しないので、TypeScript も
@typesもdevDependenciesに入れる。
内容
npm の依存の種類
npm の package.json では、依存パッケージをいくつかの種類に分けて書く。
dependencies は、実行時に必要なパッケージである。npm に公開したパッケージをインストールすると、その dependencies もインストールされる(推移的依存関係)。
devDependencies は、開発やテストでは必要だが、実行時には要らないパッケージである。dependencies とは違い、推移的にはインストールされない。
peerDependencies は、実行時に必要だが、そのバージョン管理の責任は負いたくないパッケージである。たとえば React のコンポーネントを公開する場合、コンポーネント側で React のバージョンを指定すると、利用者のページで複数のバージョンの React が動くおそれがある。そこで React を peerDependencies に入れて互換性のあるバージョンだけを指定すれば、実際に使うバージョンの選択を利用者に任せられる。
TypeScript と @types は devDependencies に入れる
TypeScript は開発ツールであり、型情報は実行時に存在しない。そのため、TypeScript は一般に devDependencies に入れる。同じ理由で、@types も devDependencies に入れるべきである。
ほかにも理由がある。
- 型の推移的な依存を避けるため(項目70 型を部分的にコピーして依存を断ち切る)
- Web アプリケーションのイメージを小さくし、起動を速くするため
- エンドユーザに直接影響する
dependenciesの更新を優先できるようにするため。Dependabot や Renovate には、dependenciesを優先する設定がある