ts-demo-npm-cjs
.gitignore
.npmignore
package.json
dependencies
とdevDependencies
package.json
に関する詳細情報tsconfig.json
index.ts
index_test.ts
この章では、パッケージマネージャnpm用のCommonJSモジュール形式に基づいたパッケージを作成するためにどのようにTypeScriptを使用するかについて説明します。
GitHubリポジトリ:
ts-demo-npm-cjs
この章では、リポジトリを探索します。ts-demo-npm-cjs
GitHubからダウンロードできます。(意図的にパッケージとしてnpmに公開していません)
以下に精通している必要があります。
CommonJSモジュール - サーバサイドJavaScriptで生まれたモジュール形式で、もともとサーバサイドJavaScript用に設計されました。サーバーサイドJavaScriptプラットフォームNode.jsによって普及しました。CommonJSモジュールはJavaScriptの組み込みECMAScriptモジュールに先立ち、現在も広く使用されており、ツール(IDE、ビルドツールなど)によって十分にサポートされています。
TypeScriptのモジュール - その構文はECMAScriptモジュールに基づいています。ただし、それらは多くの場合、CommonJSモジュールにコンパイルされます。
npmパッケージ - npmパッケージマネージャを通じてインストールされるファイルを含むディレクトリ。これらには、CommonJSモジュール、ECMAScriptモジュール、およびその他のさまざまなファイルを含めることができます。
この章では、TypeScriptが現在最もよくサポートしているものを使用しています。
.js
でCommonJSモジュールにコンパイルされます。特にNode.js上で、TypeScriptは現在ECMAScriptモジュールと.js
以外のファイル名拡張子を実際にサポートしていません。
ts-demo-npm-cjs
リポジトリの構成方法は次のとおりです。ts-demo-npm-cjs
ts-demo-npm-cjs/
.gitignore
.npmignore
dist/ (created on demand)
package.json
ts/
src/
index.ts
test/
index_test.ts
tsconfig.json
パッケージ用のpackage.json
に加えて、リポジトリには次が含まれます。
ts/src/index.ts
: パッケージの実際のコードts/test/index_test.ts
: index.ts
のテストtsconfig.json
: TypeScriptコンパイラの設定データpackage.json
にはコンパイル用のスクリプトが含まれています。
ts/
(TypeScript コード)dist/
(CommonJSモジュール。ディレクトリはまだリポジトリに存在しません)ここに、2つのTypeScriptファイルのコンパイル結果が配置されます。
ts/src/index.ts --> dist/src/index.js
ts/test/index_test.ts --> dist/test/index_test.js
.gitignore
このファイルには、git にコミットしたくないディレクトリが記載されています
node_modules/
dist/
説明
node_modules/
は、npm install
で設定されています。dist/
内のファイルは、TypeScript コンパイラによって作成されます(これについては後ほど詳しく説明します)。.npmignore
どのファイルを npm レジストリにアップロードして、どのファイルをアップロードしないかについては、git とは異なるニーズがあります。そのため、.gitignore
の他に、ファイル .npmignore
も必要です
ts/
2 つの相違点は、次のとおりです。
dist/
ディレクトリ)をアップロードする必要があります。ts/
ディレクトリ)をアップロードしたくありません。npm はデフォルトで node_modules/
ディレクトリを無視することに注意してください。
package.json
package.json
は次のようになります
{
···
"type": "commonjs",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"scripts": {
"clean": "shx rm -rf dist/*",
"build": "tsc",
"watch": "tsc --watch",
"test": "mocha --ui qunit",
"testall": "mocha --ui qunit dist/test",
"prepack": "npm run clean && npm run build"
},
"// devDependencies": {
"@types/node": "Needed for unit test assertions (assert.equal() etc.)",
"shx": "Needed for development-time package.json scripts"
},
"devDependencies": {
"@types/lodash": "···",
"@types/mocha": "···",
"@types/node": "···",
"mocha": "···",
"shx": "···"
},
"dependencies": {
"lodash": "···"
}
}
プロパティを見てみましょう。
type
: 値 "commonjs"
は、.js
ファイルが CommonJS モジュールとして解釈されることを意味します。main
: 現在のパッケージの名前のみを指定した、いわゆる ベアイモポート がある場合、これがインポートされるモジュールです。types
は、現在のパッケージのすべてのタイプ定義を含む宣言ファイルを示します。次の 2 つのサブセクションでは、残りのプロパティについて説明します。
プロパティ scripts
は、npm run
で呼び出せるさまざまなコマンドを定義します。たとえば、スクリプト clean
は npm run clean
で呼び出されます。前の package.json
には、次のスクリプトが含まれています
clean
は、クロスプラットフォームパッケージ shx
を使用して、Unix シェルコマンド rm
の実装によってコンパイル結果を削除します。shx
は、使用したいコマンドごとに別のパッケージを必要としないという利点を持つさまざまなシェルコマンドをサポートします。
build
と watch
は、TypeScript コンパイラ tsc
を使用して、tsconfig.json
に従って TypeScript ファイルをコンパイルします。tsc
は、通常 npm パッケージ typescript
によって、グローバルにまたはローカルに(現在のパッケージ内)にインストールする必要があります。
test
と testall
は、ユニットテストフレームワーク Mocha を使用して、1 つのテストまたはすべてのテストを実行します。
prepack
: このスクリプトは tarball がパックされる前に実行されます(npm pack
、npm publish
、または git からのインストールが原因)。
IDE を使用している場合、IDE でアーティファクトを構築できるため、build
と watch
のスクリプトは必要ありません。ただし、prepack
のスクリプトには必要です。
dependencies
と devDependencies
dependencies
に含める必要があるのは、パッケージをインポートするときに必要なパッケージのみです。それには、テストを実行するために使用されるパッケージなどは含まれません。
@types/
で始まる名前のパッケージは、タイプ定義を持たないパッケージに TypeScript タイプ定義を提供します。前者がないと後者を使用できません。これらは通常の依存関係ですか、それとも開発依存関係ですか。それは状況によって異なります
パッケージのタイプ定義が、別のパッケージのタイプ定義を参照する場合、そのパッケージは通常の依存関係です。
それ以外の場合は、パッケージは開発時にのみ必要であり、開発依存関係です。
package.json
に関する詳細情報package.json
に関するドキュメント には、そのファイルのさまざまなプロパティの説明が記載されています。script
は、package.json
プロパティ scripts
を説明しています。tsconfig.json
{
"compilerOptions": {
"rootDir": "ts",
"outDir": "dist",
"target": "es2019",
"lib": [
"es2019"
],
"module": "commonjs",
"esModuleInterop": true,
"strict": true,
"declaration": true,
"sourceMap": true
}
}
rootDir
: TypeScript ファイルの保存場所は?
outDir
: コンパイル結果はどこに置くべきですか?
target
: ターゲットの ECMAScript バージョンは何ですか? TypeScript コードがターゲットバージョンではサポートされない機能を使用している場合、それはサポートされる機能だけを使用する同等のコードにコンパイルされます。
lib
: TypeScript はどのプラットフォーム機能を認識すべきですか? 選択肢には ECMAScript 標準ライブラリとブラウザの DOM があります。Node.js API はパッケージ @types/node
を介して異なる形でサポートされています。
module
: コンパイル出力のフォーマットを指定します。
残りのオプションは tsconfig.json
の公式ドキュメント で説明されています。
このファイルはパッケージの実際的な動作を提供します
import endsWith from 'lodash/endsWith';
function removeSuffix(str: string, suffix: string) {
export if (!endsWith(str, suffix)) {
new Error(JSON.stringify(suffix)} + ' is not a suffix of ' +
throw JSON.stringify(str));
}.slice(0, -suffix.length);
return str }
ライブラリ Lodash の 関数 endsWith()
を使用 しています。それゆえ Lodash は通常の依存関係です。ランタイムに必要です。
このファイルには index.ts
の単体テストが含まれています
import { strict as assert } from 'assert';
import { removeSuffix } from '../src/index';
test('removeSuffix()', () => {
.equal(
assertremoveSuffix('myfile.txt', '.txt'),
'myfile');
.throws(() => removeSuffix('myfile.txt', 'abc'));
assert; })
テストは以下の方法で実行できます
npm t dist/test/index_test.js
t
は npm コマンド test
の略語です。test
は run test
の略語です (package.json
からスクリプト test
を実行します)。ご覧のとおり、TypeScript コードではなくテストのコンパイル済みバージョン (ディレクトリ dist/
内) を実行しています。
単体テストフレームワーク Mocha についてさらに詳しい情報は、ホームページ を参照してください。