mustache.js中compile()、parse()和render()的区别

11

Mustache.compile()Mustache.parse()Mustache.render()在新版的mustache.js 0.5.0中有什么区别?或者说,解析和编译一般来说有什么不同?


15
已经阅读了原始资料,但仍然无法看出区别。 - alnafie
3个回答

20

编辑

自版本0.8.0引入API更改compile()方法已被集成到parse()中。不再需要手动编译模板。


Mustache.parse()

从语法上解析模板并创建JavaScript函数体(字符串)。在此过程中,它会通知模板中遇到的任何语法错误。

Mustache.compile()

使用成功的 parse() 返回的函数体来创建一个实际的 JavaScript 函数。创建的函数会被放置在缓存中以便重复使用。

Mustache.render()

将适当的函数应用于给定模板(由compile()创建的模板),并将其应用于实际数据。这将创建用于显示在屏幕上的结果。

谢谢Tomalak!我能理解在某些情况下为了性能在渲染之前进行编译的意义,但我想不出什么场景中使用解析会有意义。你能给一个使用解析的例子吗? - alnafie
解析始终是将任意字符串(符合Moustache语法的字符串)转换为计算机可处理内容的第一步。这正是当浏览器读取JavaScript源代码文件时发生的情况。如果没有对输入进行解析,计算机将无法执行任何操作。moustache.js将模板编译成一个JavaScript函数,该函数专门执行模板所述的操作,而不进行其他操作。最终,这比每次调用(“渲染”)模板时解释模板要快得多。 - Tomalak
暴露解析阶段还提供了一些有意义的东西,可以放入memcache中并在前端使用。 - J Chris A

3

小贴士: Mustache.parse(template) 是可选项,可以加快未来使用模板的速度。其在你想要以一组(大量)数据重复使用模板时非常有用。如果不是这种情况,只需调用 Mustache.render() 生成最终结果即可。


2

一些额外的内容: 如果您使用自定义分隔符(而不是{{}}),则可以在调用带有自定义分隔符作为参数的Mustache.render之前使用Mustache.parse

例如:

var template = "<h1>Hello {{$name$}}</h1>"
var customTags = [ '{{$', '$}}' ];
Mustache.parse(template, cutomTags);
var result = Mustache.render(template, { name: "John" };
console.log(result);

将导致:

Hello John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接