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>
Дополнительные сведения см. на следующих ресурсах:
Дополнительные ресурсы
ASP.NET Core