2013-03-13 66 views
0

我将玉与句柄混合在一起,这样我就不必编写HTML,并且可以为数据相关的东西提供很好的语法。是否值得为服务器端使用预编译jade + handlebars?

例如,这可能是头模板,header.handlebars.jade

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

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

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

+0

翡翠在某些方面被认为很慢,但很难回答这种问题。我建议你为_你的具体情况构建一个基准并检查结果。 (例如,每个服务器负载的并发连接数)。一般来说,如果可以的话,总是值得编译你的模板。 – 2013-03-13 15:15:54

回答

0

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

  1. 解析
  2. 生成从所述数据串,并将解析的模板

解析是昂贵的操作。它基本上包含一个识别令牌(特殊词)和构建树结构。例如:

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

此块可以被认为是树与父母with声明和几个孩子"<h2>By "firstnamelastName"</h2>"

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

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

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

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

+0

感谢您的详尽解答。实际上,我理解预编译模板背后的基本原理和一般理念(我为客户端做的)。我只是想,如果我应该预先编译服务器端(它看起来不像express + jade是默认预编译的)。 至于混合玉和车把 - 我的Jade模板输出实际上并不依赖于把手。我总是首先解析Jade,然后解析Handlebars。我只使用Jade,因为我不想写简单的HTML。 但是,您关于在应用程序启动时加载模板并缓存它们的想法很有趣。 – ragulka 2013-03-13 15:46:27

+0

是的,我应该解释预编译和编译之间的区别。 Handlebars中的预编译实际上与编译相同,但将JavaScript源代码作为字符串而非可执行代码返回。即,'eval(precompile(tpl))<=> compile(tpl)'。我稍后会更新我的答案。 – juandopazo 2013-03-13 17:04:20