Pracuję nad moim pierwszym modułem NPM. Krótko pracowałem wcześniej z maszynopisem i dużym problemem było to, że dla wielu modułów nie było dostępnych plików definicji. Pomyślałem więc, że dobrym pomysłem byłoby napisanie mojego modułu na maszynie.
Jednak nie mogę znaleźć żadnych informacji na temat najlepszego sposobu, aby to zrobić. Znalazłem to pokrewne pytanie „ Czy mogę napisać pakiet npm w coffeescript? ”, Gdzie ludzie sugerują publikowanie tylko plików javascript. Ale w przeciwieństwie do plików coffeescript, pliki maszynopisu mogą być w rzeczywistości przydatne, jeśli są używane w aplikacji do pisania na maszynie.
Czy powinienem dołączyć pliki Typescript podczas publikowania modułu NPM, czy też powinienem publikować tylko pliki javascript i udostępniać wygenerowane pliki .d.ts do DefinitelyTyped?
źródło
Odpowiedzi:
Oto przykładowy moduł Node napisany w TypeScript: https://github.com/basarat/ts-npm-module
Oto przykładowy projekt TypeScript korzystający z tego przykładowego modułu https://github.com/basarat/ts-npm-module-consume
Zasadniczo musisz:
commonjs
ideclaration:true
.d.ts
plikI wtedy
.d.ts
.Atom-TypeScript zapewnia po prostu ładny przepływ pracy wokół tego: https://github.com/TypeStrong/atom-typescript#packagejson-support
źródło
tsconfig.json
, ale moim zdaniem wydaje się to zbyt ręczne.W przypadku języka TypeScript 3.x lub TypeScript 2.x poniższe kroki opisują, co należy zrobić, aby utworzyć bibliotekę (pakiet npm) z TypeScript:
declaration: true
do,tsconfig.json
aby wygenerować typy.index.ts
package.json
wskaż wygenerowane typy. Na przykład, jeślioutDir
takdist
, dodaj"types": "dist/index.d.ts"
do pakietu json.package.json
wskaż swój główny plik wejściowy. Na przykład, jeśli TwójoutDir
jest,dist
a główny plik wejściowy toindex.js
, dodaj"main": "dist/index.js"
do pliku package.json..npmignore
aby zignorować niepotrzebne pliki (np. Źródło).npm publish
. Użyj specyfikacji Semver do aktualizacji (poprawki / poprawki błędównpm version patch
, nierozerwalne dodatki, zepsutenpm version minor
zmiany APInpm version major
)Ponieważ zajęło mi trochę czasu, aby przejrzeć wszystkie przestarzałe zasoby na ten temat w Internecie (takie jak ten na tej stronie ...), postanowiłem zawrzeć to w bibliotece instrukcji pisania na maszynie aktualny działający minimalny przykład.
źródło
.npmignore
plik, aby powiedzieć npm, które pliki zignorować podczas publikowania (.ts
pliki) i.gitignore
powiedzieć gitowi, które pliki mają ignorować (dist/
)To jest nowsza odpowiedź przy użyciu TypeScript 1.8.10:
Struktura mojego projektu to:
Dodałem, co następuje,
.npmignore
aby uniknąć dołączania zbędnych plików i zachować minimum niezbędne do zaimportowania i działania pakietu:Mój
.gitignore
ma:Mój
package.json
ma:Teraz biegnę:
npm pack
Wynikowy plik (po rozpakowaniu) ma następującą strukturę:
Teraz przechodzę do projektu, w którym chcę użyć tego jako biblioteki i wpisuję:
npm install ./project-1.0.0.tgz
Pomyślnie instaluje się.
Teraz tworzę plik
index.ts
w moim projekcie, w którym właśnie zainstalowałem npmimport Project = require("project");
Wpisywanie
Project.
daje mi opcje Intellisense, które były celem tego całego ćwiczenia.Mam nadzieję, że pomoże to komuś innemu w używaniu projektów TypeScript npm jako bibliotek wewnętrznych w ich większych projektach.
PS: Uważam, że takie podejście kompilacji projektów do modułów npm, które można wykorzystać w innych projektach, przypomina te znane
.dll
na.NET
świecie. Mogę dobrze wyobrazić sobie projekty organizowane w rozwiązaniu w kodzie VS, w którym każdy projekt tworzy pakiet npm, który można następnie wykorzystać w innym projekcie w rozwiązaniu jako zależność.Ponieważ zajęło mi to sporo czasu, opublikowałem to na wypadek, gdyby ktoś tu utknął.
Opublikowałem go również w związku z zamkniętym błędem na: https://github.com/npm/npm/issues/11546
Ten przykład został przesłany do Github: vchatterji / tsc-seed
źródło
Zamiast definicji typu należy opublikować oryginalne źródła maszynopisu. W
package.json
pozwolić „typów” wskaż obiekt do pliku * .TS.*.d.ts
dobrze jest dodawać adnotacje do istniejących bibliotek JS, ale jako konsument wolę czytać kod maszynopisu niż przełączać się między definicjami typów i wygenerowanym kodem JS o niższym poziomie.źródło
*.d.ts
dołączanie jest zalecanym sposobem, ale zgadzam się z Tobą korzyści płynące z dołączania*.ts
plików, typescriptlang.org/docs/handbook/declaration-files/…Kieruję się głównie sugestią Varuna Chatterjiego
Chciałbym jednak pokazać kompletny przykład z testowaniem jednostkowym i pokryciem kodu oraz publikowaniem go
npm
i importowaniem przy użyciujavascript
lubtypescript
Ten moduł jest napisany przy użyciu
typescript 2.2
i ważne jest, aby skonfigurować punktprepublish
zaczepienia do kompilowania kodu przy użyciutsc
przed opublikowaniem go w npmhttps://github.com/sweetim/haversine-position
https://www.npmjs.com/package/haversine-position
źródło
Możesz użyć autodts do obsługi dystrybucji i używania
.d.ts
plików z npm również bez wsparcia ze strony Atom IDE.autodts generate
spakuje wszystkie twoje własne.d.ts
pliki razem do opublikowania na npm iautodts link
obsługuje odniesienia do innych zainstalowanych pakietów, które nie zawsze mogą znajdować się bezpośrednio podnode_modules
w większym projekcie podzielonym na kilka podpakietów.Oba polecenia odczytu z ich ustawienia
package.json
oraztsconfig.json
w „Convention Over Configuration” stylu.Jest jeszcze jedna odpowiedź na temat stackoverflow i post na blogu zawierający więcej szczegółów.
źródło
W Lossless stworzyliśmy kompleksowe narzędzie programistyczne TypeScript dla pakietów npm: https://gitzone.gitlab.io/npmts/
źródło