ASP.NET Core Blazor WebAssembly build tools and ahead-of-time (AOT) build (AOT)

Uwaga

Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

Ważne

Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.

Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

W tym artykule opisano narzędzia kompilacji dla aplikacji autonomicznych Blazor WebAssembly oraz sposób kompilowania aplikacji przed wdrożeniem przy użyciu kompilacji Z wyprzedzeniem (AOT).

Chociaż artykuł koncentruje się głównie na aplikacjach autonomicznych Blazor WebAssembly , sekcja dotycząca rozmiaru sterty dla niektórych przeglądarek urządzeń przenośnych dotyczy również projektu po stronie klienta (.Client) Blazor aplikacji internetowej.

Narzędzia kompilacji zestawu WebAssembly platformy .NET

Narzędzia kompilacji zestawu WebAssembly platformy .NET są oparte na Emscripten, łańcuchu narzędzi kompilatora dla platformy internetowej. Aby zainstalować narzędzia kompilacji, użyj jednej z następujących metod:

  • W przypadku obciążenia ASP.NET i tworzenia aplikacji internetowych w instalatorze programu Visual Studio wybierz opcję Narzędzia kompilacji zestawu WebAssembly platformy .NET z listy składników opcjonalnych.
  • Wykonaj dotnet workload install wasm-tools polecenie w administracyjnej powłoce poleceń.

Uwaga

Narzędzia kompilacji zestawu WebAssembly platformy .NET dla projektów platformy .NET 6

Obciążenie wasm-tools instaluje narzędzia kompilacji dla najnowszej wersji. Jednak bieżąca wersja narzędzi kompilacji jest niezgodna z istniejącymi projektami utworzonymi na platformie .NET 6. Projekty korzystające z narzędzi kompilacji, które muszą obsługiwać zarówno platformę .NET 6, jak i nowszą wersję, muszą używać wielu elementów docelowych.

wasm-tools-net6 Użyj obciążenia dla projektów platformy .NET 6 podczas tworzenia aplikacji przy użyciu zestawu .NET 7 SDK. Aby zainstalować wasm-tools-net6 obciążenie, wykonaj następujące polecenie w powłoce poleceń administracyjnych:

dotnet workload install wasm-tools-net6

Kompilacja Z wyprzedzeniem (AOT)

Blazor WebAssembly program obsługuje kompilację przed czasem (AOT), w której można skompilować kod platformy .NET bezpośrednio do zestawu WebAssembly. Kompilacja AOT powoduje zwiększenie wydajności środowiska uruchomieniowego kosztem większego rozmiaru aplikacji.

Bez włączania kompilacji Blazor WebAssembly AOT aplikacje są uruchamiane w przeglądarce przy użyciu interpretera języka .NET Intermediate Language (IL) zaimplementowanego w zestawie WebAssembly z częściową obsługą środowiska uruchomieniowego just in time (JIT ), nieformalnie określane jako Jiterpreter. Ponieważ kod IL platformy .NET jest interpretowany, aplikacje zazwyczaj działają wolniej niż w środowisku uruchomieniowym .NET JIT po stronie serwera bez żadnej interpretacji języka IL. Kompilacja AOT rozwiązuje ten problem z wydajnością, kompilując kod platformy .NET aplikacji bezpośrednio do zestawu WebAssembly na potrzeby natywnego wykonywania zestawu WebAssembly przez przeglądarkę. Poprawa wydajności usługi AOT może spowodować znaczne ulepszenia aplikacji wykonujących zadania intensywnie korzystające z procesora CPU. Wadą korzystania z kompilacji AOT jest to, że aplikacje skompilowane przez usługę AOT są zazwyczaj większe niż ich odpowiedniki interpretowane w języku IL, więc zwykle pobieranie do klienta po pierwszym żądaniu trwa dłużej.

Bez włączania kompilacji Blazor WebAssembly AOT aplikacje są uruchamiane w przeglądarce przy użyciu interpretera języka .NET Intermediate Language (IL) zaimplementowanego w zestawie WebAssembly. Ponieważ kod platformy .NET jest interpretowany, aplikacje zazwyczaj działają wolniej niż w środowisku uruchomieniowym just in time (JIT) po stronie serwera. Kompilacja AOT rozwiązuje ten problem z wydajnością, kompilując kod platformy .NET aplikacji bezpośrednio do zestawu WebAssembly na potrzeby natywnego wykonywania zestawu WebAssembly przez przeglądarkę. Poprawa wydajności usługi AOT może spowodować znaczne ulepszenia aplikacji wykonujących zadania intensywnie korzystające z procesora CPU. Wadą korzystania z kompilacji AOT jest to, że aplikacje skompilowane przez usługę AOT są zazwyczaj większe niż ich odpowiedniki interpretowane w języku IL, więc zwykle pobieranie do klienta po pierwszym żądaniu trwa dłużej.

