Node.js 是否值得预先编译jade+;服务器端使用的把手?
我把jade和handlebar混合在一起,这样我就不必编写HTML,并且可以拥有与数据相关的东西的良好语法 例如,这可能是header的模板,Node.js 是否值得预先编译jade+;服务器端使用的把手?,node.js,templates,handlebars.js,pug,pre-compilation,Node.js,Templates,Handlebars.js,Pug,Pre Compilation,我把jade和handlebar混合在一起,这样我就不必编写HTML,并且可以拥有与数据相关的东西的良好语法 例如,这可能是header的模板,header.handlebar.jade html {{#with user}} {{if user.username}} header Welcome back, {{username}} {{/if}} {{/with}} 我想知道当我在node.js服务器端使用这个模板时,是否应该先用jade和handlebar预编译这个模
header.handlebar.jade
html
{{#with user}}
{{if user.username}}
header Welcome back, {{username}}
{{/if}}
{{/with}}
我想知道当我在node.js服务器端使用这个模板时,是否应该先用jade和handlebar预编译这个模板?如果我没有,我基本上会根据每个请求编译这个模板2次(首先是jade,然后是handlebar)
我不完全确定这是否起作用,但似乎
jade.compile
和handlebar.compile
都是同步函数,这意味着只要编译发生,它们就会阻止其他请求。是的,预编译模板是个好主意。原因是使用模板通常包括两个步骤:
{{#with author}}
<h2>By {{firstName}} {{lastName}}</h2>
{{/with}}
{{{与作者}
通过{{firstName}{{lastName}}
{{/与}}
此块可以被认为是一棵树,其中包含一个带有语句的父,以及几个子“
,名字
,姓氏
和”
当您预编译模板时,您所做的是生成代码,这是解析和生成树结构的结果,因此每次使用该代码时,您不需要解析和生成树。你节省了很多CPU周期
逻辑与您是应该在服务器启动时同步读取某些文件,还是每次都读取它们相同。如果您在开始时读取模板文件,则会减少IO操作,但会使用更多内存来存储这些模板的内容。解析也是如此
我们中的许多人所做的是确定哪些资产将被大量使用(模板通常属于这一类),将它们缓存在内存中,并将其余的留给按需读取。这意味着你不能仅仅改变一个模板和更新你的网站。您需要对站点进行版本设置,为了进行更新,您必须终止节点进程并重新启动它。这对您的站点是否是一个好主意将取决于您如何组织部署
至于组合Jade和handlebar,这看起来不是一个好主意,因为渲染两个不同模板的操作成本更高,而且您只能预编译其中一个模板。不能同时预编译这两个模板,因为一个模板依赖于另一个模板的结果。在您的案例中,Jade模板的“源代码”取决于应用把手模板的结果。有些人认为Jade速度较慢,但很难针对每种情况回答此类问题。我建议您为您的具体案例构建一个基准,并检查结果。(例如,每个服务器负载的并发连接数)。一般来说,如果你有能力的话,编译你的模板总是值得的。谢谢你详尽的回答。事实上,我理解预编译模板背后的基本原理和总体思路(我是为客户端做的)。我只是在想我是否也应该为服务器端预编译(看起来express+jade并不是默认预编译的)。至于混合玉和车把-我的玉模板输出实际上并不依赖于车把。我总是先解析玉,然后解析把手。我使用Jade只是因为我不想编写简单的HTML。然而,你关于在应用程序启动时加载模板并缓存它们的想法很有趣。是的,我应该解释预编译和编译之间的区别。在Handlebar中预编译实际上与编译相同,但返回的JavaScript源代码是字符串,而不是可执行代码。也就是说,eval(预编译(tpl))compile(tpl)
。稍后我会更新我的答案。