从 ASP.NET Core 5.0 开始,Razor 编译器在编译时省略 Razor 组件(.razor 文件)中微不足道的空格。 有关讨论,请参阅问题 dotnet/aspnetcore#23568。
已引入的版本
5.0
旧行为
在 Blazor Server 和 Blazor WebAssembly 的 3.x 版本中,组件的源代码会保留空格。 只包含空白的文本节点即使没有视觉效果,它们仍然在浏览器的文档对象模型(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% 的呈现时间。
建议的措施
在大多数情况下,呈现的组件的视觉布局不受影响。 但是,使用 CSS 规则 white-space: pre时,空格删除可能会影响呈现的输出。 若要禁用此性能优化并保留空白,请执行以下任一操作:
- 将
@preservewhitespace true指令添加到 .razor 文件的顶部,以将首选项应用于特定组件。 - 在
@preservewhitespace true_Imports.razor 文件中添加该指令,以将首选项应用于整个子目录或整个项目。
在大多数情况下,不需要执行任何作,因为应用程序通常会继续正常运行(但速度更快)。 如果空白字符剥离导致特定组件出现任何问题,请在该组件中使用 @preservewhitespace true 来禁用此优化。
受影响的 API
没有