다음을 통해 공유


ASP.NET Core Blazor WebAssembly 빌드 도구 및 AOT(Ahead-Of-Time) 컴파일

참고

이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 10 버전을 참조하세요.

경고

이 버전의 ASP.NET Core는 더 이상 지원되지 않습니다. 자세한 내용은 .NET 및 .NET Core 지원 정책을 참조 하세요. 현재 릴리스는 이 문서의 .NET 10 버전을 참조하세요.

이 문서에서는 독립 실행형 Blazor WebAssembly 앱용 빌드 도구와 AOT(미리 실행형) 컴파일을 사용하여 배포에 앞서 앱을 컴파일하는 방법을 설명합니다.

.NET WebAssembly 빌드 도구

.NET WebAssembly 빌드 도구는 웹 플랫폼을 위한 컴파일러 도구 체인인 Emscripten에 기반합니다.

빌드 도구를 .NET 워크로드로 설치하려면 다음 방법 중 하나를 사용합니다.

  • Visual Studio 설치 관리자의 ASP.NET 및 웹 개발 워크로드의 경우 선택적 구성 요소 목록에서 .NET WebAssembly 빌드 도구 옵션을 선택합니다. 이 옵션은 다음을 보장합니다.

    • 워크로드는 최신 .NET SDK용으로 설치됩니다.
    • 새 버전의 Visual Studio가 릴리스되고 새 .NET SDK가 포함된 경우 이 옵션은 새 SDK에 대한 워크로드를 설치합니다.
  • 또는 관리 명령 셸 에서 다음 명령을 실행하여 시스템에서 사용할 수 있는 최신 .NET SDK에 최신 워크로드를 설치합니다.

    dotnet workload install wasm-tools
    

지정된 .NET SDK를 사용하여 이전 .NET 릴리스를 대상으로 지정하려면 워크로드를 설치합니다 wasm-tools-net{MAJOR VERSION} .

  • {MAJOR VERSION} 자리 표시자는 대상으로 지정할 .NET 릴리스의 주 버전 번호(예wasm-tools-net8: .NET 8)로 바뀝니다.
  • 워크로드는 .NET SDK별로 설치됩니다. 하나의 SDK에 대한 워크로드를 wasm-tools 설치해도 시스템의 다른 SDK에서 사용할 수 없습니다.
  • 사용하려는 각 .NET SDK 버전에 적절한 워크로드를 설치해야 합니다.

다음 목록에서는 대상으로 지정하려는 앱에 따라 각 .NET SDK에 설치할 워크로드를 보여줍니다. 여러 행에 동일한 워크로드 이름이 포함될 수 있지만 워크로드는 항상 특정 .NET SDK마다 약간 다릅니다.

  • .NET 10 SDK 사용
    • .NET 10을 대상으로 설정하려면 wasm-tools이 필요합니다.
    • .NET 9를 대상으로 지정하려면 wasm-tools-net9이(가) 필요합니다.
    • .NET 8을 대상으로 지정하려면 wasm-tools-net8이 필요합니다.
  • .NET 9 SDK 사용
    • .NET 9를 대상으로 지정하려면 wasm-tools이(가) 필요합니다.
    • .NET 8을 대상으로 지정하려면 wasm-tools-net8이 필요합니다.
  • .NET 8 SDK 사용: .NET 8을 대상으로 지정하려면 wasm-tools.

AOT(Ahead-Of-Time) 컴파일

Blazor WebAssembly는 .NET 코드를 WebAssembly로 직접 컴파일할 수 있는 AOT(ahead-of-time) 컴파일을 지원합니다. AOT 컴파일을 수행하면 앱 크기가 커지는 대신 런타임 성능이 향상됩니다.

AOT 컴파일을 사용하도록 설정하지 않으면, 앱은 WebAssembly로 구현된 .NET Blazor WebAssembly 인터프리터를 사용하여 브라우저에서 실행됩니다. JIT(Just-In-Time) 런타임 지원은 부분적으로만 적용되며, 이를 비공식적으로 Jiterpreter라고 합니다. .NET IL 코드가 해석되기 때문에 앱은 일반적으로 IL 해석 없이 서버 쪽 .NET JIT 런타임보다 느리게 실행됩니다. AOT 컴파일은 브라우저에서 기본 WebAssembly가 실행되도록 앱의 .NET 코드를 WebAssembly로 직접 컴파일하여 이 성능 문제를 해결합니다. AOT 성능 향상은 CPU 집약적인 작업을 실행하는 앱을 크게 향상할 수 있습니다. AOT 컴파일을 사용하는 경우의 단점은 AOT로 컴파일된 앱이 일반적으로 IL로 해석된 앱보다 크기 때문에 처음 요청 시 클라이언트에 다운로드하는 데 시간이 더 오래 걸린다는 것입니다.

