Skip to content

Reactウェブサイト

このジェネレータはReactウェブサイトを新規作成し、CloudScapeの設定と、静的ウェブサイトをクラウドにデプロイするためのAWS CDKまたはTerraformインフラストラクチャ(S3ホスティング、CloudFront配信、WAF保護)を構成します。

生成されるアプリケーションはビルドツールとバンドラーにViteを使用し、型安全なルーティングにTanStack Routerを採用しています。

新しいReactウェブサイトは2つの方法で生成できます:

  1. インストール Nx Console VSCode Plugin まだインストールしていない場合
  2. VSCodeでNxコンソールを開く
  3. クリック Generate (UI) "Common Nx Commands"セクションで
  4. 検索 @aws/nx-plugin - ts#react-website
  5. 必須パラメータを入力
    • クリック Generate
    パラメータ デフォルト 説明
    name 必須 string - The name of the application.
    directory string packages The directory of the new application.
    enableTailwind boolean true Enable TailwindCSS for utility-first styling.
    enableTanstackRouter boolean true Enable Tanstack router for type-safe routing.
    iacProvider string Inherit The preferred IaC provider. By default this is inherited from your initial selection.

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

    • index.html HTMLエントリポイント
    • public 静的アセット
    • Directorysrc
      • main.tsx Reactセットアップを含むアプリケーションエントリポイント
      • config.ts アプリケーション設定(ロゴなど)
      • Directorycomponents
        • AppLayout CloudScapeレイアウトとナビゲーションバー用コンポーネント
      • Directoryhooks
        • useAppLayout.tsx ネストされたコンポーネントからAppLayoutを調整するフック
      • Directoryroutes
        • Directorywelcome
          • index.tsx @tanstack/react-router用のサンプルルート(ページ)
      • styles.css グローバルスタイル
    • vite.config.ts ViteとVitestの設定
    • tsconfig.json ソースとテスト用の基本TypeScript設定
    • tsconfig.app.json ソースコード用TypeScript設定
    • tsconfig.spec.json テスト用TypeScript設定

    このジェネレータは選択した iacProvider に基づいてInfrastructure as Codeを生成するため、packages/common に関連するCDKコンストラクトまたはTerraformモジュールを含むプロジェクトを作成します。

    共通のInfrastructure as Codeプロジェクトは以下の構造を持ちます:

    • Directorypackages/common/constructs
      • Directorysrc
        • Directoryapp/ プロジェクト/ジェネレータ固有のインフラストラクチャ用コンストラクト
        • Directorycore/ app 内のコンストラクトで再利用される汎用コンストラクト
        • index.ts app からコンストラクトをエクスポートするエントリーポイント
      • project.json プロジェクトのビルドターゲットと設定

    ジェネレータは選択したiacProviderに基づいてウェブサイトをデプロイするためのインフラストラクチャコードを作成します:

    • Directorypackages/common/constructs/src
      • Directoryapp
        • Directorystatic-websites
          • <name>.ts ウェブサイト固有のインフラストラクチャ
      • Directorycore
        • static-website.ts 汎用StaticWebsiteコンストラクト

    ReactドキュメントはReact開発の基本を学ぶのに適しています。CloudScapeドキュメントでは利用可能なコンポーネントとその使用方法を確認できます。

    CloudScapeウェブサイトにはデフォルトでTanStack Routerが設定されています。新しいルートを簡単に追加できます:

    1. ローカル開発サーバーを起動
    2. src/routesに新しい<page-name>.tsxファイルを作成(ファイルパスがURLパスに対応)
    3. RouteRouteComponentが自動生成されます。ここでページの構築を開始できます

    ページ間の移動にはLinkコンポーネントまたはuseNavigateフックを使用します:

    import { Link, useNavigate } from '@tanstack/react-router';
    export const MyComponent = () => {
    const navigate = useNavigate();
    const submit = async () => {
    const id = await ...
    // 非同期処理後のリダイレクトに`navigate`を使用
    navigate({ to: '/products/$id', { params: { id }} });
    };
    return (
    <>
    <Link to="/products">キャンセル</Link>
    <Button onClick={submit}>送信</Button>
    </>
    )
    };

    詳細はTanStack Routerドキュメントを参照してください。

    インフラストラクチャからの設定はランタイム設定を通じてウェブサイトに提供されます。これにより、デプロイ時まで不明なAPI URLなどの詳細情報にアクセス可能になります。

    RuntimeConfig CDKコンストラクトを使用して設定の追加・取得が可能です。@aws/nx-pluginジェネレータ(ts#trpc-apipy#fast-apiなど)で生成されたCDKコンストラクトは自動的にRuntimeConfigに値を追加します。

    ウェブサイトCDKコンストラクトはランタイム設定をruntime-config.jsonファイルとしてS3バケットのルートにデプロイします。

    packages/infra/src/stacks/application-stack.ts
    import { Stack } from 'aws-cdk-lib';
    import { Construct } from 'constructs';
    import { MyWebsite } from ':my-scope/common-constructs';
    export class ApplicationStack extends Stack {
    constructor(scope: Construct, id: string) {
    super(scope, id);
    // RuntimeConfigに自動的に値を追加
    new MyApi(this, 'MyApi', {
    integrations: MyApi.defaultIntegrations(this).build(),
    });
    // runtime-config.jsonとして自動デプロイ
    new MyWebsite(this, 'MyWebsite');
    }
    }

    ウェブサイトではuseRuntimeConfigフックを使用してランタイム設定値を取得できます:

    import { useRuntimeConfig } from '../hooks/useRuntimeConfig';
    const MyComponent = () => {
    const runtimeConfig = useRuntimeConfig();
    // ランタイム設定値にアクセス
    const apiUrl = runtimeConfig.apis.MyApi;
    };

    ローカル開発サーバーを実行する際、バックエンドURLや認証設定などを認識させるため、publicディレクトリにruntime-config.jsonファイルが必要です。

    ウェブサイトプロジェクトにはデプロイ済みアプリケーションからruntime-config.jsonを取得するload:runtime-configターゲットが設定されています:

    Terminal window
    pnpm nx run <my-website>:"load:runtime-config"

    serveまたはserve-localターゲットでローカル開発サーバーを起動できます。

    serveターゲットはウェブサイトのローカル開発サーバーを起動します。このターゲットを使用するには、ウェブサイトが連携するインフラストラクチャのデプロイとローカルランタイム設定の読み込みが必要です。

    次のコマンドで実行できます:

    Terminal window
    pnpm nx run <my-website>:serve

    このターゲットは「本番」デプロイされたAPIと連携しながらウェブサイトを変更する場合に有用です。

    serve-localターゲットはViteのMODEserve-localに設定したローカル開発サーバーを起動し、API接続ジェネレータで接続したAPIのローカルサーバーも同時に起動します。

    このターゲットでサーバーを起動すると、runtime-config.jsonがローカルAPIのURLを指すように自動的に上書きされます。

    次のコマンドで実行できます:

    Terminal window
    pnpm nx run <my-website>:serve-local

    このターゲットはウェブサイトとAPIを同時に開発する際の迅速な反復処理に適しています。

    このモードで実行しruntime-config.jsonが存在しない場合、CloudScapeウェブサイト認証ジェネレータでCognito認証を設定していても、ログインがスキップされローカルサーバーへのリクエストに認証ヘッダーが含まれません。

    serve-localで認証を有効化するには、インフラストラクチャをデプロイしランタイム設定を読み込んでください。

    buildターゲットでウェブサイトをビルドできます。Viteを使用して本番用バンドルをdist/packages/<my-website>/bundleディレクトリに生成し、型チェック、コンパイル、リンターを実行します。

    Terminal window
    pnpm nx run <my-website>:build

    テストの作成方法は標準的なTypeScriptプロジェクトと同様です。詳細はTypeScriptプロジェクトガイドを参照してください。

    React固有のテストにはReact Testing Libraryが事前にインストールされています。使用方法はReact Testing Libraryドキュメントを参照してください。

    テストはtestターゲットで実行できます:

    Terminal window
    pnpm nx run <my-website>:test

    Reactウェブサイトジェネレータは選択したiacProviderに基づいてCDKまたはTerraformのインフラストラクチャコードを作成します。これを使用してウェブサイトをデプロイできます。

    ウェブサイトのデプロイには、CDKアプリケーション作成用のts#infraジェネレータの使用を推奨します。

    packages/common/constructsに生成されたCDKコンストラクトを使用してウェブサイトをデプロイできます。

    packages/infra/src/stacks/application-stack.ts
    import { Stack } from 'aws-cdk-lib';
    import { Construct } from 'constructs';
    import { MyWebsite } from ':my-scope/common-constructs';
    export class ApplicationStack extends Stack {
    constructor(scope: Construct, id: string) {
    super(scope, id);
    new MyWebsite(this, 'MyWebsite');
    }
    }

    この設定では以下が構成されます:

    1. 静的ウェブサイトファイルホスティング用S3バケット
    2. グローバルコンテンツ配信用CloudFrontディストリビューション
    3. セキュリティ保護用WAF Web ACL
    4. 安全なS3アクセスのためのOrigin Access Control
    5. ウェブサイトファイルとランタイム設定の自動デプロイ