TypescriptでのNPMモジュールの作成


103

最初のNPMモジュールに取り組んでいます。以前は簡単にtypescriptを使っていましたが、大きな問題は、多くのモジュールで利用可能な定義ファイルがないことでした。それで、typescriptでモジュールを書くのは良い考えだと思いました。

しかし、私はそれを行うための最良の方法に関する情報を見つけることができません。この関連する質問「npmパッケージをcoffeescriptで作成できますか?」が見つかりましたが、人々はjavascriptファイルの公開のみを提案しています。しかし、coffeescriptファイルとは対照的に、typescriptアプリケーションは、typescriptアプリケーション内で使用される場合に実際に役立つ可能性があります。

NPMモジュールを公開するときにTypescriptファイルを含める必要がありますか、それともJavaScriptファイルのみを公開して、生成された.d.tsファイルをDefinitelyTypedに提供する必要がありますか?


2
役立つメモ:npmに公開する前に、CJSおよびESMターゲットと一緒に型定義を出力するTSプロジェクトの設定を順を追って説明するブログ投稿とともに、プロジェクトcopeeを作成しました。これにより、node.jsとブラウザーの使用が最大化されます。
スタイフル

回答:


84

TypeScriptで記述されたNodeモジュールのサンプルを次に示します。https//github.com/basarat/ts-npm-module

これは、このサンプルモジュールを使用するサンプルTypeScriptプロジェクトですhttps://github.com/basarat/ts-npm-module-consume

基本的にあなたはする必要があります:

  • commonjsおよびでコンパイルdeclaration:true
  • .d.tsファイルを生成する

その後

  • あなたのIDEに生成され.d.tsたを読んでもらいます。

Atom-TypeScriptは、これに関する優れたワークフローを提供するだけです。https//github.com/TypeStrong/atom-typescript#packagejson-support


Atom-TypeScriptアンカーリンクを更新する必要があります(アンカーは無効になりました)。
Fidan Hakaj 2016

@ basarat、ts-npm-moduleで「version」を使用しています:「1.5.0-alpha」。これはあなたがトランスパイルしているTypescriptのバージョンだと思います。これを省略することは重要ですか?(これはAtomプラグインによって自動的には行われません)。バージョンが使用されている場合、他のユーザーが正確なバージョンを使用してトランスパイルする必要がありますか(または新しいバージョンのみ)?(または多分それはtsconfig.jsonのバージョンですか?)
ジャスティン・

他のライブラリに依存するモジュールの使用例はありますか?重複した定義の問題を回避するには、を構成する必要がありますtsconfig.jsonが、これは手作業のように思われます。
セルジオミヒェルス

1
2016年第4四半期でもこのアプローチを推奨しますか?
SuperUberDuper 16

7
これは素晴らしいハウツーでした-tsmean.com/articles/how-to-write-a-typescript-library
chrismarx

78

