354 votes

Comment puis-je décider si @types/* doit aller dans `dependencies` ou `devDependencies` ?

J'utilise TypeScript 2 dans mon projet. J'aimerais utiliser une bibliothèque js, mais aussi les typings pour cette bibliothèque. Je peux installer les types avec simplement npm install @types/some-library. Je ne suis pas sûr si je devrais les --save ou --save-dev. Il me semble que même le readme de DefinetelyTyped GitHub mentionne les deux versions, mais ne les explique jamais. Je penserais que @types devrait être dans devDependencies, car les types sont nécessaires pour le développement et ne sont pas utilisés en runtime, mais j'ai vu de nombreuses fois @types dans simplement dependencies. Je suis confus.

Comment devrais-je décider si @types/* doit aller dans les dependencies ou les devDependencies? Y a-t-il en fait des instructions officielles plus ou moins officielles?

0 votes

Générez-vous un bundle ou s'agit-il d'un package qui sera utilisé par d'autres? Selon moi, vous avez seulement besoin de faire la distinction entre les balises dependencies et devDependencies dans le dernier cas.

0 votes

Je crée des jeux en js/ts à partir de zéro. J'assemble tout avec webpack. Il n'y a actuellement pas de backend du tout, mais il est possible que je regroupe tout dans Electron pour le rendre autonome un jour. Je ne pense pas que quiconque l'utilisera un jour comme dépendance dans sa propre application, mais je suppose que cela pourrait être possible (pensez aux mini-jeux dans les jeux de GTA ; et mon jeu est open source). Néanmoins, je veux apprendre et suivre les meilleures pratiques et c'est la principale raison pour laquelle je crée ce jeu. J'espère avoir suffisamment clarifié mon cas d'utilisation. :)

1 votes

Oui, cela a du sens, je voulais juste m'assurer que ma réponse initiale était pertinente pour votre cas d'utilisation. Je pense toujours que la distinction entre les devDependencies et les dependencies est sans importance lors de la construction d'un bundle, c'est quelque chose que create-react-app impose également mais finalement c'est à vous de choisir

256voto

wookieb Points 146

Supposons que vous développez un package "A" qui inclut le package @types/some-module dans devDependencies. Pour une raison quelconque, vous exportez le type de @types/some-module

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

     }
}

Actuellement, les consommateurs de Typescript du package "A" ne peuvent pas deviner ce qu'est SomeType, car les devDependencies du package "A" ne sont PAS installées.

Dans ce cas particulier, vous DEVEZ placer le package @types/* avec les "dependencies" régulières. Pour d'autres cas, les "devDependencies" sont suffisants.

14 votes

Alors, tu sous-entends que, si j'utilise uniquement le type dans l'implémentation, sa définition de type peut être devDependencies ?

17 votes

Oui @FranklinYu. Dès que le type apparaît dans le fichier de déclaration, vous devez le placer dans dependencies. Sinon, devDependencies est correct

3 votes

Mais un package fonctionne à la fois pour TS et JS. Les développeurs JS n'ont pas besoin de ces types pour compiler leur code. Ajouter la définition de type aux dépendances rendra l'arbre des dépendances volumineux.

77voto

Valentin Points 424

Si vous ne faites que générer un bundle, il peut ne pas être nécessaire de faire la distinction entre dependencies et devDependencies. Cette fonctionnalité de npm est généralement utile lors de la publication d'un package pouvant être utilisé par d'autres et que vous ne voulez pas les submerger de dépendances redondantes.

Il peut y avoir d'autres cas d'utilisation où la division des dépendances peut être utile, mais à moins d'avoir un besoin spécifique, mon conseil est de simplement choisir l'un ou l'autre et de tout placer là. Il n'est pas difficile de les diviser par la suite si le besoin se fait sentir.

Un exemple bien connu de cette pratique IRL est create-react-app, par défaut le boilerplate non-éjecté qu'il crée place tout dans dependencies, voir ce thread et cette réponse

12 votes

Si vous ne publiez pas le package, c'est correct, mais si vous le faites, cela n'a rien à voir avec le développement par rapport à l'exécution et tout avec ce qui est nécessaire pour construire ce package par rapport à ce qui est nécessaire pour utiliser ce package.

1 votes

@Yogu C'est pourquoi j'ai fait la distinction dès le départ, donc oui, je suis tout à fait d'accord avec vous

28 votes

Je ne suis pas d'accord avec ce conseil. devDependencies ne sont pas installées lorsque vous exécutez npm install --production (ou npm ci --production) et ne sont donc pas disponibles lors de l'exécution du code de production. C'est une différence très significative pour un service, pas seulement une bibliothèque.

32voto

Dans le cas particulier du déploiement d'une application Node.js en production, on veut installer uniquement les dépendances nécessaires pour exécuter l'application.

npm install --production ou

npm ci --production ou

yarn --production

Dans ce cas, les types devraient être dans les devDependencies, pour éviter qu'ils ne surchargent l'installation.

Remarque : Je suis conscient que cela a été mentionné dans un commentaire de Brad Wilson à une autre réponse. Ce point mérite cependant d'être une réponse à part entière.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X