Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 是否值得预先编译jade+;服务器端使用的把手?_Node.js_Templates_Handlebars.js_Pug_Pre Compilation - Fatal编程技术网

Node.js 是否值得预先编译jade+;服务器端使用的把手?

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预编译这个模

我把jade和handlebar混合在一起,这样我就不必编写HTML,并且可以拥有与数据相关的东西的良好语法

例如,这可能是header的模板,
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)
    。稍后我会更新我的答案。