共用方式為


設定 ASP.NET Core Blazor 的修剪器

注意

這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。

警告

不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。

重要

這些發行前產品的相關資訊在產品正式發行前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明示或默示的保證。

如需目前的版本,請參閱 本文的 .NET 9 版本。

本文說明如何在建置 Blazor 應用程式時,控制中繼語言 (IL) 修剪器。

Blazor WebAssembly 會執行中繼語言 (IL) 修剪,以減少已發佈輸出的大小。 發佈應用程式時會發生修剪。

組態

若要設定 IL 修剪器,請參閱 .NET 基本概念文件中的修剪選項一文,其中包含下列主題的指引:

  • 使用專案檔中的 <PublishTrimmed> 屬性,停用整個應用程式的修剪。
  • 控制 IL 修剪器積極捨棄未使用 IL 的方式。
  • 停止 IL 修剪器修剪特定組件。
  • 用於修剪的「根」組件。
  • 在專案檔中將 <SuppressTrimAnalysisWarnings> 屬性設定為 false,以針對反映的類型顯露警告。
  • 控制符號精簡和除錯支援。
  • 設定 IL 修剪器功能以便修剪架構程式庫功能。

預設修剪器粒度

Blazor 應用程式的預設修剪器粒度為 partial。 若要修剪所有組件,請在應用程式的專案檔中將粒度變更為 full

<PropertyGroup>
  <TrimMode>full</TrimMode>
</PropertyGroup>

如需詳細資訊,請參閱修剪選項 (.NET 文件)

無法保留已發行應用程式所使用的類型

修剪可能會對已發行的應用程式造成有害影響,而導致運行時錯誤。 在使用 反映的應用程式中,IL 修剪器通常無法判斷運行時間反映的必要類型,並修剪它們,或從方法修剪參數名稱。 這可能發生於用於 JS 互操作、JSON 序列化/反序列化和其他操作的複雜框架類型。

IL 修剪器也無法在執行階段對應用程式的動態行為做出反應。 為了確保已修剪的應用程式在部署後正常運作,請在開發時經常測試已發佈的輸出。

請考慮以下用戶端元件(位於 ASP.NET Core 8.0 或更新版本中),它可反序列化一個Blazor Web App集合KeyValuePairList<KeyValuePair<string, string>>

@rendermode @(new InteractiveWebAssemblyRenderMode(false))
@using System.Diagnostics.CodeAnalysis
@using System.Text.Json

<dl>
    @foreach (var item in @items)
    {
        <dt>@item.Key</dt>
        <dd>@item.Value</dd>
    }
</dl>

@code {
    private List<KeyValuePair<string, string>> items = [];

    [StringSyntax(StringSyntaxAttribute.Json)]
    private const string data =
        """[{"key":"key 1","value":"value 1"},{"key":"key 2","value":"value 2"}]""";

    protected override void OnInitialized()
    {
        JsonSerializerOptions options = new() { PropertyNameCaseInsensitive = true };

        items = JsonSerializer
            .Deserialize<List<KeyValuePair<string, string>>>(data, options)!;
    }
}

上述元件會在應用程式在本機執行時正常執行,併產生下列轉譯的定義清單 (<dl>):

key 1
value 1
key 2
value 2

發佈應用程式時,即使在項目檔中將屬性<PublishTrimmed>設定為false仍會從應用程式中被移除。 存取元件會拋出以下例外狀況:

Unhandled exception rendering component: ConstructorContainsNullParameterNames, System.Collections.Generic.KeyValuePair`2[System.String,System.String]

若要解決遺失的類型,請考慮下列方法。

將類型保留為動態相依性

建議您建立動態相依性,以使用[DynamicDependency]屬性來保持型別。

如果還不存在,請新增 @usingSystem.Diagnostics.CodeAnalysis指示詞:

@using System.Diagnostics.CodeAnalysis

新增[DynamicDependency]屬性以保留KeyValuePair

+ [DynamicDependency(DynamicallyAccessedMemberTypes.PublicConstructors, typeof(KeyValuePair<string, string>))]
private List<KeyValuePair<string, string>> items = [];

自訂類型

下列修改會建立 StringKeyValuePair 型別以供元件使用。

StringKeyValuePair.cs

[method: SetsRequiredMembers]
public sealed class StringKeyValuePair(string key, string value)
{
    public required string Key { get; init; } = key;
    public required string Value { get; init; } = value;
}

元件會修改為使用 StringKeyValuePair 類型:

- private List<KeyValuePair<string, string>> items = [];
+ private List<StringKeyValuePair> items = [];
- items = JsonSerializer.Deserialize<List<KeyValuePair<string, string>>>(data, options)!;
+ items = JsonSerializer.Deserialize<List<StringKeyValuePair>>(data, options)!;

由於在發佈應用程式時,絕不會修剪 Blazor 自定義類型,因此元件在發佈應用程式之後會如設計般運作。

其他資源