次の方法で共有


ASP.NET Core Blazor WebAssembly ビルド ツールと事前 (AOT) コンパイル

これは、この記事の最新バージョンではありません。 現在のリリースについては、 この記事の .NET 10 バージョンを参照してください。

警告

このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

この記事では、スタンドアロン Blazor WebAssembly アプリのビルド ツールと、事前 (AOT) コンパイルを使用して、デプロイの前にアプリをコンパイルする方法について説明します。

.NET WebAssembly ビルド ツール

.NET WebAssembly ビルド ツールは、Web プラットフォーム用のコンパイラ ツールチェーンである Emscripten をベースにしています。

ビルド ツールを .NET ワークロードとしてインストールするには、次 のいずれかの 方法を使用します。

  • Visual Studio インストーラーの ASP.NET と Web 開発ワークロードの場合は、オプションのコンポーネントの一覧から [.NET WebAssembly ビルド ツール] オプションを選択します。 このオプションにより、次の内容が保証されます。

    • ワークロードは、最新の .NET SDK 用にインストールされます。
    • 新しいバージョンの Visual Studio がリリースされ、新しい .NET SDK が含まれている場合、このオプションは新しい SDK のワークロードをインストールします。
  • または、 管理コマンド シェル で次のコマンドを実行して、システムで使用可能な最新の .NET SDK に最新のワークロードをインストールします。

    dotnet workload install wasm-tools
    

特定の .NET SDK で以前の .NET リリースをターゲットにするには、 wasm-tools-net{MAJOR VERSION} ワークロードをインストールします。

  • {MAJOR VERSION} プレースホルダーは、ターゲットとする .NET リリースのメジャー バージョン番号に置き換えられます (たとえば、.NET 8 のwasm-tools-net8)。
  • ワークロードは .NET SDK ごとにインストールされます。 1 つの SDK に対して wasm-tools ワークロードをインストールしても、システム上の他の SDK では使用できません。
  • 使用する .NET SDK バージョンごとに適切なワークロードをインストールする必要があります。

次の一覧は、対象とするアプリに応じて、各 .NET SDK にインストールするワークロードを示しています。 複数の行に同じワークロード名を含めることができますが、ワークロードは特定の .NET SDK ごとに常に若干異なります。

  • .NET 10 SDK の使用
    • .NET 10 をターゲットにするためには、 wasm-toolsが必要です。
    • .NET 9 をターゲットとするには、 wasm-tools-net9が必要です。
    • .NET 8 をターゲットとするには、 wasm-tools-net8が必要です。
  • .NET 9 SDK の使用
    • .NET 9 をターゲットとするには、 wasm-toolsが必要です。
    • .NET 8 をターゲットとするには、 wasm-tools-net8が必要です。
  • .NET 8 SDK の使用: .NET 8 をターゲットとするには、 wasm-toolsが必要です。

Ahead-Of-Time (AOT) コンパイル

Blazor WebAssembly では、Ahead-Of-Time (AOT) コンパイルがサポートされています。これにより、.NET コードを直接 WebAssembly にコンパイルできます。 AOT コンパイルを使用すると、アプリのサイズが大きくなりますが、実行時のパフォーマンスが向上します。

AOT コンパイルが有効にされていない場合、Blazor WebAssembly アプリは WebAssembly に実装された .NET 中間言語 (IL) インタープリターを使ってブラウザー上で実行され、部分的に Just-In-Time (JIT) ランタイムがサポートされます (非公式には Jiterpreter と呼ばれます)。 .NET IL コードは解釈されるため、通常、アプリが実行される速度は、IL の解釈がないサーバー側の .NET JIT ランタイムの場合より遅くなります。 AOT コンパイルでは、アプリの .NET コードを WebAssembly に直接コンパイルし、ブラウザーによるネイティブ WebAssembly 実行ができるようにすることで、このパフォーマンスの問題に対処します。 AOT のパフォーマンスを向上すれば、CPU が集中的に使用されるタスクを実行するアプリの機能を大幅に強化することができます。 AOT コンパイルを使用する場合の欠点としては、AOT でコンパイルされたアプリは、一般に、IL で解釈される場合よりもサイズが大きくなるため、最初に要求されたときに、通常、クライアントへのダウンロードに時間がかかるということがあります。

