次の方法で共有


Node.js で Aspire アプリを調整する

この記事では、Node.js プロジェクトで npm および Node Package Manager (Aspire) アプリを使用する方法について説明します。 この記事のサンプル アプリでは、クライアント エクスペリエンス AngularReactVue について説明します。 次のAspire API は、これらのシナリオをサポートするために存在しており、Aspire.Hosting.NodeJS NuGet パッケージの一部です。

これら 2 つの API の違いは、前者が Node.js アプリをホストするために使用されるのに対し、後者は package.json ファイルの scripts セクションから実行されるアプリと、対応する npm run <script-name> コマンドをホストするために使用される点です。

Tip

この記事のサンプル ソース コードは GitHubで入手できます。Aspire ページを使用した Angular を参照してください。

Important

この記事では、Single-Page アプリ (SPA) フロントエンド ビットに焦点を当てていますが、Node.js ページには、Aspireを使用したサーバー アプリとして Node.js を使用する方法を示す追加の サンプルがあります。

Prerequisites

Aspireを使用するには、次のものがローカルにインストールされている必要があります。

詳細については、Aspireセットアップとツール、および SDK のAspireに関する説明を参照してください。

さらに、コンピューターに Node.js をインストールする必要があります。 この記事のサンプル アプリは、Node.js バージョン 20.12.2 と npm バージョン 10.5.1 でビルドされています。 Node.js と npm のバージョンを確認するには、次のコマンドを実行します。

node --version
npm --version

Node.js (npmを含む) をダウンロードするには、Node.js ダウンロード ページを参照してください。

サンプル ソース コードを複製する

GitHubからサンプル ソース コードを複製するには、次のコマンドを実行します。

git clone https://github.com/dotnet/aspire-samples.git

リポジトリを複製した後、samples/AspireWithJavaScript フォルダーに移動します。

cd samples/AspireWithJavaScript

このディレクトリには、次の一覧で説明する 6 つの子ディレクトリがあります。

  • AspireJavaScript.Angular: 天気予報 API を利用してデータを取得し、テーブルに表示する Angular アプリ。
  • AspireJavaScript.AppHost: このサンプルの他のアプリを調整する Aspire プロジェクト。 詳細については、オーケストレーションの概要Aspire参照してください。
  • AspireJavaScript.MinimalApi: ランダムに生成された天気予報データを返す HTTP API。
  • AspireJavaScript。React: 天気予報 API を取得し、データを表形式で表示する React アプリ。
  • AspireJavaScript.ServiceDefaults: Aspire プロジェクトの既定の共有プロジェクト。 詳細については、サービスの既定値Aspire参照してください。
  • AspireJavaScript。Vue: 天気予報 API を取得し、データを表形式で表示する Vue アプリ。

クライアントの依存関係をインストールする

サンプル アプリでは、Node.js上に構築された JavaScript クライアント アプリの使用方法を示します。 各クライアント アプリは、npm create テンプレート コマンドを使用するか、手動で作成されました。 次の表に、各クライアント アプリの作成に使用するテンプレート コマンドと、既定のポートを示します。

アプリの種類 テンプレートの作成コマンド 既定のポート
Angular npm create @angular@latest 4200
React テンプレートを使用しませんでした。 PORT環境変数
Vue npm create vue@latest 5173

Tip

サンプル アプリにはクライアントが既に含まれているので、これらのコマンドを実行する必要はありません。 むしろ、これはクライアントが作成される基準となる参照ポイントです。 詳細については、npm-init参照してください。

アプリを実行するには、まず各クライアントの依存関係をインストールする必要があります。 これを行うには、各クライアント フォルダーに移動し、npm installnpm i (またはインストール エイリアス ) コマンドを実行します。

Angular 依存関係をインストールする

npm i ./AspireJavaScript.Angular/

Angular アプリの詳細については、Angular クライアント 参照してください。

React 依存関係をインストールする

npm i ./AspireJavaScript.React/

React アプリの詳細については、React クライアント 参照してください。

Vue 依存関係をインストールする

npm i ./AspireJavaScript.Vue/

Vue アプリの詳細については、Vue クライアント 参照してください。

サンプル アプリを実行する

サンプル アプリを実行するには、オーケストレーター AppHost AspireJavaScript.AppHost.csproj スイッチとして指定して --project コマンドを呼び出します。

dotnet run --project ./AspireJavaScript.AppHost/AspireJavaScript.AppHost.csproj

Aspire ダッシュボードが既定のブラウザーで起動し、[リソース] ページの [エンドポイント] 列に各クライアント アプリ エンドポイントが表示されます。 次の図は、このサンプル アプリのダッシュボードを示しています。

Aspire 複数の JavaScript クライアント アプリを含むダッシュボード。

weatherapi サービス エンドポイントは、HTTP API を文書化する Swagger UI ページに解決されます。 各クライアント アプリは、このサービスを使用して天気予報データを表示します。 各クライアント アプリを表示するには、 Aspire ダッシュボードで対応するエンドポイントに移動します。 これらのスクリーンショットと、テンプレートの開始点から行われた変更については、次のセクションで詳しく説明します。

