【问题标题】:Is it worth precompiling jade + handlebars for server-side usage?是否值得为服务器端使用预编译jade +车把?
【发布时间】:2013-03-13 15:12:52
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • Jade 被一些人认为很慢,但是对于 every 情况很难回答这类问题。我建议您为 您的 特定案例构建基准并检查结果。 (例如,每个服务器负载的并发连接数)。一般来说,如果可以的话,编译你的模板总是值得的。

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


【解决方案1】:

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

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

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

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

这个块可以被认为是具有父with语句和几个子"&lt;h2&gt;By "firstnamelastName"&lt;/h2&gt;"的树。

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

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

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

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

【讨论】:

  • 感谢您的详尽回答。实际上,我理解预编译模板背后的基本原理和一般想法(我是为客户端做的)。我只是在想我是否也应该为服务器端预编译(它看起来不像 express+jade 是默认预编译的)。至于混合玉和车把 - 我的玉模板输出实际上并不依赖于车把。我总是先解析 Jade,然后再解析 Handlebars。我使用 Jade 只是因为我不想编写纯 HTML。但是,您关于在应用启动时加载模板并缓存它们的想法很有趣。
  • 是的,我应该解释预编译和编译之间的区别。 Handlebars 中的预编译实际上与编译相同,但将 JavaScript 源代码作为字符串而不是可执行代码返回。即eval(precompile(tpl)) &lt;=&gt; compile(tpl)。我稍后会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
相关资源
最近更新 更多