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

Примечание.

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

Внимание

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

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

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

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

Средства сборки 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

Компиляция AOT

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

Без включения компиляции Blazor WebAssembly 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 для выполнения собственной сборки через браузер. Повышение производительности 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.

dotnet publish -c Release

Компиляция AOT WebAssembly выполняется только при публикации проекта. Компиляция AOT не используется, когда проект запускается во время разработки (среда Development), поскольку компиляция AOT небольших проектов обычно занимает несколько минут и может значительно увеличиться для больших проектов. Сокращение времени сборки для компиляции 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 планируется для параметров конфигурации msbuild Document blazor (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, может потребоваться максимальное количество памяти для приложения со свойством EmccMaximumHeapSize MSBuild. Дополнительные сведения см. в статье Размещение и развертывание 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.

Внимание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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