javascript - Scrierea modulelor npm în TypeScript
Lucrez la primul meu modul npm. Am lucrat puțin cu TypeScript înainte și o mare problemă era că pentru multe module nu existau fișiere de definire disponibile. Așa că m-am gândit că ar fi o idee bună să scriu modulul meu în TypeScript.
Totuși, nu pot găsi nicio informație despre cea mai bună modalitate de a face asta. Am găsit această întrebare legată „Pot să scriu un pachet npm în CoffeeScript?” unde oamenii sugerează să publici doar fișierele JavaScript. Dar, spre deosebire de fișierele CoffeeScript, fișierele TypeScript ar putea fi de fapt utile dacă sunt folosite într-o aplicație TypeScript.
Ar trebui să includ fișierele TypeScript atunci când public un modul npm, sau ar trebui să public doar fișierele JavaScript și să furnizez fișierele generate .d.ts către DefinitelyTyped?
Răspuns #1
Faceți următoarele pentru a crea un pachet npm folosind orice versiune de TypeScript de la 2.x -> 5.x:
- Creează-ți proiectul așa cum ai face de obicei (cu teste și tot)
- Adaugă
declaration: trueîntsconfig.jsonpentru a genera tipuri. - Exportă API-ul printr-un
index.ts - În
package.json, indică tipurile tale generate. De exemplu, dacăoutDirestedist, atunci adaugă"types": "dist/index.d.ts"în package.json-ul tău. - În
package.json, indică fișierul tău principal de intrare. De exemplu, dacăoutDirestedistși fișierul principal de intrare esteindex.js, atunci adaugă"main": "dist/index.js"în package.json. - În
package.json, includeți pe lista albă fișierele pe care doriți să le trimiteți către npm:files: ["/dist"]. O abordare alternativă este blocarea pe listă neagră folosind.npmignore, dar este mai greu de menținut actualizat. - Publică pe npm cu
npm publish. Folosește specificațiile semver pentru actualizări (patch/corecție de bugnpm version patch, adăugiri care nu rup compatibilitateanpm version minor, modificări majore de APInpm version major)
Deoarece mi-a luat ceva timp să trec prin toate resursele învechite despre acest subiect de pe internet (cum este cea de pe această pagină...) am decis să rezum totul într-un ghid despre cum să scrii o bibliotecă TypeScript cu un exemplu minimal funcțional și actualizat.
Răspunsul #2
Iată un modul Node scris în TypeScript: https://github.com/basarat/ts-npm-module
Iată un proiect TypeScript de exemplu care folosește acest modul de exemplu https://github.com/basarat/ts-npm-module-consume
Practic, trebuie să:
- compilați cu
commonjsșideclaration:true - generează un fișier
.d.ts
Și atunci
- Fă ca IDE-ul tău să citească fișierul generat
.d.ts.
Atom-TypeScript oferă doar un flux de lucru plăcut în jurul acestuia: https://github.com/TypeStrong/atom-typescript#packagejson-support
Răspunsul #3
Aceasta este o răspuns mai recent folosind TypeScript 1.8.10:
Structura proiectului meu este:
|
|--- 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
Am adăugat următoarele în .npmignore pentru a evita includerea fișierelor inutile și pentru a păstra strictul necesar pentru ca pachetul să fie importat și să funcționeze:
node_modules/
*.log
*.tgz
src/
test/
gulpfile.js
tsconfig.json
tslint.json
typings.json
typings
dist/test
Fișierul meu .gitignore conține:
typings
ignore .js.map files
*.js.map
*.js
dist
Fișierul meu package.json conține:
"main": "dist/src/index.js",
"typings": "dist/src/index.d.ts",
Acum rulez: npm pack
Fișierul rezultat (când este dezarhivat) are următoarea structură:
|
|--- dist
| |--- src
| |
| index.js
| index.js.map
| index.d.ts
|
package.json
README.md
Acum merg la proiectul unde vreau să folosesc asta ca bibliotecă și scriu: npm install ./project-1.0.0.tgz
Se instalează cu succes.
Acum creez un fișier index.ts în proiectul meu unde tocmai am instalat npm import Project=require("project");
Tastând Project. îmi oferă opțiunile Intellisense, care a fost scopul întregului acestui exercițiu.
Sper că acest lucru îi ajută pe altcineva să folosească proiectele lor TypeScript npm ca biblioteci interne în proiectele lor mai mari.
PS: Cred că această abordare de a compila proiecte în module npm care pot fi utilizate în alte proiecte amintește de .dll în lumea .NET. Îmi pot imagina cu ușurință ca proiectele să fie organizate într-o Soluție în VS Code unde fiecare proiect produce un pachet npm care poate fi apoi utilizat într-un alt proiect din soluție ca o dependență.
Deoarece mi-a luat destul de mult timp să îmi dau seama de asta, am postat acest lucru în caz că cineva se blochează aici.
De asemenea, l-am postat pentru un bug închis la: https://github.com/npm/npm/issues/11546
Acest exemplu a fost încărcat pe Github: vchatterji/tsc-seed
