关于nodejs的模板引擎,如何选择 EJS 和 Jade?

EJS 结构更像原生 HTML,而 Jade 更简洁。你使用其中之一,是出于什么原因呢?
关注者
807
被浏览
314310
肯定是Jade。EJS不要说跟Jade比,就是跟传统模板技术,比如Smarty比,也很挫了,比如不支持模板继承。

Jade有两点是超出传统模板技术的。

第一、简洁。
注意,简洁并非单指更少的符号,而是看是否能match你的需要。Jade强制的缩进格式能凸显html的结构,而对于前端来说,最重要的任务恰恰是处理结构,而不像一般的html author那样是处理内容。反过来说,假如你的主要任务是处理内容,比如写作blog之类的,那你应该用wiki或者markdown之类的,而不应该用Jade。

第二、html-aware
传统模板技术其实是通用模板,即模板引擎并不care你输出的是html还是其他格式的文本。而Jade专为HTML设计,因此可以做许多传统模板做不到的专门针对html的优化。举个几个简单的例子:
1. 决定如何输出属性(当属性赋值为null/false时不输出属性,为true时只需属性不需要值,这在传统模板里写起来很麻烦、代码难看易出错)
2. 自动产生well-formed结构(甚至可决定是否要输出结束标签,而传统模板理论上也做不到这点,除非引入额外的html parse或tidy)
3. 换行处理,避免产生额外的空白节点
4. 对输出的变量自动进行特殊字符的encode

当然,这些ejs或传统模板也有能实现的,但是用起来感觉都很挫。

实际上,Jade在这方面其实做得还不够好(我打算顺着这个思路做个开源的项目),但是比那些传统模板还是要优雅多了。


补充:下面的答案有人吐槽缩进在混杂IDE时的问题。这个问题其实所有基于缩进的语言都有,比如Python、CoffeeScript之类的。简单来说只要团队里统一就可以了。如果仅仅因此要舍弃Jade,只能说很幼稚。

另外有人说Jade的性能太差。但根据 jsperf.com/dom-vs-inner ,预编译的Jade性能算是相当好的,反倒是EJS几乎垫底。