ejs 是 node.js 的一种模板引擎,本文介绍简单用法。
EJS是一个javascript模板库,用来从json数据中生成HTML字符串。
<%...%>
包含 js 代码<%=...%>
输出变量 变量若包含 '<' '>' '&'
等字符 会被转义<%-...%>
输出变量 不转义<%- include('user/show') %>
引入其他模板 包含 ./user/show.ejs
<%# some comments %>
来注释,不执行不输出<%%
转义为 '<%'
<% ... -%>
删除新的空白行模式?<%_ ... _%>
删除空白符模式npm install ejs
bower install ejs
//ejs可以配合express框架使用,或直接在node中/浏览器中使用
//template.ejs:
<% if(comic) { %>
<h2><%=comic.name%></h2>
<% } %>
//test.js:
var comic = {name: 'one piece'};
// 渲染文件模板,
// comic.ejs 包含 header.ejs footer.ejs,
// 若include了文件 必须指定 filename参数 , 参数为文件路径,
// 文件所在目录为查找include资源的目录 path.diranme(specialFilepath)
var html = ejs.render( fs.readFileSync('comic.ejs', 'utf8'), {'comic': comic}, {filename: __dirname+'\\abc.js'});
console.log(html);
var template = ejs.compile(str, options); //=> function
template(data); //=> html
ejs.render(str, data, options); //=>html
//or 把str data options都放在一个object中传入
ejs.render(allOptions);
cache
缓存编译后的函数(ejs.compile(…) ,需要 filename
参数作为缓存的keyfilename
用于缓存的key,和includecontext
函数的执行上下文compileDebug
输出compile的信息来跟踪调试client
返回编译后的函数delimiter
<% … %> 指这里的%debug
输出ejs.compile()得到函数的函数体strict
ejs.compile()返回的函数是否执行在严格模式_with
是否使用 with(){…} 来访问本地变量localsName
保存本地变量的对象名,默认为localsrmWhitespace
移除多余空格<ul>
<% users.forEach(function(user){ %>
<%- include('user/show', {user: user}) %>
<%});%>
</ul>
include是在运行时被执行的,所以可以支持路径为变量, 如:
<% somePath='some/path' %>
...
<%- include(somePath) %>
var ejs = require('ejs');
var users = ['lufy', 'zoro', 'nami'];
//渲染字符串模板时,指定分隔符
//<%= ... %> 输出变量 输出表达式的结果
var ret1 = ejs.render('<?=users.join(" | "); ?> ', {users: users}, {delimiter: '?'});
console.log(ret1); //=>lufy | zoro | nami
// 全局指定分隔符
ejs.delimiter = '$';
var ret2 = ejs.render('<$= users.join(" | "); $>', {users: users});
console.log(ret2);
//comic.ejs:
<%- include('header'); %>
<h1>hot comic now: </h1>
<% if(comic) { %>
<h2><%= comic.name %></h2>
<% } %>
<%- include('footer') %>
//test.js:
var html = ejs.render( fs.readFileSync('comic.ejs', 'utf8'), {'comic': comic}, {filename: __dirname+'\\abc.js'});
<%- include('path/filename', { data: data }) %>
上面的代码将path目录下的filename.ejs文件引入到当前文件中,并将data的值传入filename.ejs文件中。
此处使用<%- %>
是为了避免二次转义。
也可以使用<% include path/filename %>
进行引入
var ejs = require('ejs'),
users = ['geddy', 'neil', 'alex'];
// 仅对当前模板有效的设置
ejs.render('<?= users.join(" | "); ?>', {users: users}, {delimiter: '?'});
// => 'geddy | neil | alex'
// 全局有效的设置
ejs.delimiter = '$';
ejs.render('<$= users.join(" | "); $>', {users: users});
// => 'geddy | neil | alex'
ejs不支持像Jade那样的block布局,但是可以使用include的方式实现布局
<%- include('header') -%>
<h1>
Title
</h1>
<p>
My page
</p>
<%- include('footer') -%>
<h1 style="<%= style %>"></h1>
<ul>
<% for(var i in users){ %>
<li><%= users[i].username %>--<%= users[i].age %></li>
<% } %>
</ul>
<% if (names.length) { %>
<ul>
<% names.forEach(function(name){ %>
<li foo='<%= name + "'" %>'><%= name %></li>
<% }) %>
</ul>
<% } %>
<!-- 将所有条件判断代码放<% %>里面即可 -->
<% if(isLogin){ %>
<div class="user">
<a href="">Jack</a>
<a href="">退出</a>
</div>
<% }else{ %>
<div class="login">
<a href="">登录</a>
<a href="">注册</a>
</div>
<% } %>