2015-06-19 2 views
74

Sto lavorando al mio primo modulo NPM. Ho lavorato brevemente con dattiloscritto e un grosso problema era che per molti moduli non erano disponibili file di definizione. Quindi ho pensato che sarebbe una buona idea scrivere il mio modulo in dattiloscritto.Scrittura di moduli NPM in Typescript

Tuttavia, non riesco a trovare alcuna informazione sul modo migliore per farlo. Ho trovato questa domanda correlata "Can I write npm package in coffeescript?" dove le persone suggeriscono di pubblicare solo i file javascript. Ma a differenza dei file coffeescript, i file typescript potrebbero essere utili se vengono utilizzati all'interno di un'applicazione dattiloscritto.

Devo includere i file Typescript durante la pubblicazione di un modulo NPM o devo solo pubblicare i file javascript e fornire i file .d.ts generati su DefinitelyTyped?

+0

Note utili: Ho scritto il progetto, [copee] (https://github.com/styfle/copee), insieme a un [post di blog] (https://medium.com/@styfle/es6-modules -oggi-con-dattiloscritto-22969cd360f0) per guidare l'utente attraverso la configurazione di un progetto TS per emettere definizioni di tipo insieme a obiettivi CJS ed ESM prima di pubblicare su npm. Ciò massimizzerà l'utilizzo con node.js e browser in futuro. – styfle

risposta

70

Qui è un modulo di esempio Nodo scritto a macchina: https://github.com/basarat/ts-npm-module

Ecco un progetto di esempio dattiloscritto che utilizza questo modulo di esempio https://github.com/basarat/ts-npm-module-consume

Fondamentalmente è necessario:

  • compilare con commonjs e declaration:true
  • generare un file .d.ts

E poi

  • avere il vostro IDE leggere il generato .d.ts.

Atom-dattiloscritto solo fornisce un bel flusso di lavoro intorno a questo: https://github.com/TypeStrong/atom-typescript#packagejson-support

+0

È necessario aggiornare il collegamento di ancoraggio Atom-TypeScript (ancora non più valido). –

+0

@basarat, in ts-npm-module si sta utilizzando "versione": "1.5.0-alpha". Presumo che questa sia la versione di Typescript con cui stai trasponendo. Ha importanza lasciarlo fuori? (non è fatto automaticamente dal plugin Atom). Se viene usata una versione, questo richiederà ad altri utenti di usare la versione esatta per traspare (o solo quelli più recenti)? (o forse è la versione di tsconfig.json?) – justin

+0

Avete qualche caso d'uso con moduli dipendenti da altre librerie? Per evitare il problema della definizione dei duplicati è necessario configurare 'tsconfig.json', ma a mio avviso questo sembra troppo manuale. –

4

È possibile utilizzare autodts per gestire la distribuzione e l'utilizzo di .d.ts file da NPM anche senza il supporto dall'atomo IDE.

autodts generate sarà impacchettare tutto tuo .d.ts file insieme per la pubblicazione sul NPM, e autodts link gestisce riferimenti ad altri pacchetti installati, che non possono essere sempre direttamente sotto node_modules in un progetto più ampio suddivisi in più sottopacchetti.

Entrambi i comandi leggono le loro impostazioni da package.json e tsconfig.json nello stile "convenzione sulla configurazione".

C'è another answer su stackoverflow e un blog post con ulteriori dettagli.

53

Questa è una risposta più recente che utilizza TypeScript 1.8.10:

La mia struttura del progetto è:

| 
|--- src 
|--- test 
|--- dist  <= My gulp file compiles and places the js, sourcemaps and .d.ts files here 
|  |--- src 
|  |--- test 
|--- typings 
.gitignore 
.npmignore 
gulpfile.js 
package.json 
README.md 
tsconfig.json 
tslint.json 
typings.json 

ho aggiunto quanto segue in .npmignore per evitare di includere i file estranei e mantenere il minimo indispensabile per avere il pacchetto importato e di lavoro:

node_modules/ 
*.log 
*.tgz 

src/ 
test/ 
gulpfile.js 
tsconfig.json 
tslint.json 
typings.json 
typings 
dist/test 

mio .gitignore ha:

typings 

# ignore .js.map files 
*.js.map 
*.js 
dist 

Il mio package.json ha:

"main": "dist/src/index.js", 
"typings": "dist/src/index.d.ts", 

Ora scappo: npm pack

Il file risultante (quando decompresso) ha la seguente struttura:

| 
|--- dist 
|  |--- src 
|    | 
|    index.js 
|    index.js.map 
|    index.d.ts 
| 
package.json 
README.md 

Ora vado al progetto in cui voglio usare questo come una libreria e tipo: npm install ./project-1.0.0.tgz

Si installa correttamente.

Ora crea un file index.ts nel mio progetto in cui ho appena installato il NPM import Project = require("project");

Digitando Project. mi dà le opzioni Intellisense che era il punto di tutta questa esercitazione.

Spero che questo aiuti qualcun altro a utilizzare i propri progetti npm TypeScript come librerie interne nei loro progetti più grandi.

PS: Credo che questo approccio di compilazione progetti NPM moduli che possono essere utilizzati in altri progetti ricorda il .dll nel mondo .NET. Potrei benissimo immaginare i progetti organizzati in una soluzione in VS Code in cui ogni progetto produce un pacchetto npm che può quindi essere utilizzato in un altro progetto nella soluzione come dipendenza.

Poiché ho impiegato un bel po 'di tempo per capirlo, l'ho postato nel caso qualcuno fosse bloccato qui.

ho anche postato per un bug chiuso a: https://github.com/npm/npm/issues/11546


Questo esempio è stato caricato su Github: vchatterji/tsc-seed

+0

potresti caricare un esempio su github? Ciò aiuterebbe molto!:) –