AOT 컴파일 Blazor WebAssembly 을 사용하도록 설정하지 않으면 WebAssembly에서 구현된 .NET IL(중간 언어) 인터프리터를 사용하여 브라우저에서 앱이 실행됩니다. .NET 코드가 해석되기 때문에 앱은 일반적으로 서버 쪽 .NET JIT(Just-In-Time) 런타임보다 느리게 실행됩니다. AOT 컴파일은 브라우저에서 기본 WebAssembly가 실행되도록 앱의 .NET 코드를 WebAssembly로 직접 컴파일하여 이 성능 문제를 해결합니다. AOT 성능 향상은 CPU 집약적인 작업을 실행하는 앱을 크게 향상할 수 있습니다. AOT 컴파일을 사용하는 경우의 단점은 AOT로 컴파일된 앱이 일반적으로 IL로 해석된 앱보다 크기 때문에 처음 요청 시 클라이언트에 다운로드하는 데 시간이 더 오래 걸린다는 것입니다.

.NET WebAssembly 빌드 도구 설치에 대한 지침은 ASP.NET Core Blazor WebAssembly 빌드 도구 및 AOT(미리 보기) 컴파일을 참조하세요.

WebAssembly AOT 컴파일을 사용하도록 설정하려면 <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의 향후 릴리스를 위해 AOT 컴파일을 위한 빌드 시간 단축이 개발 중입니다.

AOT로 컴파일된 Blazor WebAssembly 앱의 크기는 일반적으로 .NET IL로 컴파일된 경우의 앱보다 큽니다.

  • 크기 차이는 앱에 따라 다르지만 대부분의 AOT로 컴파일된 앱은 IL로 컴파일된 버전의 약 두 배입니다. 즉, AOT 컴파일을 사용하면 로드 성능이 저하되는 대신 런타임 성능이 향상됩니다. 이 득실을 감안하며 AOT 컴파일을 사용할 가치가 있는지는 앱에 따라 달라집니다. CPU를 많이 사용하는 Blazor WebAssembly 앱이 일반적으로 AOT 컴파일의 이점을 가장 많이 누립니다.

  • AOT 컴파일 앱은 다음 두 가지 조건 때문에 크기가 증가합니다.

    • 네이티브 WebAssembly의 상위 수준 .NET IL 지침을 나타내려면 더 많은 코드가 필요합니다.
    • AOT는 앱이 게시될 때 관리되는 DLL을 트리밍하지 않습니다. Blazor에는 리플렉션 메타데이터를 위한 DLL이 필요하고 특정 .NET 런타임 기능을 지원해야 합니다. 클라이언트에서 DLL을 요구하면 다운로드 크기가 증가하지만 보다 호환성 높은 .NET 환경을 제공합니다.

참고

Mono/WebAssembly MSBuild 속성 및 대상에 대해서는 WasmApp.Common.targets(GitHub 리포지토리 dotnet/runtime)를 참조하세요. 일반적인 MSBuild 속성에 대한 공식 설명서는 문서 blazor msbuild 구성 옵션(dotnet/docs #27395)따라 계획됩니다.

성능

성능 지침은 ASP.NET Core Blazor WebAssembly 런타임 성능을 참조하세요.

  • 일부 모바일 디바이스 브라우저의 힙 크기
  • 런타임 재링크
  • 단일 명령, SIMD(다중 데이터)
  • AOT(Ahead-Of-Time) 컴파일 후 .NET IL 자르기(.NET 8 이상)

예외 처리

예외 처리는 기본적으로 사용하도록 설정됩니다. 예외 처리를 비활성화하려면 앱의 프로젝트 파일(<WasmEnableExceptionHandling>)에 false 속성을 .csproj 값으로 추가합니다.

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

앱의 프로젝트 파일 <WasmEnableExceptionHandling>(true)에 WebAssembly 예외 처리를 사용하도록 설정하는 속성을 추가하십시오. 속성의 값은 .csproj입니다.

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

자세한 내용은 다음 리소스를 참조하세요.

추가 리소스