ASP.NET Core Blazor WebAssembly 生成工具和预先 (AOT) 编译

注意

此版本不是本文的最新版本。 对于当前版本,请参阅本文的 .NET 9 版本

警告

此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 NET Core 支持策略。 对于当前版本,请参阅本文的 .NET 9 版本

重要

此信息与预发布产品相关,相应产品在商业发布之前可能会进行重大修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。

对于当前版本,请参阅本文的 .NET 9 版本

本文介绍独立 Blazor WebAssembly 应用的生成工具,以及如何在部署前使用预先 (AOT) 编译来编译应用。

.NET WebAssembly 生成工具

.NET WebAssembly 生成工具基于 Emscripten,这是一个用于 Web 平台的编译器工具链。 若要安装生成工具,请使用以下任一方法

  • 对于 Visual Studio 安装程序中的 ASP.NET 和 Web 开发工作负载,请从可选组件列表中选择“.NET WebAssembly 生成工具”选项
  • 在管理命令外壳中执行 dotnet workload install wasm-tools

注意

适用于 .NET 6 项目的 .NET WebAssembly 生成工具

wasm-tools 工作负载为最新版本安装生成工具。 但是,当前版本的生成工具与使用 .NET 6 生成的现有项目不兼容。 使用必须同时支持 .NET 6 和更高版本的生成工具的项目必须使用多目标。

使用 .NET 7 SDK 开发应用时,将 wasm-tools-net6 工作负载用于 .NET 6 项目。 若要安装 wasm-tools-net6 工作负载,请从管理命令 shell 执行以下命令:

dotnet workload install wasm-tools-net6

预先 (AOT) 编译

Blazor WebAssembly 支持预先 (AOT) 编译,你可以直接将 .NET 代码编译到 WebAssembly 中。 AOT 编译会提高运行时性能,代价是应用大小增加。

如果没有启用 AOT 编译,则 Blazor WebAssembly 应用使用在 WebAssembly 中实现的 .NET 中间语言 (IL) 解释器在浏览器上运行,该解释器包括部分即时 (JIT) 运行时支持(其非正式名称为 Jiterpreter)。 由于 .NET IL 代码已经过解释,因此应用的运行速度通常比在没有任何 IL 解释的服务器端 .NET JIT 运行时上要慢。 AOT 编译将应用的 .NET 代码直接编译到 WebAssembly 中来供浏览器进行本机 WebAssembly 执行,从而处理这一性能问题。 AOT 性能改进可使执行 CPU 密集型任务的应用得到极大改进。 使用 AOT 编译的缺点是,AOT 编译的应用通常比其 IL 解释的对应项要长,因此通常在被首次请求时,下载到客户端的速度通常更慢。

如果没有启用 AOT 编译,则 Blazor WebAssembly 应用使用在 WebAssembly 中实现的 .NET 中间语言 (IL) 解释器在浏览器上运行。 由于 .NET 代码已经过解释,因此应用的运行速度通常比在服务器端 .NET 即时 (JIT) 运行时上要慢。 AOT 编译将应用的 .NET 代码直接编译到 WebAssembly 中来供浏览器进行本机 WebAssembly 执行,从而处理这一性能问题。 AOT 性能改进可使执行 CPU 密集型任务的应用得到极大改进。 使用 AOT 编译的缺点是,AOT 编译的应用通常比其 IL 解释的对应项要长,因此通常在被首次请求时,下载到客户端的速度通常更慢。

有关安装 .NET WebAssembly 生成工具的指导,请参阅 ASP.NET Core Blazor WebAssembly 生成工具和预先 (AOT) 编译

若要启用 WebAssembly AOT 编译,请将设置为 true<RunAOTCompilation> 属性添加到 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 编译的版本的两倍大。 这意味着使用 AOT 编译是用加载时间性能换取运行时性能。 使用 AOT 编译是否值得进行这种权衡取决于你的应用。 Blazor WebAssembly CPU 密集型应用通常最能从 AOT 编译中获益。

  • AOT 编译的应用大小较大,是由于两个条件导致的:

    • 需要更多代码来表示本机 WebAssembly 中的高级 .NET IL 指令。
    • AOT 在发布应用时不会剔除托管 DLL。 Blazor 需要这些 DLL 提供反射元数据支持和某些 .NET 运行时功能。 在客户端上要求使用 DLL 会增加下载大小,但会提供更兼容的 .NET 体验。

注意

有关 Mono/WebAssembly 的 MSBuild 属性和目标,请参见WasmApp.Common.targetsdotnet/runtime GitHub 仓库)。 根据文档 Blazor MSBuild 配置选项 (dotnet/docs #27395) 计划常见 MSBuild 属性的官方文档。

性能

有关性能指南,请参阅 ASP.NET 核心 Blazor WebAssembly 运行时性能

  • 某些移动设备浏览器的堆大小
  • 运行时重新链接
  • 单个指令,多个数据(SIMD)
  • .NET 8 或更高版本中 AOT 编译后的 IL 裁剪

异常处理

异常处理在默认情况下处于启用状态。 若要禁用异常处理,请在应用的项目文件 (.csproj) 中添加值为 false<WasmEnableExceptionHandling> 属性:

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

若要启用 WebAssembly 异常处理,请在应用的项目文件 (.csproj) 中添加值为 true<WasmEnableExceptionHandling> 属性:

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

有关详细信息,请参阅以下资源:

其他资源