+3

L'esempio è stato caricato su Github: https://github.com/vchatterji/tsc-seed –

+0

Come può essere utilizzato anche in progetti non dattiloscritti? – SuperUberDuper

3

Si dovrebbe pubblicare i sorgenti dattiloscritto originale invece della definizione del tipo. In package.json lasciare che la proprietà 'types' punti al file * .ts.

*.d.ts sono buoni per annotare le librerie JS esistenti, ma come consumatore preferisco leggere il codice del dattiloscritto che passare da definizioni di tipo a codice JS generato in modo discendente.

+0

+1 Questa dovrebbe essere la risposta accettata. Perché creare file .d.ts se riesci a puntare direttamente ai file .ts !? – Precastic

+1

Il compilatore TypeScript sembra non essere adatto per quello finora. Vedi questo problema https://github.com/Microsoft/TypeScript/issues/14479 –

+1

attualmente incluso '* .d.ts' è il modo consigliato per farlo, anche se sono d'accordo con voi i vantaggi di includere' * .ts' file, https: //www.typescriptlang.org/docs/handbook/declaration-files/publishing.html – Tim

5

seguo principalmente il suggerimento Varun Chatterji

Ma, vorrei mostrare un esempio completo di unit testing e la copertura del codice e la pubblicazione in npm e importandoli utilizzando javascript o typescript

Questo modulo è scritto usando typescript 2.2 ed è importante per configurare il gancio prepublish per compilare il codice utilizzando tsc prima di pubblicarlo NPM

https://github.com/sweetim/haversine-position

https://www.npmjs.com/package/haversine-position

+1

Questo è un esempio molto utile, grazie per la condivisione! Al momento sto anche cercando di capire come creare pacchetti in questo modo. –

+1

A partire da luglio 2017, questa è la migliore struttura di progetto che ho incontrato. Grazie a Tim e Varun Chatterji – adgang

43

modo consigliato nel 2017 con 2.x tipografico:

  • creare il progetto come lo faresti normalmente (con test e tutto)
  • Aggiungi declaration: true a tsconfig.json a generare tipizzazioni
  • Esportare l'API tramite index.ts
  • Nel numero package.json, puntare ai tipi digitati. Ad esempio se il tuo outDir è dist, quindi aggiungi "types": "dist/index.d.ts" al pacchetto json.
  • Creare un .npmignore per ignorare i file non necessari (ad esempio la fonte).
  • Pubblicare in npm con npm publish. Utilizzare le specifiche semver per gli aggiornamenti (patch/bug fix npm version patch, additivi non rottura npm version minor, rompendo api cambia npm version major)

Dal momento che mi ha fatto un po 'per vagliare tutte le risorse non aggiornati su questo argomento su internet (come quello in questa pagina ...) Ho deciso di concludere l'operazione in how-to-write-a-typescript-library con un esempio aggiornato minimo.

+0

Dovrò controllare il js nel controllo del codice sorgente? Oppure npm conserva la propria versione del codice? – Olian04

+0

@ Olian04 Si dice di creare un file '.npmignore' per dire a npm quali file ignorare durante la pubblicazione (i file' .ts') e un '.gitignore' per dire a git quali file ignorare (' dist/') – Purag