0

我将 Jade 与把手混合在一起,这样我就不必编写 HTML 并且可以为与数据相关的内容提供良好的语法。

例如,这可能是标题的模板,header.handlebars.jade

html
  {{#with user}}
  {{if user.username}}
  header Welcome back, {{username}}
  {{/if}}
  {{/with}}

我想知道当我在 node.js 上的服务器端使用它时,是否应该用玉预编译这个模板,然后使用把手?如果我不这样做,我基本上会在每个请求上编译这个模板 2 次(首先是玉,然后是把手)。

我不完全确定这是否起任何作用,但似乎两者jade.compileHandlebars.compile都是同步函数,这意味着只要编译发生,它们就会阻塞其他请求。

4

1 回答 1

0

是的,预编译模板可能是个好主意。原因是使用模板通常包括两个步骤:

  1. 解析
  2. 从数据和解析的模板生成字符串

解析是一项昂贵的操作。它基本上由识别标记(特殊词)和构建树结构组成。例如:

{{#with author}}
  <h2>By {{firstName}} {{lastName}}</h2>
{{/with}}

这个块可以被认为是一个带有 parentwith语句和几个孩子"<h2>By ",firstnamelastName的树"</h2>"

当您预编译模板时,您所做的是生成代码,该代码是解析和生成树结构的结果,因此每次使用该代码时都不需要解析和生成树。您节省了许多 CPU 周期。

逻辑与你是应该在服务器启动时同步读取一些文件还是每次都读取它们是相同的。如果您在开始时阅读模板文件,您会执行较少的 IO 操作,但您会使用更多内存来存储这些模板的内容。解析也是如此。

我们中的许多人所做的是确定哪些资产会被大量使用(模板通常属于这一类),将它们缓存在内存中,其余的留待按需读取。这意味着您不能只更改模板并更新您的站点。您需要对站点进行版本控制,并且为了进行更新,您必须终止 Node 进程并重新启动它。这对您的站点是否是一个好主意将取决于您如何组织部署。

至于结合 Jade 和 Handlebars,这看起来不是一个好主意,因为渲染两个不同的模板是一项更昂贵的操作,而且您只能预编译其中一个。您不能同时预编译它们,因为一个模板依赖于另一个模板的结果。在您的情况下,Jade 模板的“源代码”取决于应用 Handlebars 模板的结果。

于 2013-03-13T15:37:38.167 回答