是否值得为服务器端使用预编译玉+车把?

时间:2013-03-13 15:12:52

标签: node.js templates handlebars.js pug pre-compilation

我将玉器与把手混合在一起,这样我就不必编写HTML了,并且可以使用与数据相关的很好的语法。

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

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

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

我不完全确定它是否扮演任何角色,但似乎jade.compileHandlebars.compile都是同步函数,这意味着只要进行编译,它们就会阻止其他请求。 / p>

1 个答案:

答案 0 :(得分:0)

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

  1. 解析
  2. 从数据和解析后的模板生成字符串
  3. 解析是一项昂贵的操作。它基本上由识别标记(特殊单词)和构建树结构组成。例如:

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

    此块可以被视为具有父with语句的树和多个子"<h2>By "firstnamelastName"</h2>"

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

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

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

    就Jade和Handlebars的组合而言,它看起来并不是一个好主意,因为渲染两个不同的模板是一个更昂贵的操作,因为你只能预先编译其中一个模板。您无法预编译它们,因为一个模板取决于另一个模板的结果。在您的情况下,Jade模板的“源代码”取决于应用Handlebars模板的结果。