Come faccio a decidere se @ types / * va in `dipendenze` o` devDependencies`?


200

Uso TypeScript 2 nel mio progetto. Mi piacerebbe usare alcune librerie js, ma anche digitare per quella libreria. Posso installare i tipi con semplice npm install @types/some-library. Non sono sicuro che dovrei --saveo --save-devloro. Mi sembra che anche il file GitHub DefinetelyTyped menzioni entrambe le versioni, ma non le spiega mai. Penserei che @types dovrebbe essere presente devDependencies, poiché i tipi sono necessari per lo sviluppo e non vengono utilizzati in runtime, ma ho visto molte volte @types in solo dependencies. Non ho capito bene.

Come devo decidere se @ types / * va inserito dependencieso devDependencies? Ci sono in realtà alcune istruzioni più o meno ufficiali?


Stai generando un pacchetto o è un pacchetto che verrà utilizzato da altri? A mio avviso, devi solo fare una distinzione tra dependenciese devDependenciesin quest'ultimo caso.
Valentin,

Faccio qualche gioco in js / ts da zero. Unisco tutto con il webpack. Non c'è nessun backend, ma è possibile che un giorno avvolgerò tutto in Electron per renderlo autonomo. Non penso che nessuno lo userà mai come dipendenza nella propria app, ma credo che potrebbe essere possibile (penso ai mini giochi nei giochi GTA; e il mio gioco è open source). Tuttavia, voglio imparare e seguire le migliori pratiche ed è la ragione principale per cui realizzo quel gioco. Spero di aver chiarito abbastanza bene il mio caso d'uso. :)
kamyl

1
Sì, ha senso, volevo solo assicurarmi che la mia risposta originale fosse pertinente al tuo caso d'uso. Penso ancora che la distinzione tra devDependenciesed dependenciesè irrilevante quando si crea un pacchetto, è qualcosa che create-react-appimpone anche ma alla fine spetta a te scegliere
Valentin

Risposte:


140

Supponiamo che tu stia sviluppando un pacchetto "A" che ha un pacchetto @ types / some-module in devDependencies. Per qualche motivo stai esportando il tipo da @ types / some-module

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

     }
}

Al momento, i consumatori di dattiloscritti del pacchetto "A" non sono in grado di indovinare cosa sia SomeType, poiché devDipendenze del pacchetto "A" NON sono installate.

In quel caso particolare DEVI inserire il pacchetto @ types / * con "dipendenze" regolari. Per altri casi "devDependencies" è abbastanza buono.


7
Quindi sottintendi che, se uso solo il tipo in implementazione, può essere la definizione del tipo devDependencies?
Franklin Yu,

7
Sì @FranklinYu. Non appena il tipo appare nel file di dichiarazione, è necessario inserirlo dependencies. Altrimenti devDependenciesva bene
wookieb il

1
Ma un pacchetto funziona sia per TS che per JS. Gli sviluppatori JS non hanno bisogno di questi tipi per compilare il loro codice. Aggiunta la definizione del tipo a dependenciesfarà la dipendenza albero gonfio.
Tyler Long,

1
@TylerLong Correct. Non è perfetto ma questa è la realtà. Opzionalmente Puoi anche usare "Dipendenze opzionali" ma credo che su scala potrebbe essere molto fastidioso.
wookieb,

55

Se stai solo generando un pacchetto, potrebbe non essere necessario fare la distinzione tra dependenciese devDependencies. Questa funzionalità di npmè generalmente utile quando si pubblica un pacchetto che può essere utilizzato da altri e non si desidera spammarli con dipendenze ridondanti.

Potrebbero esserci altri casi d'uso in cui dividere le dipendenze può essere utile, ma a meno che tu non ne abbia un'esigenza esplicita, il mio consiglio è di scegliere uno dei due e posizionare tutto lì. Non è difficile dividerli in seguito in caso di necessità.

Un esempio ben noto di questa pratica IRL è create-react-app, per impostazione predefinita, il boilerplate non espulso che crea posiziona tutto dependencies, vedi questo thread e questa risposta


8
Se non stai pubblicando il pacchetto, è corretto, ma se lo sei, non ha nulla a che fare con lo sviluppo rispetto al runtime e tutto ciò che è necessario per creare questo pacchetto rispetto a ciò che è necessario per utilizzare questo pacchetto .
Yogu,

1
@Yogu Ecco perché ho fatto la distinzione in primo luogo, quindi sì, sono completamente d'accordo con te
Valentin

13
Non sono d'accordo con questo consiglio. devDependenciesnon sono installati quando lo fai npm install --production(o npm ci --production) e quindi non sono disponibili quando si esegue il codice di produzione. Questa è una differenza molto significativa per un servizio, non solo per una biblioteca.
Brad Wilson,

2
@BradWilson Hai ragione, ci sono molti flussi di lavoro npm sotto il sole, se il tuo caso d'uso ti richiede di fare la distinzione, allora fallo. Sentiti libero di fornire la tua risposta a questo dilemma.
Valentin,

Ho aggiornato la mia risposta per menzionare l'esistenza di altri casi d'uso in cui la distinzione può essere significativa e ho fornito esempi del mondo reale. Grazie per il feedback!
Valentin,

15

Nel caso particolare della distribuzione di un'applicazione Node.js in produzione, si desidera installare solo le dipendenze necessarie per eseguire l'applicazione.

npm install --production o

npm ci --production o

yarn --production

In tal caso, i tipi dovrebbero essere in devDependencies, per impedire loro di gonfiare l'installazione.

Nota: sono consapevole che questo è stato menzionato in un commento di Brad Wilson a un'altra risposta. Questo punto sembra degno di essere una risposta, però.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.