アプリの実行に使用したのと同じターミナル セッションで、CtrlC 押してアプリを停止します。

AppHost を探索する

各クライアント アプリ リソースの調整方法を理解するには、AppHost プロジェクトを参照してください。 AppHost はアプリをホストするために、Aspire.Hosting.NodeJS NuGet パッケージNode.jsが必要です。

プロジェクト ファイルでは、AppHost がビルドされる前に npm 依存関係が確実にインストールされるようにするビルド ターゲットも定義されます。 AppHost コード (AppHost.cs_) は、 AddNpmApp(IDistributedApplicationBuilder, String, String, String, String[]) API を使用してクライアント アプリ リソースを宣言します。

上記のコード:

  • DistributedApplicationBuilderを作成します。
  • "weatherapi" サービスをプロジェクトとして AppHost に追加します。
    • HTTP エンドポイントを外部としてマークします。
  • "weatherapi" サービスへの参照を使用して、npm アプリとして "angular"、"react"、および "vue" クライアント アプリを追加します。
    • 各クライアント アプリは、異なるコンテナー ポートで実行するように構成され、PORT 環境変数を使用してポートを決定します。
    • また、すべてのクライアント アプリは、Dockerfile に依存してコンテナー イメージをビルドし、PublishAsDockerFile API からコンテナーとして発行マニフェストで自身を表現するように構成されています。

内部ループ ネットワークの詳細については、「Aspire内部ループ ネットワークの概要」を参照してください。 アプリの配置の詳細については、配置ツール ビルダーのマニフェスト形式Aspire参照してください。

AppHost は、各クライアント アプリの起動を調整するときに、 npm run start コマンドを使用します。 このコマンドは、各クライアント アプリの scripts ファイルの セクションで定義されています。 start スクリプトは、指定したポートでクライアント アプリを起動するために使用されます。 各クライアント アプリは、"weatherapi" サービスを要求するためにプロキシに依存します。

プロキシは次で構成されます。

  • クライアントの Angular ファイル。
  • クライアントの React ファイル。
  • クライアントの Vue ファイル。

Angular クライアントを調べる

元の Angular テンプレートからいくつかの重要な変更があります。 1 つ目は、proxy.conf.js ファイルの追加です。 このファイルは、Angular クライアントから "weatherapi" サービスへの要求をプロキシするために使用されます。

Aspire AppHost は、"weatherapi" サービス エンドポイントの解決に使用されるWEATHERAPI_HTTPSおよびWEATHERAPI_HTTP環境変数を設定します。 上記の構成は、環境変数で指定されたターゲット URL への /api で始まる HTTP 要求をプロキシします。

次に、プロキシ ファイルを angular.json ファイルに含めます。 serveターゲットを更新して、proxyConfig オプションを含め、作成された proxy.conf.js ファイルを参照します。 Angular CLI では、Angular クライアント アプリの提供中にプロキシ構成が使用されるようになります。

3 番目の更新は、package.json ファイルに対する更新です。 このファイルは、既定のポートとは異なるポートで実行するように Angular クライアントを構成するために使用されます。 これは、PORT 環境変数と、run-script-os npm パッケージを使用してポートを設定することで実現されます。

scripts ファイルの セクションを使用して、start スクリプトを定義します。 このスクリプトは、npm start クライアント アプリを起動するために、Angular コマンドによって使用されます。 start スクリプトは、run-script-os パッケージを使用してポートを設定するように構成されています。これは、OS に適した構文に基づいて適切な ng serve スイッチを渡す --port コマンドに委任します。

"weatherapi" サービスに対して HTTP 呼び出しを行うには、依存関係の挿入に AngularAngular を提供するように HttpClient クライアント アプリを構成する必要があります。 これは、provideHttpClient ファイルでアプリケーションを構成するときに、 ヘルパー関数を使用して実現されます。

最後に、Angular クライアント アプリは、/api/WeatherForecast エンドポイントを呼び出して天気予報データを取得する必要があります。 HTML、CSS、TypeScript の更新がいくつかあり、これらはすべて次のファイルに対して行われます。

Angularアプリ 実行中

Angular クライアント アプリを視覚化するには、Aspire ダッシュボードで "angular" エンドポイントに移動します。 次の図は、Angular クライアント アプリを示しています。

Angular 偽の天気予報データがテーブルとして表示されたクライアント アプリ。

React クライアントを調べる

React アプリはテンプレートを使用して記述されておらず、代わりに手動で記述されました。 完全なソース コードは、dotnet/aspire-samples リポジトリにあります。 いくつかの重要なポイントは、src/App.js ファイルにあります。

App 関数は、React クライアント アプリのエントリ ポイントです。 useStateuseEffect フックを使用して、天気予報データの状態を管理します。 fetch API は、/api/WeatherForecast エンドポイントに HTTP 要求を行うために使用されます。 応答は JSON に変換され、天気予報データの状態として設定されます。