Aby uzyskać wskazówki dotyczące instalowania narzędzi kompilacji zestawu WebAssembly platformy .NET, zobacz ASP.NET Core Blazor WebAssembly build tools and ahead-of-time (AOT) build tools and ahead-of-time (AOT) build tools (Przed czasem kompilacji).

Aby włączyć kompilację zestawu AOT zestawu WebAssembly, dodaj <RunAOTCompilation> właściwość ustawioną na trueBlazor WebAssembly plik projektu aplikacji:

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

Aby skompilować aplikację do zestawu WebAssembly, opublikuj aplikację. Opublikowanie Release konfiguracji gwarantuje również uruchomienie połączenia języka .NET Intermediate Language (IL), aby zmniejszyć rozmiar opublikowanej aplikacji:

dotnet publish -c Release

Kompilacja AOT zestawu WebAssembly jest wykonywana tylko po opublikowaniu projektu. Kompilacja AOT nie jest używana, gdy projekt jest uruchamiany podczas projektowania (Development środowiska), ponieważ kompilacja AOT zwykle trwa kilka minut w małych projektach i potencjalnie znacznie dłużej w przypadku większych projektów. Skrócenie czasu kompilacji kompilacji AOT jest opracowywane w przyszłych wersjach ASP.NET Core.

Rozmiar aplikacji skompilowanej Blazor WebAssembly przez usługę AOT jest zazwyczaj większy niż rozmiar aplikacji, jeśli zostanie skompilowany na platformie .NET IL:

  • Mimo że różnica rozmiaru zależy od aplikacji, większość aplikacji skompilowanych przez AOT jest o około dwa razy większa niż rozmiar ich wersji skompilowanych w języku IL. Oznacza to, że użycie kompilacji AOT powoduje kompromis wydajności czasu ładowania na potrzeby wydajności środowiska uruchomieniowego. To, czy ta kompromis jest warta użycia kompilacji AOT, zależy od twojej aplikacji. Blazor WebAssembly aplikacje intensywnie korzystające z procesora CPU korzystają na ogół z kompilacji AOT.

  • Większy rozmiar aplikacji skompilowanej przez AOT jest spowodowany dwoma warunkami:

    • Aby przedstawić ogólne instrukcje dotyczące języka .NET IL, wymagany jest więcej kodu w natywnym zestawie WebAssembly.
    • Funkcja AOT nie przycina zarządzanych bibliotek DLL po opublikowaniu aplikacji. Blazor wymaga bibliotek DLL dla metadanych odbicia i obsługi niektórych funkcji środowiska uruchomieniowego platformy .NET. Wymaganie bibliotek DLL na kliencie zwiększa rozmiar pobierania, ale zapewnia bardziej zgodne środowisko platformy .NET.

Uwaga

