TypeScriptプロジェクト
TypeScriptプロジェクトジェネレータは、ECMAScript Modules(ESM)、TypeScriptのプロジェクト参照、テスト実行用のVitest、静的解析用のESLintなど、ベストプラクティスで構成されたモダンなTypeScriptライブラリやアプリケーションを作成するために使用できます。
使用方法
TypeScriptプロジェクトの生成
新しいTypeScriptプロジェクトを2つの方法で生成できます:
- インストール Nx Console VSCode Plugin まだインストールしていない場合
- VSCodeでNxコンソールを開く
- クリック
Generate (UI)
"Common Nx Commands"セクションで - 検索
@aws/nx-plugin - ts#project
- 必須パラメータを入力
- クリック
Generate
pnpm nx g @aws/nx-plugin:ts#project
yarn nx g @aws/nx-plugin:ts#project
npx nx g @aws/nx-plugin:ts#project
bunx nx g @aws/nx-plugin:ts#project
オプション
パラメータ | 型 | デフォルト | 説明 |
---|---|---|---|
name 必須 | string | - | Library name. |
directory | string | packages | Parent directory where the library is placed. |
subDirectory | string | - | The sub directory the lib is placed in. By default this is the library name. |
ジェネレータの出力
ジェネレータは<directory>/<name>
ディレクトリに以下のプロジェクト構造を作成します:
Directorysrc TypeScriptのソースコード
- index.ts
- project.json プロジェクト設定とビルドターゲット
- tsconfig.json このプロジェクト用の基本TypeScript設定(ワークスペースルートのtsconfig.base.jsonを継承)
- tsconfig.lib.json ライブラリ用TypeScript設定(ランタイムまたはパッケージ化されたソース)
- tsconfig.spec.json テスト用TypeScript設定
- vite.config.ts Vitestの設定
- eslint.config.mjs ESLintの設定
ワークスペースルートの以下のファイルにも変更が加えられます:
- nx.json Nx設定が更新され、プロジェクトに@nx/js/typescriptプラグインが構成されます
- tsconfig.base.json ワークスペース内の他のプロジェクトからインポート可能にするため、プロジェクトのTypeScriptエイリアスが設定されます
- tsconfig.json プロジェクトのTypeScriptプロジェクト参照が追加されます
TypeScriptソースコードの記述
TypeScriptコードはsrc
ディレクトリに追加します。
ESMインポート構文
TypeScriptプロジェクトはESモジュールであるため、インポート文ではファイル拡張子を明示的に指定する必要があります:
import { sayHello } from './hello.js';
他のTypeScriptプロジェクト向けのエクスポート
TypeScriptプロジェクトのエントリポイントはsrc/index.ts
です。他のプロジェクトからインポート可能にする要素はここでエクスポートできます:
export { sayHello } from './hello.js';export * from './algorithms/index.js';
他のプロジェクトでのライブラリコードのインポート
ワークスペースのtsconfig.base.json
で設定されたTypeScriptエイリアスにより、他のTypeScriptプロジェクトからプロジェクトを参照できます:
import { sayHello } from ':my-scope/my-library';
ワークスペースで新しいプロジェクトのインポート文を初めて追加する際、以下のようなエラーがIDEに表示される場合があります:
インポートエラー
File '/path/to/my/workspace/packages/my-library/src/index.ts' is not under 'rootDir' '/path/to/my/workspace/packages/my-consumer'. 'rootDir' is expected to contain all source files. File is ECMAScript module because '/path/to/my/workspace/package.json' has field "type" with value "module" ts(6059)File '/path/to/my/workspace/packages/my-library/src/index.ts' is not listed within the file list of project '/path/to/my/workspace/packages/my-consumer/tsconfig.lib.json'. Projects must list all files or use an 'include' pattern. File is ECMAScript module because '/path/to/my/workspace/package.json' has field "type" with value "module" ts(6307)
これはプロジェクト参照が設定されていないためです。
Nx TypeScript Syncジェネレータがデフォルトで構成されているため、手動での設定は不要です。以下のコマンドを実行すると必要な構成が追加されます:
pnpm nx sync
yarn nx sync
npx nx sync
bunx nx sync
これによりIDEのエラーが解消され、ライブラリを使用できるようになります。
依存関係
TypeScriptプロジェクトにpackage.json
ファイルが存在しないことに気付くかもしれません。これは従来のTypeScriptモノレポとは異なる点です。
モノレポ内のTypeScriptパッケージに依存関係を追加するには、ワークスペースルートのpackage.json
に依存関係を追加します。パッケージマネージャのコマンドラインから追加できます:
pnpm add -w some-npm-package
yarn add some-npm-package
npm install --legacy-peer-deps some-npm-package
bun install some-npm-package
これにより、ワークスペース内のすべてのTypeScriptプロジェクトで依存関係が利用可能になります。
ランタイムコード
TypeScriptプロジェクトをランタイムコード(例:AWS Lambda関数のハンドラ)として使用する場合、esbuild
のようなツールを使用してプロジェクトをバンドルすることを推奨します。これによりツリーシェイキングが行われ、実際に参照されている依存関係のみが含まれます。
project.json
ファイルに以下のようなターゲットを追加できます:
{ ... "targets": { ... "bundle": { "cache": true, "executor": "nx:run-commands", "outputs": ["{workspaceRoot}/dist/packages/my-library/bundle"], "options": { "command": "esbuild packages/my-library/src/index.ts --bundle --outfile=dist/packages/my-library/bundle/index.js --platform=node --format=cjs" } }, },}
NPMへの公開
TypeScriptプロジェクトをNPMに公開する場合、package.json
ファイルを作成する必要があります。
このファイルにはプロジェクトが参照する依存関係を宣言する必要があります。ビルド時にはワークスペースルートのpackage.json
経由で依存関係が解決されるため、Nx Dependency Checks ESLint Pluginを設定し、公開するプロジェクトのpackage.json
にすべての依存関係が含まれるようにすることを推奨します。
ビルド
TypeScriptプロジェクトにはbuild
ターゲット(project.json
で定義)が設定されており、以下のコマンドで実行できます:
pnpm nx run <project-name>:build
yarn nx run <project-name>:build
npx nx run <project-name>:build
bunx nx run <project-name>:build
<project-name>
はプロジェクトの完全修飾名です。
build
ターゲットはプロジェクトのコンパイル、リント、テストを実行します。
ビルド出力はワークスペースルートのdist
フォルダ内(例:dist/packages/<my-library>/tsc
)に生成されます。
テスト
Vitestがプロジェクトのテスト用に設定されています。
テストの記述
テストは.spec.ts
または.test.ts
ファイルに記述し、プロジェクトのsrc
フォルダに配置します。
例:
Directorysrc
- hello.ts ライブラリソースコード
- hello.spec.ts hello.tsのテスト
Vitestはdescribe
、it
、test
、expect
などのJest風の構文を提供します。
import { sayHello } from './hello.js';
describe('sayHello', () => {
it('should greet the caller', () => { expect(sayHello('Darth Vader')).toBe('Hello, Darth Vader!'); });
});
テストの記述方法やモックの作成など詳細はVitestドキュメントを参照してください。
テストの実行
テストはプロジェクトのbuild
ターゲットの一部として実行されますが、test
ターゲットを個別に実行することもできます:
pnpm nx run <project-name>:test
yarn nx run <project-name>:test
npx nx run <project-name>:test
bunx nx run <project-name>:test
-t
フラグを使用して特定のテストを実行できます:
pnpm nx run <project-name>:test -t 'sayHello'
yarn nx run <project-name>:test -t 'sayHello'
npx nx run <project-name>:test -t 'sayHello'
bunx nx run <project-name>:test -t 'sayHello'
リンティング
TypeScriptプロジェクトではリンティングにESLint、フォーマットにPrettierを使用します。
ワークスペースルートのeslint.config.mjs
ファイルでESLintを構成することを推奨します。これにより変更がすべてのTypeScriptプロジェクトに適用され、一貫性が保たれます。
同様に、Prettierはルートの.prettierrc
ファイルで構成できます。
リンターの実行
プロジェクトのリンティングチェックを行うにはlint
ターゲットを実行します:
pnpm nx run <project-name>:lint
yarn nx run <project-name>:lint
npx nx run <project-name>:lint
bunx nx run <project-name>:lint
リント問題の修正
ほとんどのリンティングやフォーマットの問題は自動修正可能です。--configuration=fix
引数を付けてESLintを実行します:
pnpm nx run <project-name>:lint --configuration=fix
yarn nx run <project-name>:lint --configuration=fix
npx nx run <project-name>:lint --configuration=fix
bunx nx run <project-name>:lint --configuration=fix
ワークスペース内の全パッケージのリント問題を修正するには:
pnpm nx run-many --target lint --all --configuration=fix
yarn nx run-many --target lint --all --configuration=fix
npx nx run-many --target lint --all --configuration=fix
bunx nx run-many --target lint --all --configuration=fix