@ types / *が `dependencies`と` devDependencies`のどちらに入るかをどのように決定しますか?


194

私のプロジェクトではTypeScript 2を使用しています。いくつかのjsライブラリを使用したいのですが、そのライブラリのタイピングも使用します。タイプはシンプルで取り付け可能npm install @types/some-libraryです。私がするべき--saveか、それとも--save-dev彼らがするべきかわかりません。DefinetelyTyped GitHub readmeでも両方のバージョンについて言及しているように見えますが、説明はありません。devDependencies型は開発に必要であり、ランタイムでは使用されないため、@ typesはにあるはずだと思いますが、@ types だけで何度も見ましたdependencies。よくわかりません。

@ types / *を使用するかどうかをどのように決定すればdependenciesよいdevDependenciesですか?実際に、多少の公式指示はありますか?


バンドルを生成していますか、それとも他のユーザーが使用するパッケージですか?私はそれを参照してくださいとして、あなたは唯一の区別をする必要があるdependenciesdevDependencies、後者の場合には。
バレンティン

私は最初からjs / tsでゲームを作ります。すべてをwebpackにバンドルします。atmはまったくありませんが、すべてをElectronでラップして、いつかスタンドアロンにすることもできます。誰もが自分のアプリの依存関係としてそれを使用することはないと思いますが、それは可能だと思います(GTAゲームのミニゲームを考えてください。私のゲームはオープンソースです)。それでも、私はベストプラクティスを学び、それに従いたいと思っています。それが私がそのゲームを作る主な理由です。私のユースケースを十分に明確にしたいと思います。:)
カミル

1
はい、それは理にかなっています、私の元の答えがあなたのユースケースに関連していることを確認したかっただけです。バンドルを構築する際のdevDependenciesとの区別はまだ重要ではないと私はまだ考えています。これは強制するものでもありますが、最終的にはあなたが選択する必要がありますdependenciescreate-react-app
Valentin

回答:


132

devDependenciesに@ types / some-moduleパッケージがある "A"パッケージを開発しているとしましょう。何らかの理由で@ types / some-moduleから型をエクスポートしています

import {SomeType} from 'some-module';
export default class APackageClass {
     constructor(private config: SomeType) {

     }
}

現在、パッケージ「A」のdevDependenciesがインストールされていないため、パッケージ「A」のTypescriptコンシューマーは、SomeTypeを推測できません。

その特定のケースでは、通常の「依存関係」を持つ@ types / *パッケージを配置する必要があります。その他の場合は、「devDependencies」で十分です。


6
つまり、実装で型のみを使用する場合、その型定義は次のようになりdevDependenciesます。
フランクリンユー

6
はい@FranklinYu。タイプが宣言ファイルに現れたらすぐに、それをに配置する必要がありますdependencies。それ以外の場合devDependenciesは問題あり
ません

1
ただし、パッケージはTSとJSの両方で機能します。JS開発者は、コードをコンパイルするためにこれらの型を必要としません。型定義を追加するdependenciesと、依存関係ツリーが肥大化します。
タイラーロング

1
@TylerLong正解。完璧ではありませんが、それが現実です。オプションで "optionalDependencies"を使用することもできますが、大規模な場合は非常に煩わしいと思います。
wookieb

55

バンドルを生成するだけの場合は、とを区別する必要がない場合がdependenciesありdevDependenciesます。この機能はnpm、他のユーザーが使用できるパッケージを公開するときに一般的に役立ち、冗長な依存関係でそれらをスパムしたくありません。

依存関係の分割が役立つ他のユースケースがあるかもしれませんが、これが明確に必要でない限り、どちらかを選択してすべてをそこに配置することをお勧めします。必要に応じて、後で分割することは難しくありません。

このプラクティスのよく知られている例IRLはcreate-react-app、デフォルトでは、イジェクトされないボイラープレートによって作成されdependencies、すべてがに配置されます。このスレッドこの回答を参照してください


7
あなたがパッケージを公開していない場合、それは正しいのですが、あなたがしている場合、それはでランタイムとすべて対開発とは何の関係もありません。このパッケージを構築するために必要なものこのパッケージを使用するために必要なものを
Yogu

1
@Yoguそれが私が最初に区別をした理由で、そうです、私はあなたに完全に同意します
バレンティン

12
私はこのアドバイスに同意しません。devDependenciesを実行するときnpm install --production(またはnpm ci --production)はインストールされないため、製品コードを実行するときには使用できません。これは、単なるライブラリではなく、サービスにとって非常に意味のある違いです。
Brad Wilson、

2
@BradWilsonポイントがあります。多くのnpmワークフローが太陽の下にあります。ユースケースで区別する必要がある場合は、必ず区別してください。このジレンマに対する独自の答えを提供してください。
Valentin

私の回答を更新して、区別が意味をなす可能性のある他のユースケースの存在について言及し、実際の例を示しました。フィードバックをお寄せいただきありがとうございます!
Valentin

15

Node.jsアプリケーションを本番環境にデプロイする特定のケースでは、アプリケーションの実行に必要な依存関係のみをインストールする必要があります。

npm install --production または

npm ci --production または

yarn --production

その場合、devDependenciesインストールの肥大化を防ぐために、タイプはに含める必要があります。

備考:これは、別の回答に対するBrad Wilsonのコメントで言及されたことを承知しています。しかし、この点は答えに値するように思えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.