上記のコードでは、次のように module.exports が定義されています。

  • entry プロパティは、src/index.js ファイルに設定されます。
  • devServer はプロキシに依存して要求を "weatherapi" サービスに転送し、ポートを PORT 環境変数に設定し、すべてのホストを許可します。
  • output は、bundle.js ファイルを含む dist フォルダーになります。
  • plugins src/index.html ファイルをテンプレートとして設定し、favicon.ico ファイルを公開します。

最終的な更新は、次のファイルに対して行われます。

Reactアプリ 実行中

React クライアント アプリを視覚化するには、Aspire ダッシュボードで "react" エンドポイントに移動します。 次の図は、React クライアント アプリを示しています。

React 偽の天気予報データがテーブルとして表示されたクライアント アプリ。

Vue クライアントを調べる

元の Vue テンプレートからいくつかの重要な変更があります。 主要な更新プログラムは、fetch エンドポイントから天気予報データを取得するために、TheWelcome.vue ファイルに /api/WeatherForecast 呼び出しが追加されました。 次のコード スニペットは、fetch 呼び出しを示しています。

TheWelcome 統合が mountedされると、/api/weatherforecast エンドポイントを呼び出して天気予報データを取得します。 応答は、forecasts データ プロパティとして設定されます。 サーバー ポートを設定するために、Vue クライアント アプリは PORT 環境変数を使用します。 これは、vite.config.ts ファイルを更新することによって実現されます。

さらに、Vite 構成では、要求を "weatherapi" サービスに転送する server.proxy プロパティを指定します。 これは、WEATHERAPI_HTTPS AppHost によって設定されるWEATHERAPI_HTTPおよびAspire環境変数を使用して実現されます。

テンプレートの最後の更新は、theWelcome.vue ファイル に対して行われます。 このファイルは、/api/WeatherForecast エンドポイントを呼び出して天気予報データを取得し、テーブルにデータを表示します。 これには、CSS 、HTML、TypeScript の更新が含まれています。

Vueアプリ 実行中

Vue クライアント アプリを視覚化するには、Aspire ダッシュボードで "vue" エンドポイントに移動します。 次の図は、Vue クライアント アプリを示しています。

Vue 偽の天気予報データがテーブルとして表示されたクライアント アプリ。

デプロイに関する考慮事項

この記事のサンプル ソース コードは、ローカルで実行するように設計されています。 各クライアント アプリは、コンテナー イメージとしてデプロイされます。 各クライアント アプリの Dockerfile は、コンテナー イメージのビルドに使用されます。 各 Dockerfile は同じです。マルチステージ ビルドを使用して、運用対応のコンテナー イメージを作成します。

クライアント アプリは現在、真の SPA アプリとして実行するように構成されており、サーバー側レンダリング (SSR) モードで実行するように構成されていません。 これらは、静的ファイル 提供するために使用される nginxの背後に配置されます。 default.conf.template ファイルを使用して、nginx を構成し、クライアントアプリへの要求をプロキシします。

Node.js サーバー アプリに関する考慮事項

この記事ではクライアント アプリに焦点を当てていますが、Node.js サーバー アプリをホストする必要があるシナリオが考えられます。 Node.js サーバー アプリを SPA クライアント アプリとしてホストするには、同じセマンティクスが必要です。 Aspire AppHost には、Aspire.Hosting.NodeJS NuGet パッケージ参照が必要であり、コードはAddNodeAppまたはAddNpmAppを呼び出す必要があります。 これらの API は、既存の JavaScript アプリを Aspire AppHost に追加する場合に便利です。

シークレットを構成し、JavaScript ベースのアプリに環境変数を渡すときは、クライアント アプリでもサーバー アプリでも、パラメーターを使用します。 詳細については、「 Aspire: 外部パラメーター - シークレット」を参照してください。

OpenTelemetry JavaScript SDK を使用する

OpenTelemetry サーバー アプリから Node.js ログ、トレース、メトリックをエクスポートするには、OpenTelemetry JavaScript SDKを使用します。

Node.js JavaScript SDK を使用した OpenTelemetry サーバー アプリの完全な例については、「コード サンプル: AspireNode.js サンプル ページ」を参照してください。 サンプルの instrumentation.js ファイルについて考えてみましょう。このファイルは、ログ、トレース、メトリックをエクスポートするように OpenTelemetry JavaScript SDK を構成する方法を示しています。

Tip

Aspire ダッシュボードの OTEL CORS 設定を構成するには、Aspire ダッシュボードの OTEL CORS 設定ページを参照してください。

Summary

この記事の範囲外の考慮事項がいくつかありますが、Aspire とノード パッケージ マネージャー (Node.js) を使用する npm プロジェクトをビルドする方法について学習しました。 また、AddNpmApp API を使用して Node.js アプリをホストする方法や、package.json ファイルから実行するアプリをホストする方法も学びました。 最後に、npm CLI を使用して、Angular、React、および Vue クライアント アプリを作成する方法と、それらをさまざまなポートで実行するように構成する方法について説明しました。

こちらも参照ください