Aby uzyskać informacje o właściwościach i obiektach docelowych programu Mono/WebAssembly MSBuild, zobacz WasmApp.Common.targets (dotnet/runtime repozytorium GitHub). Oficjalna dokumentacja typowych właściwości programu MSBuild jest planowana dla opcji konfiguracji programu Document blazor msbuild (dotnet/docs #27395).

Przycinanie języka .NET IL po kompilacji przed czasem (AOT)

WasmStripILAfterAOT Opcja MSBuild umożliwia usunięcie języka .NET Intermediate Language (IL) dla skompilowanych metod po wykonaniu kompilacji AOT do zestawu WebAssembly, co zmniejsza rozmiar _framework folderu.

W pliku projektu aplikacji:

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

To ustawienie powoduje przycinanie kodu IL dla większości skompilowanych metod, w tym metod z bibliotek i metod w aplikacji. Nie wszystkie skompilowane metody można przyciąć, ponieważ niektóre z nich są nadal wymagane przez interpreter platformy .NET w czasie wykonywania.

Aby zgłosić problem z opcją przycinania, otwórz problem w dotnet/runtime repozytorium GitHub.

Wyłącz właściwość przycinania, jeśli uniemożliwia ona normalne działanie aplikacji:

<WasmStripILAfterAOT>false</WasmStripILAfterAOT>

Rozmiar sterty dla niektórych przeglądarek urządzeń przenośnych

Podczas kompilowania aplikacji uruchamianej Blazor na kliencie i docelowych przeglądarkach urządzeń przenośnych, zwłaszcza w przeglądarce Safari w systemie iOS, może być wymagana maksymalna ilość pamięci dla aplikacji z właściwością EmccMaximumHeapSize MSBuild. Aby uzyskać więcej informacji, zobacz Host and deploy ASP.NET Core Blazor WebAssembly.

Ponowne łączenie środowiska uruchomieniowego

Jedną z największych części Blazor WebAssembly aplikacji jest środowisko uruchomieniowe .NET oparte na zestawie WebAssembly (dotnet.wasm), które przeglądarka musi pobrać, gdy aplikacja jest najpierw dostępna przez przeglądarkę użytkownika. Ponowne łączenie środowiska uruchomieniowego zestawu WebAssembly platformy .NET powoduje przycinanie nieużywanego kodu środowiska uruchomieniowego, co zwiększa szybkość pobierania.

Ponowne łączenie środowiska uruchomieniowego wymaga zainstalowania narzędzi kompilacji zestawu WebAssembly platformy .NET. Aby uzyskać więcej informacji, zobacz Tooling for ASP.NET Core Blazor.

Po zainstalowaniu narzędzi kompilacji zestawu WebAssembly platformy .NET ponowne łączenie środowiska uruchomieniowego jest wykonywane automatycznie po opublikowaniuRelease aplikacji w konfiguracji. Zmniejszenie rozmiaru jest szczególnie dramatyczne podczas wyłączania globalizacji. Aby uzyskać więcej informacji, zobacz ASP.NET Core Blazor globalizacji i lokalizacji.

Ważne

Ponowne łączenie środowiska uruchomieniowego powoduje przycinanie wystąpień klasy JavaScript do wywoływanych metod platformy .NET, chyba że są chronione. Aby uzyskać więcej informacji, zobacz Wywoływanie metod platformy .NET z funkcji Języka JavaScript w programie ASP.NET Core Blazor.

Pojedyncza instrukcja, wiele danych (SIMD)

Pojedyncza instrukcja zestawu WebAssembly, wiele danych (SIMD) może zwiększyć przepływność wektoryzowanych obliczeń, wykonując operację na wielu fragmentach danych równolegle przy użyciu jednej instrukcji. SimD jest domyślnie włączona.

Aby wyłączyć usługę SIMD, na przykład w przypadku określania wartości docelowej dla starych przeglądarek lub przeglądarek na urządzeniach przenośnych, które nie obsługują simD, ustaw <WasmEnableSIMD> właściwość na false wartość w pliku projektu aplikacji (.csproj):

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

Aby uzyskać więcej informacji, zobacz Konfigurowanie i hostowanie aplikacji webassembly platformy .NET: SIMD — pojedyncza instrukcja, wiele danych i zwróć uwagę, że wskazówki nie są wersjonowane i dotyczą najnowszej publicznej wersji.

Pojedyncza instrukcja zestawu WebAssembly, wiele danych (SIMD) może zwiększyć przepływność wektoryzowanych obliczeń, wykonując operację na wielu fragmentach danych równolegle przy użyciu jednej instrukcji. SimD jest domyślnie wyłączony.

Aby włączyć funkcję SIMD, dodaj właściwość ustawioną <WasmEnableSIMD> na true w pliku projektu aplikacji (.csproj):

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

Aby uzyskać więcej informacji, zobacz Konfigurowanie i hostowanie aplikacji webassembly platformy .NET: SIMD — pojedyncza instrukcja, wiele danych i zwróć uwagę, że wskazówki nie są wersjonowane i dotyczą najnowszej publicznej wersji.

Obsługa wyjątków

Obsługa wyjątków jest domyślnie włączona. Aby wyłączyć obsługę wyjątków, dodaj <WasmEnableExceptionHandling> właściwość z wartością false w pliku projektu aplikacji (.csproj):

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

Aby włączyć obsługę wyjątków zestawu WebAssembly, dodaj <WasmEnableExceptionHandling> właściwość z wartością true w pliku projektu aplikacji (.csproj):

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

Dodatkowe zasoby