Поделиться через


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

Примечание.

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

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

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

Внимание

Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

В текущем выпуске см. эту версию .NET 9 этой статьи.

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

Хотя в статье основное внимание уделяется автономным Blazor WebAssembly приложениям, раздел о размере кучи для некоторых браузеров мобильных устройств также относится к клиентскому проекту (.Client) объекта Blazor Web App.

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

Средства компиляции .NET WebAssembly основаны на цепочке инструментов Emscripten для веб-платформы. Чтобы установить средства сборки, используйте любой из следующих подходов:

  • Для рабочей нагрузки ASP.NET и веб-разработки в установщике Visual Studio выберите параметр средства сборки .NET WebAssembly в списке дополнительных компонентов.
  • Запустите dotnet workload install wasm-tools в командной оболочке с правами администратора.

Примечание.

Средства сборки .NET WebAssembly для проектов .NET 6

wasm-tools Рабочая нагрузка устанавливает средства сборки для самой новой версии. Однако текущая версия средств сборки несовместима с существующими проектами, созданными с помощью .NET 6. Проекты, использующие инструменты сборки и требующие поддержки как .NET 6, так и более поздней версии, должны использовать многоцелевое нацеливание.

Используйте рабочую нагрузку wasm-tools-net6 для проектов .NET 6 при разработке приложений с помощью пакета SDK для .NET 7. Чтобы установить wasm-tools-net6 нагрузку программного обеспечения, выполните следующую команду из командной строки с правами администратора:

dotnet workload install wasm-tools-net6

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

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

Без AOT-компиляции приложения работают в браузере посредством интерпретатора промежуточного языка .NET (IL), реализованного в 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 для выполнения браузером в среде 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).

Обрезать .NET IL после предварительной компиляции (AOT)

Параметр WasmStripILAfterAOT MSBuild позволяет удалить промежуточный язык .NET (IL) для скомпилированных методов после выполнения компиляции AOT в WebAssembly, что снижает размер _framework папки.

В файле проекта приложения сделайте следующее:

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

Этот параметр обрезает код IL для большинства скомпилированных методов, включая методы из библиотек и методов в приложении. Не все скомпилированные методы можно обрезать, так как некоторые из них по-прежнему требуются интерпретатором .NET во время выполнения.

Чтобы сообщить о проблеме с параметром обрезки, откройте проблему в dotnet/runtime репозитории GitHub.

Отключите свойство обрезки, если оно не позволяет приложению работать нормально:

<WasmStripILAfterAOT>false</WasmStripILAfterAOT>

Размер кучи для некоторых браузеров мобильных устройств

При создании приложения Blazor, которое работает на клиенте и предназначено для браузеров мобильных устройств, особенно Safari на iOS, может потребоваться уменьшение максимального объема памяти для приложения с помощью свойства MSBuild EmccMaximumHeapSize. Дополнительные сведения см. в статье Размещение и развертывание ASP.NET Core Blazor WebAssembly.

Перелинковка среды выполнения

Одна из самых крупных частей приложения Blazor WebAssembly — это среда выполнения .NET на основе WebAssembly (dotnet.wasm), которую браузер должен загрузить при первом обращении к приложению через браузер пользователя. Релинкинг среды выполнения .NET WebAssembly обрезает неиспользуемый код, что улучшает скорость загрузки.

Релинкация среды выполнения требует установки инструментов сборки .NET WebAssembly. Дополнительные сведения см. в статье Инструментарий для ASP.NET Core Blazor.

При установленных средствах сборки .NET WebAssembly повторное связывание времени выполнения выполняется автоматически, когда приложение размещается в конфигурации Release. Уменьшение размера особенно существенно при отключении глобализации. Дополнительные сведения см. в статье Глобализация и локализация в ASP.NET Core Blazor.

Внимание

Среда выполнения при повторном связывании удаляет методы .NET, доступные для вызова из JavaScript, если они не защищены. Дополнительные сведения см. в статье Вызов методов .NET из функций JavaScript в ASP.NET Core Blazor.

Одна инструкция, несколько данных (SIMD)

Blazor использует одну инструкцию WebAssembly, несколько данных (SIMD) для повышения пропускной способности векторных вычислений путем параллельного выполнения операции с несколькими частями данных с помощью одной инструкции.

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

<PropertyGroup>
  <WasmEnableSIMD>false</WasmEnableSIMD>
</PropertyGroup>

Для получения дополнительной информации см. настройку и размещение приложений .NET WebAssembly: SIMD — один оператор, множество данных и обратите внимание, что рекомендации не имеют привязки к версиям и применяются к последнему общедоступному выпуску.

Blazor использует одну инструкцию WebAssembly, несколько данных (SIMD) для повышения пропускной способности векторных вычислений путем параллельного выполнения операции с несколькими частями данных с помощью одной инструкции.

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

<PropertyGroup>
  <WasmEnableSIMD>true</WasmEnableSIMD>
</PropertyGroup>

Дополнительные сведения см. в статье о настройке и размещении приложений .NET WebAssembly: SIMD — одна инструкция, несколько данных. Обратите внимание, что данное руководство не связано с конкретными версиями и применяется к последнему общедоступному выпуску.

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

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

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

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

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

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

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