Blazor:编译期间移除组件中的无关紧要空格

从 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

没有