Skip to content

TypeScriptプロジェクト

TypeScriptプロジェクトジェネレータは、ECMAScript Modules (ESM)、TypeScriptのプロジェクト参照、テスト実行用のVitest、リンティングとフォーマット用のBiomeなど、ベストプラクティスで構成されたモダンなTypeScriptライブラリまたはアプリケーションを作成するために使用できます。

新しいTypeScriptプロジェクトを2つの方法で生成できます:

  1. インストール Nx Console VSCode Plugin まだインストールしていない場合
  2. VSCodeでNxコンソールを開く
  3. クリック Generate (UI) "Common Nx Commands"セクションで
  4. 検索 @aws/nx-plugin - ts#project
  5. 必須パラメータを入力
    • クリック Generate
    パラメータデフォルト説明
    name 必須string-TypeScriptプロジェクト名
    directory stringpackagesライブラリが配置される親ディレクトリ
    subDirectory string-ライブラリが配置されるサブディレクトリ。デフォルトではライブラリ名になります。
    preferInstallDependencies booleantrueジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。

    ジェネレータは<directory>/<name>ディレクトリに以下のプロジェクト構造を作成します:

    • Directorysrc TypeScriptソースコード
      • index.ts
    • package.json プロジェクトのパッケージ名と依存関係を定義するプロジェクトマニフェスト
    • project.json プロジェクト設定とビルドターゲット
    • tsconfig.json このプロジェクトの基本TypeScript設定(ワークスペースルートのtsconfig.base.jsonを継承)
    • tsconfig.lib.json ライブラリ用TypeScript設定(ランタイムまたはパッケージ化ソース用)
    • tsconfig.spec.json テスト用TypeScript設定
    • vitest.config.mts Vitestの設定

    ワークスペースルートの以下のファイルにも変更が加えられます:

    • nx.json Nx設定が更新され、@nx/js/typescriptプラグインがプロジェクト用に構成されます
    • tsconfig.base.json ワークスペース内の他のプロジェクトからインポート可能にするためのTypeScriptエイリアスが設定されます
    • tsconfig.json プロジェクト参照が追加されます

    TypeScriptコードはsrcディレクトリに追加します。

    TypeScriptプロジェクトはESモジュールであるため、インポート文ではファイル拡張子を明示的に指定する必要があります:

    index.ts
    import { sayHello } from './hello.js';

    他のTypeScriptプロジェクト向けのエクスポート

    Section titled “他のTypeScriptプロジェクト向けのエクスポート”

    TypeScriptプロジェクトのエントリポイントはsrc/index.tsです。他のプロジェクトからインポート可能にする要素はここでエクスポートできます:

    src/index.ts
    export { sayHello } from './hello.js';
    export * from './algorithms/index.js';

    他のプロジェクトでのライブラリコードのインポート

    Section titled “他のプロジェクトでのライブラリコードのインポート”

    ワークスペースのtsconfig.base.jsonで設定されたTypeScriptエイリアスを使用して、他のTypeScriptプロジェクトからプロジェクトを参照できます:

    packages/my-other-project/src/index.ts
    import { sayHello } from '@my-scope/my-library';

    ワークスペース内の新しいプロジェクトを初めてインポートする場合、以下のようなエラーがIDEに表示される可能性があります:

    インポートエラー
    Terminal window
    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)

    これはプロジェクト参照が設定されておらず、インポートされたプロジェクトがまだプロジェクトのpackage.jsonにワークスペース依存関係として宣言されていないためです。

    ワークスペースは両方を管理する同期ジェネレータで構成されているため、手動で設定する必要はありません。以下のコマンドを実行するだけで、Nxが必要な設定を追加します:

    Terminal window
    pnpm nx sync
    Terminal window
    NX The workspace is out of sync
    [@nx/js:typescript-sync]: Some TypeScript configuration files are missing project references to the projects they depend on, contain stale project references, or have duplicate project references.
    [@aws/nx-plugin:ts#sync]: Local project dependencies are out of sync. The following workspace dependencies will be declared:
    packages/my-other-project/package.json:
    - @my-scope/my-library: workspace:*
    Syncing the workspace...
    The workspace was synced successfully!

    NxのTypeScript同期ジェネレータがプロジェクト参照を追加し、プラグインのts#syncジェネレータがインポートされたプロジェクトをプロジェクトのpackage.jsonに宣言します(パッケージマネージャがワークスペースプロトコルをサポートする場合はworkspace:*、npmとyarn classicでは*)。これにより、パッケージマネージャがインストール時にローカルプロジェクトをリンクします。この後、IDEのエラーが解消され、ライブラリを使用できるようになります。

    プロジェクトのtsconfig.jsonにカスタムのcompilerOptions.pathsエントリを追加すると、TypeScriptはtsconfig.base.jsonで定義されたワークスペースエイリアスを継承しなくなります。隠れたts#syncジェネレータはcompileターゲットの前に実行され(nx.jsonで設定)、既にpathsを宣言しているtsconfig.jsontsconfig.lib.jsontsconfig.app.jsonファイルに不足している基本エイリアスをコピーします。オプトアウトするには、nx.jsontargetDefaults.compile.syncGeneratorsから@aws/nx-plugin:ts#syncを削除してください。

    各TypeScriptプロジェクトは、サードパーティのランタイム依存関係を独自のpackage.jsonで宣言します。プロジェクト間で共有されるビルドおよびテストツールは、ルートのpackage.jsonで定義されます。

    プロジェクトにランタイム依存関係を追加するには、そのプロジェクトにインストールします:

    Terminal window
    pnpm add some-npm-package --filter my-library

    プロジェクトのディレクトリ内からパッケージマネージャの通常のadd/installコマンドを実行することもできます。

    共有開発ツールを追加するには、ワークスペースルートにインストールします:

    Terminal window
    pnpm add -Dw some-dev-tool

    カタログをサポートするパッケージマネージャ(pnpmyarnbun)の場合、ジェネレータは各バージョンをカタログに記録し、catalog:プロトコル(例:"zod": "catalog:")で参照します。これにより、どのプロジェクトが依存関係を宣言しているかに関係なく、カタログがバージョンの唯一の信頼できる情報源となります。これは単一バージョンポリシーに従うのに役立ち、型の競合やデプロイメントバンドル内のパッケージの複数コピーを回避できます。

    新しい依存関係を自分で追加する場合も、カタログに保持してください:

    ワークスペースはcatalogMode: strictを設定しているため、pnpm addがバージョンをカタログに記録し、自動的に参照します — 追加の手順は不要です。

    Terminal window
    pnpm add some-npm-package --filter my-library

    カタログはデフォルトで有効になっています。無効にするには、--catalog falseを指定してワークスペースを作成します:

    Terminal window
    pnpm create @aws/nx-workspace my-project --catalog false

    または、いつでもaws-nx-plugin.config.mtsで設定できます:

    aws-nx-plugin.config.mts
    export default {
    packageManager: {
    catalogs: false,
    },
    } satisfies AwsNxPluginConfig;

    カタログを無効にすると、ジェネレータは依存関係のバージョンを各プロジェクトのpackage.jsonに直接書き込み、プロジェクト間でバージョンを揃えることはあなたの責任になります。

    すべての依存関係をルートで宣言する

    Section titled “すべての依存関係をルートで宣言する”

    すべての依存関係をルートのpackage.jsonのみで宣言することを好む場合(プロジェクトごとの依存関係宣言なし)、ワークスペースのbiome.jsonでリントルールをオフにします:

    biome.json
    {
    "linter": {
    "rules": {
    "correctness": {
    "noUndeclaredDependencies": "off"
    }
    }
    }
    }

    プロジェクトはビルド時にルートにインストールされたパッケージを解決するため、すべてが正常にビルドされます — ただし、各プロジェクトの依存関係の正確な記録としてのプロジェクトごとのマニフェストを放棄することになります(これは後でプロジェクトを公開したり、リポジトリを分割したりする場合に重要です)。

    TypeScriptプロジェクトをランタイムコード(例:AWS Lambda関数のハンドラ)として使用する場合、Rolldownなどのツールを使用してプロジェクトをバンドルすることを推奨します。これにより、実際に参照されている依存関係のみが含まれるようツリーシェイキングされます。

    project.jsonファイルに以下のようなターゲットを追加することで実現できます:

    {
    ...
    "targets": {
    ...
    "bundle": {
    "cache": true,
    "executor": "nx:run-commands",
    "outputs": ["{workspaceRoot}/dist/packages/my-library/bundle"],
    "options": {
    "command": "rolldown -c rolldown.config.ts"
    }
    },
    },
    }

    rolldown.config.tsファイルは以下のように追加します:

    rolldown.config.ts
    import { defineConfig } from 'rolldown';
    export default defineConfig([
    {
    input: 'src/index.ts',
    output: {
    file: '../../dist/packages/my-library/bundle/index.js',
    format: 'cjs',
    inlineDynamicImports: true,
    },
    },
    ]);

    TypeScriptプロジェクトにはbuildターゲット(project.jsonで定義)が設定されており、以下のコマンドで実行できます:

    Terminal window
    pnpm nx build <project-name>

    <project-name>はプロジェクトの完全修飾名です。

    buildターゲットはプロジェクトのコンパイル、リンティング、テストを実行します。

    ビルド出力はワークスペースルートのdistフォルダ内のパッケージディレクトリ(例: dist/packages/<my-library>/tsc)に生成されます。

    ワークスペース内のすべてのプロジェクトをビルドするには、以下を実行します:

    Terminal window
    pnpm nx run-many --target build

    または、ショートハンドコマンドを使用します:

    Terminal window
    pnpm build

    Vitestがプロジェクトのテスト用に設定されています。

    テストは.spec.tsまたは.test.tsファイルに記述し、プロジェクトのsrcフォルダに配置します。

    例:

    • Directorysrc
      • hello.ts ライブラリソースコード
      • hello.spec.ts hello.tsのテスト

    VitestはdescribeittestexpectなどのJest風の構文を提供します。

    hello.spec.ts
    import { sayHello } from './hello.js';
    describe('sayHello', () => {
    it('should greet the caller', () => {
    expect(sayHello('Darth Vader')).toBe('Hello, Darth Vader!');
    });
    });

    テストの記述方法や依存関係のモック作成などの詳細については、Vitestドキュメントを参照してください。

    テストはプロジェクトのbuildターゲットの一部として実行されますが、testターゲットを個別に実行することもできます:

    Terminal window
    pnpm nx test <project-name>

    Vitestの-tフラグを使用して特定のテストまたはテストスイートを実行できます。--セパレータの後に渡すことで、Nxが独自の--targetオプションとして解釈するのではなく、Vitestに転送されます:

    Terminal window
    pnpm nx test <project-name> -- -t 'sayHello'

    TypeScriptプロジェクトでは、リンティングとフォーマットにBiomeを使用します。Biomeはワークスペースルートのbiome.jsonファイルで設定されます。この設定への変更はワークスペース内のすべてのTypeScriptプロジェクトに適用され、一貫性が保たれます。

    プロジェクトのリンターをチェックするにはlintターゲットを実行します:

    Terminal window
    pnpm nx lint <project-name>

    ほとんどのリンティングやフォーマットの問題は、--configuration=fix引数を付けて実行することで自動修正できます:

    Terminal window
    pnpm nx lint <project-name> --configuration=fix

    ワークスペース内のすべてのパッケージのリント問題を修正するには:

    Terminal window
    pnpm nx run-many --target lint --all --configuration=fix

    開発中にリンティング問題で作業が遅くなるのを避けるため(特にプロジェクトに自動修正できない問題がある場合)、skip-lint設定でビルドを実行できます:

    Terminal window
    pnpm nx run-many --target build --configuration=skip-lint

    これによりビルド中にlintターゲットが完全にスキップされます。