從 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
沒有