ASP.NET Core инструменты сборки Blazor WebAssembly и предварительная (AOT) компиляция

Примечание.

Это не последняя версия этой статьи. В текущей версии см. версию .NET 10 этой статьи.

Предупреждение

Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущей версии см. версию .NET 10 этой статьи.

В этой статье описываются средства сборки для автономных Blazor WebAssembly приложений и компиляция приложения перед развертыванием с помощью предварительной компиляции (AOT).

Инструменты сборки WebAssembly .NET

Средства компиляции .NET WebAssembly основаны на цепочке инструментов Emscripten для веб-платформы.

Чтобы установить средства сборки в качестве рабочей нагрузки .NET, используйте любой из следующих подходов:

  • Для рабочей нагрузки ASP.NET и веб-разработки в установщике Visual Studio выберите параметр средства сборки .NET WebAssembly в списке дополнительных компонентов. Этот параметр гарантирует следующее:

    • Рабочая нагрузка устанавливается для последнего пакета SDK для .NET.
    • Когда выпущена новая версия Visual Studio и содержит новый пакет SDK для .NET, параметр устанавливает рабочую нагрузку для нового пакета SDK.
  • Кроме того, выполните следующую команду в командной оболочке администрирования , чтобы установить последнюю рабочую нагрузку на последнюю версию пакета SDK для .NET, доступного в системе:

    dotnet workload install wasm-tools
    

Чтобы нацелиться на предыдущий выпуск .NET с определённым пакетом SDK для .NET, установите рабочую нагрузку wasm-tools-net{MAJOR VERSION} :

  • Заполнитель {MAJOR VERSION} замещается основным номером версии .NET, на которую вы хотите нацелиться (например, wasm-tools-net8 для .NET 8).
  • Рабочие нагрузки устанавливаются в рамках пакета SDK для .NET. Установка рабочей нагрузки wasm-tools для одного пакета SDK не делает его доступным для других пакетов SDK в системе.
  • Необходимо установить соответствующую рабочую нагрузку для каждой версии пакета SDK для .NET, которую вы планируете использовать.

В следующем списке показано, какая рабочая нагрузка устанавливается для каждого пакета SDK для .NET в зависимости от целевых приложений. Хотя несколько строк могут содержать одно и то же имя рабочей нагрузки, рабочие нагрузки всегда отличаются немного для каждого конкретного пакета SDK для .NET.

  • Использование пакета SDK для .NET 10
    • Для целевого объекта .NET 10 требуется wasm-tools.
    • Для целевой платформы .NET 9 требуется wasm-tools-net9.
    • Чтобы использовать .NET 8 в качестве целевой платформы, требуется wasm-tools-net8.
  • Использование пакета SDK для .NET 9
    • Для целевой платформы .NET 9 требуется wasm-tools.
    • Чтобы использовать .NET 8 в качестве целевой платформы, требуется wasm-tools-net8.
  • Использование пакета SDK для .NET 8: для .NET 8 требуется wasm-tools.

Цепочка инструментов компилятора Emscripten зависит от Python, который по умолчанию входит в состав рабочей нагрузки средств сборки .NET WebAssembly в Windows и macOS. Python не входит в пакет для пользователей Linux, что приводит к ошибкам "не удается найти python в $PATH", если Python недоступен. Пользователи Linux должны установить Python с помощью диспетчера пакетов или скачать Python для Linux или Unix и вручную установить его в своей системе, чтобы он был доступен в $PATH.

Компиляция "Ahead-of-time" (AOT)

Blazor WebAssembly поддерживает упреждающую компиляцию (AOT), с помощью которой вы можете скомпилировать код .NET непосредственно в WebAssembly. Компиляция AOT позволяет повысить производительность среды выполнения за счет увеличения размера приложения.

Без AOT-компиляции приложения работают в браузере посредством интерпретатора промежуточного языка .NET Blazor WebAssembly, реализованного в WebAssembly с частичной поддержкой выполнения JIT, неофициально именуемым Jiterpreter. Так как код .NET IL интерпретируется, приложения обычно выполняются медленнее, чем если бы они работали в серверной среде выполнения JIT без интерпретации IL. Компиляция AOT решает эту проблему с производительностью, компилируя код .NET приложения непосредственно в WebAssembly для его выполнения в браузере. Повышение производительности AOT может привести к значительному улучшению приложений, выполняющих ресурсоемкие задачи. Недостаток использования компиляции AOT заключается в том, что приложения, скомпилированные с помощью AOT, обычно больше их аналогов, интерпретируемых с помощью IL, поэтому загрузка клиента при первом запросе обычно занимает больше времени.

