在过去的几年里,Wayfair的前端堆栈严重依赖于胡子模板。他们让我们不断增长的前端团队专注于前端。它们允许我们在服务器和客户端之间共享更多的代码驱动的未来。

任何看过胡子模板的人都知道它们写起来非常简单。如何渲染它们则是另一回事。我们开始使用纯PHP实现。这让我们起步了,但是当我们扩展了模板的使用时,我们遇到了一个不幸的事实,即这样的库永远不会比我们希望替换的纯PHP页面更快。然而,出于上面提到的组织和架构方面的原因,我们想让它工作。

要理解为什么在PHP中渲染Mustache很慢,首先您必须了解渲染Mustache需要做些什么。考虑一个规范模板/数据示例:

你好,{{name}}您刚刚赢得了{{value}}美元!{{#in_ca}}好,{{taxed_value}}美元,税后。{{/ in_ca}}{“名称”:“克里斯”、“价值”:10000年,“taxed_value”:10000 -(10000 * 0.4),“in_ca”:真正的}

必须对该模板进行标记,然后必须呈现每个标记。胡子是很简单的,标记基本上等于分裂的卷发。这对PHP来说不是什么大事。真正的技巧是用正确的内容替换{{name}}。当您有一个键/值对的平面集时,这是可以的。考虑一下这个例子:

{{内在}}{{#外}}{{内在}}{{/外}}{“内在”:1、“外”:{“内在”:2}}

输出应该是“12”。当呈现{{#outer}}部分时,渲染器必须知道要显示哪个“内部”。这通常是通过将数据散列转换为堆栈来实现的。当进入/退出部分时,数据被推入/弹出。要获得一个值,请从顶部开始并向下,直到找到匹配的值。

这是一个很容易描述的操作,但是会导致PHP运行缓慢。这是我们第一次使用Mustache实现的主要性能瓶颈,它是一个问题与另一个流行的实现。

考虑到这一点,我们寻求了更激进的解决办法。输入php-mustache, Mustache的c++实现作为PHP扩展。在遍历堆栈方面,c++比PHP好得多。看看我们第一次部署php-mustache之前/之后:

php-mustache性能

此图表显示了产品网格在浏览页面上的呈现时间(例如,)。这是一个复杂的mustache模板,包含大量数据和大量嵌套。x轴是时钟时间,y轴是以毫秒为单位的渲染时间。

这种提升让我们有理由让胡子成为一个标准,而不是一个偶然的工具。而且,感谢开源世界,我们甚至不必编写它。188金博宝备用然而,它却成了一把双刃剑。因为Wayfair在多个国家我们需要本地化很多字符串。我们首先在PHP中构建所有这些函数并将它们加载到模板中。这在某些情况下导致了一些较厚的代码,这偶尔会在使用Mustache时产生摩擦。胡须的典型i18n解决方案包括λ,不幸的是,这并没有在php-mustache中实现…直到现在!如果你是一个注重性能的Mustache用户,我们希望你能去看看它。