TypeScript'te NPM modülleri yazma


103

İlk NPM modülüm üzerinde çalışıyorum. Daha önce typcript ile kısaca çalıştım ve büyük bir problem, birçok modül için hiçbir tanım dosyası olmamasıydı. Bu yüzden modülümü daktilo ile yazmanın iyi bir fikir olacağını düşündüm.

Ancak, bunu yapmanın en iyi yolu hakkında herhangi bir bilgi bulamıyorum. Bu ilgili soruya "bulundu Ben CoffeeScript içinde npm paket yazabilir miyim? " İnsanlar sadece javascript dosyaları yayınlamaya düşündürmektedir. Ancak coffeescript dosyalarının aksine, typcript dosyaları bir typcript uygulamasında kullanılırsa gerçekten yararlı olabilir.

Bir NPM modülünü yayınlarken Typescript dosyalarını eklemeli miyim, yoksa sadece javascript dosyalarını yayınlamalı ve oluşturulan .d.ts dosyalarını DefinitelyTyped'e mi sağlamalıyım?


2
Faydalı Notlar: npm'ye yayınlamadan önce CJS ve ESM hedefleriyle birlikte tür tanımlarını yaymak için bir TS projesi oluşturmada size yol gösterecek bir blog yazısı ile birlikte projeyi, copee'yi yazdım. Bu, ileride node.js ve tarayıcılarla kullanımı en üst düzeye çıkaracaktır.
styfle

Yanıtlar:


84

TypeScript ile yazılmış örnek bir Düğüm modülü: https://github.com/basarat/ts-npm-module

İşte bu örnek modülü https://github.com/basarat/ts-npm-module-consume kullanan örnek bir TypeScript projesi

Temel olarak yapmanız gerekenler:

  • commonjsve ile derleyindeclaration:true
  • bir .d.tsdosya oluştur

Ve sonra

  • Fikrinizin üretilenleri okumasını sağlayın .d.ts.

Atom-TypeScript sadece bunun etrafında güzel bir iş akışı sağlar: https://github.com/TypeStrong/atom-typescript#packagejson-support


Atom-TypeScript bağlantı bağlantısının güncellenmesi gerekiyor (bağlantı artık geçerli değil).
Fidan Hakaj

@ basarat, ts-npm-modülünde "version": "1.5.0-alpha" kullanıyorsunuz. Sanırım bu, yazdığınız Typescript sürümü. Bunu dışarıda bırakmak önemli mi? (Atom eklentisi tarafından otomatik olarak yapılmaz). Bir sürüm kullanılıyorsa, bu diğer kullanıcıların aktarım için tam sürümü (veya yalnızca daha yenilerini) kullanmasını gerektirecek mi? (veya belki tsconfig.json sürümüdür?)
justin

Diğer kitaplıklara bağlı olarak modüller ile herhangi bir kullanım durumunuz var mı? Yinelenen tanım probleminden kaçınmak için yapılandırmanız gerekir tsconfig.json, ancak bu bence çok manuel görünüyor.
Sérgio Michels

1
2016'nın 4. çeyreğinde de bu yaklaşımı savunur musunuz?
SuperUberDuper

7
Bu güzel bir nasıl yapılırdı
chrismarx

78

TypeScript 3.x veya TypeScript 2.x ile aşağıdaki adımlar, TypeScript ile bir kitaplık (npm paketi) oluşturmak için ne yapmanız gerektiğini açıklar:

  • Projenizi normalde yaptığınız gibi oluşturun (testler ve her şeyle)
  • Ekle declaration: trueiçin tsconfig.jsontypings üretmek için.
  • API'yi bir index.ts
  • İçinde, package.jsonoluşturduğunuz yazıların üzerine gelin. Örneğin sizin isminiz outDirise dist, "types": "dist/index.d.ts"json paketinize ekleyin .
  • İçinde, package.jsonana giriş dosyanıza gidin. Örneğin sizin eğer outDiris distve ana giriş dosyası olduğunu index.js, daha sonra eklemek "main": "dist/index.js"için package.json için.
  • .npmignoreGereksiz dosyaları (örneğin, kaynak) yok saymak için bir oluşturun .
  • İle npm'ye yayınlayın npm publish. Güncellemeler için semver özelliklerini kullanın (yama / hata düzeltme npm version patch, kesintisiz eklemeler npm version minor, api değişikliklerini bozma npm version major)

İnternetteki bu konuyla ilgili tüm güncelliğini yitirmiş kaynakları (bu sayfadaki gibi ...) gözden geçirmeme biraz zaman verdiği için, bunu bir daktilo-yazma-kitaplığı ile tamamlamaya karar verdim. güncel çalışma minimum örneği.


Kaynak kontrolüne js'yi kontrol etmem gerekecek mi? Yoksa npm kodun kendi versiyonunu mu saklıyor?
Olian04