Без включения компиляции Blazor WebAssembly AOT приложения выполняются в браузере с помощью интерпретатора промежуточного языка .NET (IL), реализованного в WebAssembly. Поскольку код .NET интерпретируется, приложения обычно выполняются медленнее, чем они бы выполнялись на стороне серверной среды выполнения JIT .NET. Компиляция AOT решает эту проблему с производительностью, компилируя код .NET приложения непосредственно в WebAssembly для его выполнения в браузере. Повышение производительности AOT может привести к значительному улучшению приложений, выполняющих ресурсоемкие задачи. Недостаток использования компиляции AOT заключается в том, что приложения, скомпилированные с помощью AOT, обычно больше их аналогов, интерпретируемых с помощью IL, поэтому загрузка клиента при первом запросе обычно занимает больше времени.

Инструкции по установке средств сборки .NET WebAssembly см. в статье Средства сборки ASP.NET Core Blazor WebAssembly и компиляция в режиме предварительной компиляции (AOT).

Чтобы включить компиляцию AOT WebAssembly, добавьте свойство <RunAOTCompilation>, которому присвоено значение true, в файл проекта приложения Blazor WebAssembly:

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

Чтобы скомпилировать приложение в WebAssembly, опубликуйте приложение. Публикация конфигурации Release гарантирует, что для уменьшения размера опубликованного приложения также выполняется линковка промежуточного языка .NET (IL).

dotnet publish -c Release

Компиляция WebAssembly AOT выполняется только при публикации проекта. Компиляция AOT не используется, когда проект запускается в среде разработки (Development), поскольку компиляция небольших проектов обычно занимает несколько минут, а для больших проектов может занимать значительно больше времени. Сокращение времени сборки для компиляции AOT планируется в будущих выпусках ASP.NET Core.

Размер приложения Blazor WebAssembly, скомпилированного в режиме AOT, обычно превышает размер приложения, скомпилированного в IL .NET.

  • Несмотря на то, что разница в размере зависит от приложения, большинство приложений, скомпилированных в режиме AOT, вдвое больше их версий, скомпилированных с помощью IL. Это означает, что при использовании компиляции AOT жертвуют производительностью при загрузке ради улучшенной производительности во время выполнения. Следует оценить, стоит ли использовать AOT-компиляцию, исходя из особенностей вашего приложения. Обычно преимущества компиляции AOT ощутимы для приложений Blazor WebAssembly, которые потребляют много ресурсов ЦП.

  • Больший размер приложения, скомпилированного в режиме AOT, обусловлен двумя условиями:

    • Требуется больше кода для представления высокоуровневых инструкций IL .NET в собственном формате WebAssembly.
    • AOT не обрезает управляемые библиотеки DLL при публикации приложения. Blazor требует библиотек DLL для метаданных отражения и поддержки некоторых функций среды выполнения .NET. Требование использовать библиотеки DLL в клиенте увеличивает размер скачиваемых ресурсов, но обеспечивает более совместимый интерфейс .NET.

Примечание.

Сведения о свойствах и целевых объектах MSBuild Mono/WebAssembly см. в разделе WasmApp.Common.targets (dotnet/runtimeрепозиторий GitHub). Планируется разработка официальной документации по общим свойствам MSBuild в рамках задачи Документировать параметры конфигурации blazor для msbuild (dotnet/docs #27395).

Производительность

Рекомендации по производительности см. в разделе ASP.NET Core Производительность среды выполненияBlazor WebAssembly:

  • Размер кучи для некоторых браузеров мобильных устройств
  • Перелинковка среды выполнения
  • Одна инструкция, несколько данных (SIMD)
  • Обрезать .NET IL после предварительной компиляции (AOT) (.NET 8 или более поздней версии)

Обработка исключений

Обработка исключений включена по умолчанию. Чтобы отключить обработку исключений, добавьте <WasmEnableExceptionHandling> свойство со значением false в файле проекта приложения (.csproj):

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

Чтобы включить обработку исключений WebAssembly, в файле проекта приложения (<WasmEnableExceptionHandling>) добавьте свойство true со значением .csproj.

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

Дополнительные сведения см. на следующих ресурсах:

Дополнительные ресурсы