ejs 使用文档

安装

1
$ npm install ejs

特性

  • <% %> 用于控制流
  • <%= %> 用于转义的输出
  • <%- %> 用于非转义的输出
  • -%> 结束标签用于换行移除模式
  • 带有 <%_ _%> 的控制流使用空白字符移除模式
  • 自定义分隔符 (例如,使用 ‘‘ 代替 ‘<% %>’)
  • 包含
  • 客户端支持
  • 中介JavaScript的静态缓存
  • 模板的静态缓存
  • 与 Express 视图系统兼容

示例

1
2
3
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>

用法

1
2
3
4
5
6
var template = ejs.compile(str, options);
template(data);
// => 渲染 HTML 字符串

ejs.render(str, data, options);
// => 渲染 HTML 字符串

你也可以使用快捷方式 ejs.render(dataAndOptions); ,其中你可以通过一个对象来传递任何东西。在这种情况下,你需要以一个装有所有需要传递对象的本地变量结束。

选项

  • cache 编译过的函数会被缓存,需要 filename
  • filename 被 cache 用做缓存的键,用于包含
  • scope 函数执行的上下文
  • debug 输出生成的函数体
  • compileDebug 如果为 false ,不会编译调试用的工具
  • client 返回独立的编译后的函数
  • open 开始标签,默认为”<%”
  • close 结束标签,默认为”%>”
  • _with 是否使用 with() {} 结构。如果为 false 则局部数据会储存在 locals 对象中。
  • rmWhitespace 移除所有可以安全移除的空白字符,包含前导和尾后的空白字符。同时会为所有scriptlet标签开启 -%> 换行截断的更加安全的模式。(它不会在一行之中去除标签的换行)。

标签

  • <% ‘Scriptlet’ 标签, 用于控制流,没有输出
  • <%= 向模板输出值(带有转义)
  • <%- 向模板输出没有转义的值
  • <%# 注释标签,不执行,也没有输出
  • <%% 输出字面的 ‘<%’
  • %> 普通的结束标签
  • -%> Trim-mode (‘newline slurp’) 标签, 移除随后的换行符

包含

包含要么是绝对路径,或者如果不是的话,被视为相对于调用 include 的模板的路径(需要 filename 选项)。 例如,你在 ./views/users.ejs 中包含 ./views/user/show.ejs ,你应该使用 <%- include(‘user/show’) %> 。

你可能会用到原始输出标签( <%- )避免二次转义HTML输出。

1
2
3
4
5
<ul>
<% users.forEach(function(user){ %>
<%- include('user/show', {user: user}) %>
<% }); %>
</ul>

包含的内容在运行时插入, 所以你可以在 include 调用中使用变量作为路径(例如 <%- include(somePath) %> )。在你顶级数据对象中的变量都可以用于所有的包含,而局部变量需要传递进来。

注意:仍然支持包含预处理指令( <% include user/show %> )。

过滤器

技术条件支持的概念“过滤器”。“过滤器链”是操纵数据设计师友好的API,无需编写JavaScript。

过滤器支持链式,例如,如果我们想把数组[{ name: ‘tj’ }, { name: ‘mape’ }, { name: ‘guillermo’ }]输出成名单,我们可以这样使用过滤器:

模板:

1
<p><%=: users | map:'name' | join %></p>

输出:

1
<p>Tj, Mape, Guillermo</p>

渲染代码:

1
2
3
4
5
6
7
ejs.render(str, {
users: [
{ name: 'tj' },
{ name: 'mape' },
{ name: 'guillermo' }
]
});

或者可以这样输出用户列表的第一个名字:

1
<p><%=: users | first | capitalize %></p>

过滤器列表

  • first
  • last
  • capitalize
  • downcase
  • upcase
  • sort
  • sort_by:’prop’
  • size
  • length
  • plus:n
  • minus:n
  • times:n
  • divided_by:n
  • join:’val’
  • truncate:n
  • truncate_words:n
  • replace:pattern,substitution
  • prepend:val
  • append:val
  • map:’prop’
  • reverse
  • get:’prop’

添加过滤器

通过给.filters对象添加属性方法来添加过滤器:

1
2
3
ejs.filters.last = function(obj) {
return obj[obj.length - 1];
};

自定义分隔符

自定义分隔符可以以模板为单位应用,或者全局:

1
2
3
4
5
6
7
8
9
10
11
12
var ejs = require('ejs'),
users = ['geddy', 'neil', 'alex'];

// Just one template
ejs.render('{{= users.join(" | "); }}', {users: users}, {open : '{{', close: '}}'});
// => 'geddy | neil | alex'

// Or globally
ejs.open = '{{';
ejs.close = '}}';
ejs.render('{{= users.join(" | "); }}', {users: users});
// => 'geddy | neil | alex'

缓存

EJS 自带了一个基本的运行时缓存,用于缓存渲染模板的中介JavaScript函数。使用 Node 的 lru-cache 库来添加LRU缓存十分简单:

1
2
3
var ejs = require('ejs')
, LRU = require('lru-cache');
ejs.cache = LRU(100); // LRU cache with 100-item limit

如果你想清除ejs的缓存,调用 ejs.clearCache 。如果你需要以一个不同的限额来使用LRU,只需要将 ejs.cache 重新设置为一个LRU的新实例。

布局

EJS 不会特别地支持区块,但是可以采用包含头部和尾部的方法来实现局部,像这样:

1
2
3
4
5
6
7
8
<%- include('header') -%>
<h1>
Title
</h1>
<p>
My page
</p>
<%- include('footer') -%>

客户端支持

访问 最新发布,下载

./ejs.js 或者 ./ejs.min.js 。

选择其一包含到你的页面中,并且使用 ejs.render(str) 。

相关项目