Katalogstruktur for TypeScript-prosjekter
Hva ville være en idiomatisk mappestruktur for et TypeScript-prosjekt?
Jeg ønsker de følgende funksjonene i en slik struktur:
- Separate kataloger for TypeScript-kildekode og transpilert JavaScript
- Separate kataloger for prosjektskoden og testkoden
- Mekanisme for å løse referanser på tvers av tester og kildekode.
Svar #1
Separere generert JS fra kilde-TS
Jeg vil anbefale å generere en enkeltfilutgang. Enten det er for nettleser eller for Node, er det bare en bedre idé. Husk at de fleste IDE-er kan skjule .gitignored filer, så et ryddig filpanel bør ikke være et problem å oppnå, selv om du lar .js-filene ligge rett ved siden av sine .ts-filer.
Du kan teknisk sett bruke --outDir for å outputte på den måten du ønsker ved å sette opp din tsconfig.json på riktig måte.
Separere tester fra kildekoden
Dette er ganske trivielt! Bare oppretthold en /tests. Importer fungerer enkelt ved å gå gjennom kataloger slik: import {MyClass} from "../src/modules/my-class" (hvor ../ er for å komme ut av /tests).
Mekanisme for å løse referanser
Dette er mer utfordrende i nettleseren enn på Node — sistnevnte har require som fungerer rett ut av boksen for TypeScript.
På nettleseren
Anbefaler på det sterkeste at du bruker noe som webpack, men hvis du insisterer på å leve livet på den farlige siden, her er en nettleservennlig require som jeg bruker for å raskt iterere på TypeScript-kode uten å ha en byggprosess satt opp.
require() for nettleseren
- Ikke for svake sjeler — dette er teknisk gjeld du vil pådra deg
Siden absolutte stier er nødvendige for å arbeide med web-innføringer, her er hvordan du kan bruke mitt require()-triks med TypeScript (vanligvis for en rask feilsøkingsøkt som ikke krever ombygging).
/entities/user.tsimport {Username} from "../entities/username";
import {Password} from "../entities/password";
export class User {
username: Username;
password: Password;
}
Hvor Username og Password er exporterte klasser i /entities/username.ts og /entities/password.ts henholdsvis.
Selv om ../entities/ kan virke overflødig, legg merke til at det er essensielt for at nettleseren skal ha riktige absolutte stier til våre Username og Password enheter. :)
Svar #2
Ser ut som om jeg gjorde det feil. Jeg prøvde følgende struktur:
src
|---- lib
|-----|---- mymodule.ts
|---- tests
|-----|---- mymodule.tests.ts
Jeg forsøkte imidlertid å kompilere kildekoden under lib-katalogen separat fra testkoden under tests.
find src/lib -name *.ts | xargs tsc --declaration --sourceMap --module commonjs --target es5 --listFiles --outDir libog deretter testkoden:
find src/tests -name *.ts | xargs tsc --declaration --sourceMap --module commonjs --target es5 --listFiles --outDir testsDette førte til at tests-mappen fikk en ny lib-undermappe og en tests-undermappe. Dette var ikke det jeg hadde tenkt å ha.
For å løse problemet mitt trengte jeg å kompilere dem sammen, så nå er kommandoen min:
find src -name *.ts | xargs tsc --declaration --sourceMap --module commonjs --target es5 --listFiles --outDir .Takk alle sammen for hjelpen.
