共用方式為


Blazor:編譯時期從元件移除不重要的空白字元

從 ASP.NET Core 5.0 開始,Razor 編譯程式會在編譯時期省略 Razor 元件 (.razor 檔案) 中微不足道的空格符。 如需討論,請參閱 dotnet/aspnetcore#23568 問題。

推出的版本

5.0

舊行為

在 3.x 版的 Blazor Server 和 Blazor WebAssembly 中,會保留元件原始程式碼中的空格符號。 只有空格符的文字節點會在瀏覽器的檔物件模型 (DOM) 中呈現,即使沒有視覺效果也一樣。

請考慮下列 Razor 元件程式代碼:

<ul>
    @foreach (var item in Items)
    {
        <li>
            @item.Text
        </li>
    }
</ul>

上述範例會渲染兩個空白節點。

  • 位於 @foreach 程式碼區塊外部。
  • <li> 元素周圍。
  • @item.Text 輸出周圍。

包含 100 個項目的清單會產生 402 個空格元節點。 這是節點渲染中的一半以上,即使空白字符節點在視覺上不影響渲染的輸出。

為元件轉譯靜態 HTML 時,不會保留標記內的空格符。 例如,檢視下列元件的來源:

<foo        bar="baz"     />

不會保留空格符。 預先轉譯的輸出為:

<foo bar="baz" />

新行為

除非使用@preservewhitespace指令並且其值為true,否則會移除空白節點:

  • 在元素內開頭或尾端。
  • RenderFragment參數中居首或居尾。 例如,將子內容傳遞至另一個元件。
  • 在 C# 程式代碼區塊之前或之後,例如 @if@foreach

變更的原因

在 ASP.NET Core 5.0 中,Blazor 的一個目標是提高繪製和差異計算的效能。 微不足道的空格符樹狀節點在基準檢驗中耗用最多 40% 的轉譯時間。

在大部分情況下,轉譯元件的視覺配置不會受到影響。 不過,使用類似 white-space: pre的 CSS 規則時,空格符移除可能會影響轉譯的輸出。 若要停用此效能最佳化功能並保留空白字元,請採取下列其中一個動作:

  • @preservewhitespace true 指示詞添加到 .razor 檔案的頂端,以將偏好設定套用到特定元件。
  • 請在 @preservewhitespace true 檔案內新增 指示詞,以便將該偏好設定應用到整個子目錄或整個專案。

在大部分情況下,不需要採取任何動作,因為應用程式通常會繼續正常運作(但更快)。 如果去除空格對特定元件造成任何問題,請在該元件中使用 @preservewhitespace true 來停用此優化。

受影響的 API

沒有