TypeScript 3.xまたはTypeScript 2.xでは、次の手順でTypeScriptを使用してライブラリ(npmパッケージ)を作成するために必要な手順を説明します。

  • 通常どおりにプロジェクトを作成します(テストとすべてを使用)
  • 追加declaration: trueしますtsconfig.jsonてタイピングを生成します。
  • APIを index.ts
  • package.json、生成されたタイプをポイントします。たとえば、あなたの場合outDir、ISはdist、その後、追加します"types": "dist/index.d.ts"パッケージのJSONに。
  • package.json、メインエントリファイルをポイントします。たとえば、あなたoutDirがでdistあり、メインエントリファイルがindex.jsである場合、"main": "dist/index.js"あなたのpackage.jsonに。
  • を作成する .npmignore不要なファイル(ソースなど)を無視するを。
  • でnpmに公開しnpm publishます。更新にサーバー仕様を使用する(パッチ/バグ修正npm version patch、非破壊的な追加npm version minor、破壊的なAPI変更npm version major

インターネット上のこのトピックに関するすべての古いリソースをふるいにかけるようになったので(このページのように...)、how-to-write-a-typescript-libraryにまとめて、最新の動作する最小限の例。


ソース管理にjsをチェックインする必要がありますか?または、npmは独自のバージョンのコードを保持しますか?
Olian04

1
@ Olian04パブリッシュ.npmignore時に無視するファイル(.tsファイル)をnpmに通知するようにファイルを作成し、無視するファイルを.gitignoregitに通知する(dist/
Purag

@ Olian04いいえ、生成されたJSファイルをコミットする必要はありません(IMOがコミットしてはなりません)。それらはプロジェクトのソースの一部ではありません。
Josh M.

59

これは、TypeScript 1.8.10を使用したより最近の回答です。

私のプロジェクト構造は:

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

.npmignore無関係なファイルが含まれるのを避け、パッケージをインポートして機能させるために最低限の状態を保つために、以下を追加しました。

node_modules/
*.log
*.tgz

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

.gitignoreは持っています:

typings

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

package.jsonは持っています:

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

今私は実行します: npm pack

結果のファイル(解凍した場合)の構造は次のとおりです。

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

これをライブラリとして使用するプロジェクトに移動して、次のように入力します。 npm install ./project-1.0.0.tgz

正常にインストールされます。

次にindex.ts、npmをインストールしたプロジェクトに ファイルを作成します import Project = require("project");

タイピングProject.により、この演習全体のポイントとなったIntellisenseオプションが得られます。

これが他の誰かがTypeScript npmプロジェクトを大きなプロジェクトの内部ライブラリとして使用するのに役立つことを願っています。

PS:他のプロジェクトで使用できるnpmモジュールにプロジェクトをコンパイルするこのアプローチは.dll.NET世界を彷彿とさせると思います。各プロジェクトがnpmパッケージを生成し、ソリューションの別のプロジェクトで依存関係として使用できるVSコードのソリューションでプロジェクトが編成されていることはよく想像できます。

私がこれを理解するのにかなりの時間がかかったので、誰かがここで動けなくなった場合のために私はそれを投稿しました。

また、クローズしたバグについては、https//github.com/npm/npm/issues/11546に投稿しました


この例はGithubにアップロードされています:vchatterji / tsc-seed


例をgithubにアップロードできますか?それは大いに役立つでしょう!:)
ハンチェ

3
例がGithubにアップロードされました:github.com/vchatterji/tsc-seed
Varun Chatterji

タイプスクリプト以外のプロジェクトでもどのように使用できますか?
SuperUberDuper 2016

5

タイプ定義ではなく、元のタイプスクリプトソースを公開する必要があります。中package.json* .TSファイルに「種類」プロパティのポイントを聞かせて。

*.d.ts 既存のJSライブラリに注釈を付けるのに適していますが、コンシューマーとしては、タイプ定義と下位レベルの生成されたJSコードを切り替えるのではなく、typescriptコードを読みます。


1
TypeScriptコンパイラーは、これまでのところそれに適していないようです。この問題を参照してくださいgithub.com/Microsoft/TypeScript/issues/14479
Sven Efftinge 2017年

2
現在含める*.d.tsことをお勧めし*.tsますが、typescriptlang.org / docs / handbook / declaration
Tim

5

私は主にVarun Chatterjiの提案に従います

しかし、私はユニットテストとコードカバレッジと完全な例を示したいとにそれを公開npmして使用してそれらをインポートしますjavascriptか、typescript

このモジュールはを使用typescript 2.2して記述されておりprepublish、コードをコンパイルしてフックを構成することが重要ですtsc、npmに公開する前に

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

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


1
これは非常に役立つ例です。共有していただきありがとうございます。私も現在、この方法でパッケージを作成するコツをつかもうとしています。
Jeffrey Westerkamp 2017

1
2017年7月現在、これは私が遭遇した中で最高のプロジェクト構造です。TimとVarun Chatterjiのおかげで
adgang 2017

3

autodtsを使用して、配布と使用を処理できます。.d.tsして、Atom IDEのサポートなしでも、npmからのファイルの。

autodts generate.d.tsnpmで公開するためにすべての独自のファイルをバンドルし、autodts link他のインストール済みパッケージへの参照を処理します。これは、node_modulesいくつかのサブパッケージに分割されたより大きなプロジェクトの直下に常にあるとは限りません。

どちらのコマンドも、「設定よりpackage.jsontsconfig.json規約」スタイルで設定を読み取ります。

あります別の答え stackoverflowの上やブログの記事詳細とは。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.