之前一直没有用过EJS,一直用的jade,但是越用jade,越觉得好像被框在了圈圈里,倒不是jade的语法问题,相反我觉得jade从语法角度而言是最好的一门模版语言,对比ejs没有额外的添加代码,甚至是比html更好,但是jade由于他的简洁也造成了一个问题,如果没有html2jade 的转义很难和html相结合,特别是大多数人使用的前端模版,都是建立在html上的,所以如果不是项目开始就用jade的话就特别别扭,但是EJS却没有这类的问题,当然也付出了相应的代价在代码中看到让人眼睛发晕的<% %>
标签,特别让人不舒服,这也是在刚开始学习使用模版的时候没有选择EJS的原因
example
jade
!!!
html
head
title #{title}
meta(charset="UTF-8")
body
div.description #{description}
ul
- each data in datas
li.item(id='item_'+data.index)
span= data.time
a.art(href=data.url)= data.title
ejs
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title><%=title%> - Page Test</title>
</head>
<body>
<div class="description"><%=description%></div>
<ul>
<% function data(data) { %>
<li class="item" id="item_<%=data.index%>"><span><%=data.time%></span><a href="<%=data.url%>" class="art"><%=data.title%></a></li>
<% } %>
<% datas.map(data) %>
</ul>
</body>
</html>
语法
标签
<% ... %>
用来包含要执行的JS代码,凡是不需要输出文本的地方都用它<%= ... %>
用于输出文本,被包含的值解析后转换成文本<%- ... %>
EJS内部语法,不进行转义,如内部模版嵌套<%% ... %>
输出<%<%#
内部注释-%>
换行符
如果不喜欢<% ...%>
也可以换成其他的var ejs = require('ejs'); ejs.open = '{{'; ejs.close = '}}';
语法
EJS 直接使用js内嵌,用编程的方式写html,如:
<% if (user) { %> <h2><%= user.name %></h2> <% } %>
其主要有两种用法,一个是直接返回一个Function函数,参数为填充的数值对象,另一种是直接返回String类型的html,如:
var template = ejs.compile(str, options); template(data); // => Rendered HTML string ejs.render(str, data, options); // => Rendered HTML string
其中options的一些参数为:
- cache:是否缓存解析后的模版,需要filename作为key;
- filename:模版文件名;
- scope:complile后的Function执行所在的上下文环境;
- debug:标识是否是debeg状态,debug为true则会输出生成的Function内容;
- compileDebug:标识是否是编译debug,为true则会生成解析过程中的跟踪信息,用于调试;
- client,标识是否用于浏览器客户端运行,为true则返回解析后的可以单独运行的Function函数;
- open,代码开头标记,默认为’<%’;
- close,代码结束标记,默认为’%>’;
- 其他的一些用于解析模版时提供的变量。
在express中使用时,options参数将由response.render进行传入,其中包含了一些express中的设置,以及用户提供的变量值。
此外ejs还提供了一些辅助函数,用于代替使用javascript代码,使得更加方便的操纵数据。
- first,返回数组的第一个元素;
- last,返回数组的最后一个元素;
- capitalize,返回首字母大写的字符串;
- downcase,返回字符串的小写;
- upcase,返回字符串的大写;
- sort,排序(Object.create(obj).sort()?);
- sort_by:’prop’,按照指定的prop属性进行升序排序;
- size,返回长度,即length属性,不一定非是数组才行;
- plus:n,加上n,将转化为Number进行运算;
- minus:n,减去n,将转化为Number进行运算;
- times:n,乘以n,将转化为Number进行运算;
- divided_by:n,除以n,将转化为Number进行运算;
- join:’val’,将数组用’val’最为分隔符,进行合并成一个字符串;
- truncate:n,截取前n个字符,超过长度时,将返回一个副本
- truncate_words:n,取得字符串中的前n个word,word以空格进行分割;
- replace:pattern,substitution,字符串替换,substitution不提供将删除匹配的子串;
- prepend:val,如果操作数为数组,则进行合并;为字符串则添加val在前面;
- append:val,如果操作数为数组,则进行合并;为字符串则添加val在后面;
- map:’prop’,返回对象数组中属性为prop的值组成的数组;
- reverse,翻转数组或字符串;
- get:’prop’,取得属性为’prop’的值;
- json,转化为json格式字符串
EJS 模版嵌套
<%- include ... %>
<ul> <% users.forEach(function(user){ %> <% include user/show %> <% }) %> </ul>
总结:
EJS和jade之间其实没必要太过关注,他们都是模版语言,只要你喜欢只要合适,更具具体的项目选择合适的模版就行。