AOT コンパイルが有効にされていない場合、Blazor WebAssembly アプリは WebAssembly に実装された .NET 中間言語 (IL) インタープリターを使ってブラウザー上で実行されます。 .NET コードは解釈されるため、通常、アプリが実行される速度は、サーバー側の .NET Just-In-Time (JIT) ランタイムの場合より遅くなります。 AOT コンパイルでは、アプリの .NET コードを WebAssembly に直接コンパイルし、ブラウザーによるネイティブ WebAssembly 実行ができるようにすることで、このパフォーマンスの問題に対処します。 AOT のパフォーマンスを向上すれば、CPU が集中的に使用されるタスクを実行するアプリの機能を大幅に強化することができます。 AOT コンパイルを使用する場合の欠点としては、AOT でコンパイルされたアプリは、一般に、IL で解釈される場合よりもサイズが大きくなるため、最初に要求されたときに、通常、クライアントへのダウンロードに時間がかかるということがあります。

.NET WebAssembly ビルド ツールのインストールに関するガイダンスについては、「ASP.NET Core Blazor WebAssembly ビルド ツールと事前コンパイル (AOT)」を参照してください。

WebAssembly AOT コンパイルを有効にするには、<RunAOTCompilation> に設定された true プロパティを Blazor WebAssembly アプリのプロジェクト ファイルに追加します。

<PropertyGroup>
  <RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>

アプリを WebAssembly にコンパイルするには、アプリを発行します。 Release 構成を発行すると、.NET 中間言語 (IL) リンクも実行されて、発行されたアプリのサイズが確実に縮小されます。

dotnet publish -c Release

WebAssembly の AOT のコンパイルは、プロジェクトが発行されたときにのみ実行されます。 プロジェクトが開発中 (Development環境) に実行される場合、AOT コンパイルは通常使用されません。これは、AOT コンパイルは通常、小さなプロジェクトでは数分かかり、大きなプロジェクトでは大幅に長くかかる可能性があるためです。 ASP.NET Core の将来のリリースで AOT コンパイルのビルド時間の短縮を実現できるように、開発に取り組んでいます。

AOT でコンパイルされた Blazor WebAssembly アプリのサイズは、通常、.NET IL にコンパイルされた場合のアプリのサイズよりも大きくなります。

  • サイズの違いはアプリに依存しますが、AOT でコンパイルされたアプリのほとんどは、IL コンパイルされたバージョンの約 2 倍のサイズになります。 これは、AOT コンパイルを使用すると、実行時のパフォーマンス向上のために読み込み時間のパフォーマンスが低下することを意味します。 このようなトレードオフがあっても AOT コンパイルを使用する価値があるかどうかは、アプリによって異なります。 CPU を集中的に使用する Blazor WebAssembly アプリは、通常、AOT コンパイルから最も恩恵を受けます。

  • AOT でコンパイルされたアプリのサイズが大きくなるのは、次の 2 つのことのためです。

    • ネイティブ WebAssembly で高レベルの .NET IL 命令を表すには、より多くのコードが必要です。
    • アプリが発行されるとき、AOT ではマネージド DLL がトリミングされません。 Blazor では、リフレクション メタデータ用に、および特定の .NET ランタイム機能をサポートするために、DLL が必要です。 クライアントで DLL が必要であるためにダウンロード サイズは増加しますが、.NET エクスペリエンスとの互換性は高くなります。

Mono/WebAssembly MSBuild のプロパティとターゲットについては、WasmApp.Common.targets (dotnet/runtime GitHub リポジトリ) を参照してください。 一般的な MSBuild プロパティの公式ドキュメントは、Document blazor msbuild 構成オプション (dotnet/docs #27395)ごとに計画されています。

[パフォーマンス]

パフォーマンス ガイダンスについては、 ASP.NET Core Blazor WebAssembly ランタイムのパフォーマンスに関するトピックを参照してください。

  • 一部のモバイル デバイスのブラウザーのヒープ サイズ
  • ランタイムの再リンク
  • Single Instruction Multiple Data (SIMD)
  • 事前コンパイル (AOT) の後に .NET IL をトリミングする (.NET 8 以降)

例外処理

例外処理は、既定で有効になっています。 例外処理を有効にするには、アプリのプロジェクト ファイル (<WasmEnableExceptionHandling>) で false プロパティを .csproj の値で追加します。

<PropertyGroup>
  <WasmEnableExceptionHandling>false</WasmEnableExceptionHandling>
</PropertyGroup>

WebAssembly 例外処理を有効にするには、アプリのプロジェクト ファイル (<WasmEnableExceptionHandling>) で true プロパティを .csproj の値で追加します。

<PropertyGroup>
  <WasmEnableExceptionHandling>true</WasmEnableExceptionHandling>
</PropertyGroup>

詳細については、次のリソースを参照してください。

その他のリソース