typescript - Kako da odlučim ide li @types/* u `dependencies` ili `devDependencies`?


Koristim TypeScript 2 u svom projektu. Volio bih koristiti neku JavaScript biblioteku, ali i tipove za tu biblioteku. Tipove mogu instalirati jednostavnim npm install @types/some-library. Nisam siguran trebam li ih --save ili --save-dev. Čini mi se da čak i DefinetelyTyped GitHub readme na neki način spominje obje verzije, ali ih nikad ne objašnjava. Mislio bih da @types trebaju biti u devDependencies, budući da su tipovi potrebni za razvoj i ne koriste se u runtime-u, ali sam mnoge puta vidio @types u samim dependencies. Zbunjen sam.

Kako bih trebao odlučiti ide li @types/* u dependencies ili devDependencies? Postoje li zapravo neke više ili manje službene upute?

Odgovor #1

Pretpostavimo da razvijate paket "A" koji u devDependencies ima paket @types/some-module. Iz nekog razloga izvozite tip iz @types/some-module:

import { SomeType } from 'some-module';

export default class APackageClass {
  constructor(private config: SomeType) {
    // …       
  }
}

Trenutno potrošači TypeScripta paketa "A" ne mogu pogoditi što je SomeType, budući da devDependencies paketa "A" nisu instalirani.

U tom posebnom slučaju morate staviti paket @types/* s redovitim dependencies. Za druge slučajeve devDependencies su dovoljni.

Odgovor #2

Ako samo generirate paket, možda neće biti potrebe da pravite razliku između dependencies i devDependencies. Ova značajka npm-a općenito je korisna prilikom objavljivanja paketa koji drugi mogu koristiti i kada im ne želite slati nepotrebne ovisnosti.

Mogu postojati i drugi slučajevi upotrebe gdje bi razdvajanje ovisnosti moglo biti korisno, ali osim ako nemate izričitu potrebu za tim, moj savjet je da jednostavno odaberete jedno mjesto i tamo smjestite sve. Nije teško razdvojiti ih kasnije ako se pojavi potreba.

Dobro poznat primjer ove prakse u stvarnom životu je create-react-app, po defaultu, neizvučeni boilerplate koji stvori stavlja sve u dependencies, pogledajte ovu temu i ovaj odgovor

Odgovor #3

U konkretnom slučaju postavljanja Node.js aplikacije u produkciju, želi se instalirati samo ovisnosti potrebne za pokretanje aplikacije.

npm install --omit=dev ili

npm ci --production ili

yarn --production

U tom slučaju, tipovi bi trebali biti u devDependencies, kako bi se spriječilo da instalacija postane previše opterećena.

(Kako bi se izbjegla nesporazuma, opcija --production ili --omit=dev ne smije se koristiti na računalima na kojima se aplikacija gradi, inače će TypeScript kompajler prijaviti pogrešku.)

Napomene: Svjestan sam da je ovo spomenuto u komentaru Brada Wilsona na drugi odgovor. Ipak, čini se da je ova točka vrijedna da bude odgovor.

Povezani članci