1
@ Olian04 .npmignorenpm'ye hangi dosyaların ( .tsdosyalar) yayınlanırken yok sayılacağını ve a'ya hangi dosyaların yok sayılacağını söylemek için bir dosya oluştur .gitignore( dist/)
Purag

@ Olian04 hayır, oluşturulan JS dosyalarını işlemenize gerek yoktur (ve IMO yapmamalıdır). Bunlar projenin kaynağının bir parçası değildir.
Josh M.

59

Bu, TypeScript 1.8.10 kullanan daha yeni bir cevaptır:

Proje yapım:

|
|--- 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

.npmignoreGereksiz dosyaları dahil etmemek ve paketin içe aktarılması ve çalışması için minimum düzeyde kalması için aşağıdakileri ekledim :

node_modules/
*.log
*.tgz

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

Benim .gitignorevar:

typings

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

Benim package.jsonvar:

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

Şimdi koşuyorum: npm pack

Ortaya çıkan dosya (sıkıştırılmış haldeyken) aşağıdaki yapıya sahiptir:

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

Şimdi bunu kütüphane olarak kullanmak istediğim projeye gidip şunu yazıyorum: npm install ./project-1.0.0.tgz

Başarıyla kurulur.

Şimdi index.tsprojemde npm'yi yeni kurduğum bir dosya oluşturuyorum import Project = require("project");

Yazmak Project.bana tüm bu alıştırmanın amacı olan Intellisense seçeneklerini veriyor.

Umarım bu, başka birinin TypeScript npm projelerini daha büyük projelerinde dahili kitaplıklar olarak kullanmasına yardımcı olur.

Not: Ben diğer projelerde kullanılabilecek npm modülleri projeleri derleme bu yaklaşım anımsatan olduğuna inanıyoruz .dlliçinde .NETdünyada. Projelerin VS Kodunda bir Çözümde organize edildiğini ve her projenin bir npm paketi ürettiği ve daha sonra çözümde bağımlılık olarak başka bir projede kullanılabileceğini hayal edebiliyorum.

Bunu çözmem epey bir zaman aldığından, birinin burada takılıp kalması ihtimaline karşı yazdım.

Ayrıca bunu kapalı bir hata için şu adreste yayınladım: https://github.com/npm/npm/issues/11546


Bu örnek Github'a yüklendi: vchatterji / tsc-seed


github'a bir örnek yükleyebilir misin? Bu çok yardımcı olur! :)
Han Che


Daktilo olmayan projelerde de nasıl kullanılabilir?
SuperUberDuper

5

Tür tanımı yerine orijinal typcript kaynaklarını yayınlamalısınız. In package.json* ts dosyaya 'türleri' mülkiyet noktasını edelim.

*.d.ts mevcut JS kitaplıklarına açıklama eklemek için iyidir, ancak bir tüketici olarak, tür tanımları ve alt düzey, oluşturulmuş JS kodu arasında geçiş yapmak yerine daktilo kodunu okumayı tercih ederim.


1
TypeScript derleyicisi şu ana kadar buna uygun görünmüyor. Bu soruna bakın github.com/Microsoft/TypeScript/issues/14479
Sven Efftinge

2
şu anda dahil *.d.tsetmek bunu yapmanın önerilen yoludur, ancak size *.tsdosyaları dahil etmenin faydalarını kabul ediyorum , typescriptlang.org/docs/handbook/declaration-files/…
Tim

5

Esas olarak Varun Chatterji'nin önerisini takip ediyorum

Ancak, birim testi ve kod kapsamı ile eksiksiz bir örnek göstermek npmve bunları javascriptveya kullanarak bunları yayınlamak ve içe aktarmak istiyorum.typescript

Bu modül kullanılarak yazılmıştır typescript 2.2ve prepublishkancayı tscnpm'ye yayınlamadan önce kodu derleyecek şekilde yapılandırmak önemlidir.

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

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


1
Bu çok faydalı bir örnek, paylaştığınız için teşekkürler! Şu anda bu şekilde paketler oluşturmaya da çalışıyorum.
Jeffrey Westerkamp

1
Temmuz 2017 itibarıyla karşılaştığım en iyi proje yapısı bu. Tim ve Varun Chatterji'ye teşekkürler
2017

3

Atom IDE desteği olmadan da npm'deki dosyaları dağıtmak ve kullanmak için autodts kullanabilirsiniz .d.ts.

autodts generate.d.tsnpm'de yayınlamak için tüm kendi dosyalarınızı bir araya toplar ve autodts linkdiğer kurulu paketlere referansları işler; bu, her zaman doğrudan node_modulesbirkaç alt pakete bölünmüş daha büyük bir projede bulunmayabilir .

Her iki komut da ayarlarını "yapılandırma üzerinde kural" stilinden package.jsonve tsconfig.jsoniçinde okur .

Orada başka cevap stackoverflow ve blog yazısı daha ayrıntılı bilgi içeren.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.