我们可以让 twig 在编译时而不是在渲染时删除空格吗?

Can we make twig remove whitespace when it's compiled, rather than when it's rendered?

Twig 有 {% spaceless %} 标签,它删除了 HTML 标签之间的所有白色 space。

但是,它会在您呈现模板时使用 preg_replace 执行此操作。适用于小文件,但如果您有大型复杂模板,则会影响性能。

我觉得应该可以在编译时去掉白色space?

我编译的模板充满了类似

的东西
        echo "    <h2>Heading</h2>
";

模板包含以下内容:

<section>
    <h2>Heading</h2>
</section>

我想要的最终渲染 HTML 是

<section><h2>Heading</h2></section>

为什么 twig 不能(非常简单地)在构建编译模板时添加一个 trim,给我们:

echo "<h2>Heading</h2>";

编译模板中php代码。

我知道我在 {{ }} 中填充模板的任何数据中仍然可能有白色 space,但我可以通过我的 PHP 轻松控制它。

尝试使用 Twig 库中的 trim 函数

trim - Documentation - Twig - The flexible, fast, and secure PHP template engine

好的,在库中进行了大量挖掘以试图找出哪些文件生成输出的哪些位之后,我终于找到了这个 "fix"。

改变

->string($this->getAttribute('data'))

->string(trim(preg_replace('/>\s+</', '><', $this->getAttribute('data'))))

第 30 行/lib/Twig/Node/Text。php。

正确执行此操作会得到 "spaceless" 输出,但不需要昂贵的模板渲染时间 preg_replace 调用。

会不会出问题?可能在某些用例中,可能带有部分 <pre><textarea> 标记。不过,我看不出这些对我来说是个问题。

有没有我没有想到的陷阱?

如果模板源代码中有空格,最适合您需求的工具是 Twig 的空白控制功能:http://twig.sensiolabs.org/doc/templates.html#whitespace-control

如果空格在输出中显示的变量中,您应该使用 trim 过滤器(或 trim 变量,然后再将其传递给 Twig,无论如何都会做同样的事情)