纯 JavaScript
我们热爱 JavaScript,他是一门友好的编程语言。所有模板语言都要成长为图灵完备的语言,也就是说要增加一个中间层。何必呢,直接用 JS 吧!
“E” 代表什么?可以表示 “可嵌入(Embedded)”,也可以是“高效(Effective)”、“优雅(Elegant)”或者是“简单(Easy)”。EJS 是一套简单的模板语言,帮你利用普通的 JavaScript 代码生成 HTML 页面。EJS 没有如何组织内容的教条;也没有再造一套迭代和控制流语法;有的只是普通的 JavaScript 代码而已。
我们热爱 JavaScript,他是一门友好的编程语言。所有模板语言都要成长为图灵完备的语言,也就是说要增加一个中间层。何必呢,直接用 JS 吧!
无需浪费时间钻研那些所谓“优雅”的神秘语法,也不用研究数据究竟如何能够被正确处理。
EJS 支持直接在标签内书写简单、直白的 JavaScript 代码。只需让 JavaScript 输出你所需要的 HTML ,完成工作很轻松!
我们都知道 V8 以及类似 JavaScript 引擎的速度有多快。EJS 能够缓存 JS 函数的中间代码,从而提升执行速度。
调试 EJS 错误(error)很容易:所有错误都是普通的 JavaScript 异常,并且还能输出异常发生的位置。
EJS 背后是一个活跃用户组成的大规模社区,能够为 EJS 的演进提供大力支持。我们同时很高兴回答你的问题或提供帮助。
Before reporting any security issues, please reference the SECURITY.md for the project, partcularly the following:
If you give end-users unfettered access to the EJS render method, you are using EJS in an inherently un-secure way. Please do not report security issues that stem from doing that.
EJS is effectively a JavaScript runtime. Its entire job is to execute JavaScript. If you run the EJS render method without checking the inputs yourself, you are responsible for the results.
In short, DO NOT submit 'vulnerabilities' that include this snippet of code:
app.get('/', (req, res) => {
res.render('index', req.query);
});
利用 NPM 安装 EJS 很简单。
$ npm install ejs
将模板字符串和一些数据作为参数传递给 EJS,Duang,HTML 出来了。
let ejs = require('ejs');
let people = ['geddy', 'neil', 'alex'];
let html = ejs.render('<%= people.join(", "); %>', {people: people});
Feed it a template file and a data file, and specify an output file.
ejs ./template_file.ejs -f data_file.json -o ./output.html
从这里下载 最新的浏览器版本,然后引入页面即可。
<script src="ejs.js"></script>
<script>
let people = ['geddy', 'neil', 'alex'];
let html = ejs.render('<%= people.join(", "); %>', {people: people});
</script>
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
let template = ejs.compile(str, options);
template(data);
// => 输出渲染后的 HTML 字符串
ejs.render(str, data, options);
// => 输出渲染后的 HTML 字符串
ejs.renderFile(filename, data, options, function(err, str){
// str => 输出渲染后的 HTML 字符串
});
cache
缓存编译后的函数,需要指定 filename
filename
被 cache
参数用做键值,同时也用于 include 语句root
设置项目的根目录,用于 include 指令中对绝对路径(例如 /file.ejs)的解析。可以是包含多个目录的数组,用于在多个目录目下尝试解析。views
包含多个路径的数组,用于 include 指令中对相对路径的解析。context
函数执行时的上下文环境compileDebug
当值为 false
时不编译调试语句client
返回独立的编译后的函数delimiter
标签内所用的分隔符,默认为 '%'openDelimiter
作为标签开始的字符,默认为 '<'closeDelimiter
作为标签结束的字符,默认为 '>'debug
将生成的函数体输出strict
当设置为 `true` 时,生成的函数默认为 strict 模式_with
是否使用 with() {}
结构。如果值为 false
,所有局部数据将存储在 locals
对象上。 (Implies `--strict`)localsName
设置对象名称,在不使用 with
时,用该对象存储本地变量。默认值为 locals
rmWhitespace
删除所有可安全删除的空白符号,包括前导和尾部空白符号。它还会对所有 -%>
脚本标签赋予一个更安全的行清理功能(不会对行内的标签删除换行符)。escape
与 <%=
结构一起使用的转义函数。用于渲染以及生成客户端函数时调用提供 .toString()
函数。(默认转义 XML)。outputFunctionName
设置为代表函数名的字符串(例如 'echo'
或 'print'
), 用于输出脚本标签之间应该输出的内容。async
当值为 true
时,EJS 将使用异步函数进行渲染。(依赖于 JS 运行环境对 async/await 是否支持)。<%
'脚本' 标签,用于流程控制,无输出。<%_
删除其前面的空格符<%=
输出数据到模板(输出是转义 HTML 标签)<%-
输出非转义的数据到模板<%#
注释标签,不执行、不输出内容<%%
输出字符串 '<%'%>
一般结束标签-%>
删除紧随其后的换行符_%>
将结束标签后面的空格符删除通过 include
指令将相对于模板路径中的模板片段包含进来。(需要提供 'filename' 参数。) 例如,如果存在 "./views/users.ejs" 和 "./views/user/show.ejs" 两个模板文件,你可以通过 <%- include('user/show'); %>
代码包含后者。
你可能需要能够输出原始内容的标签 (<%-
) 用于 include 指令,避免对输出的 HTML 代码做转义处理。
<ul>
<% users.forEach(function(user){ %>
<%- include('user/show', {user: user}); %>
<% }); %>
</ul>
EJS 附带完整的命令行界面。命令行参数与 JavaScript 函数所能接收的参数类似:
cache
缓存已编译的函数,需要设置文件名 filename
-o / --output-file FILE
将渲染后的输出写入 FILE 文件中,而不是输出到 stdout。-f / --data-file FILE
必须是 JSON 格式。解析来自 FILE 的数据用于渲染。-i / --data-input STRING
必须是经过 URI 编码的 JSON 格式。解析来自 STRING 的数据用于渲染。-m / --delimiter CHARACTER
使用 CHARACTER 与带角括号一同作为标签的开始或结束符(默认为 %)。-p / --open-delimiter CHARACTER
使用 CHARACTER 替代左带角括号作为标签的开始符。-c / --close-delimiter CHARACTER
使用 CHARACTER 替代右带角括号作为标签的结束符。-s / --strict
设置为 `true` 时,生成的函数为 strict 模式-n / --no-with
使用 'locals' 对象存储变量,来代替 `with`(意味着同时具有 --strict 参数的效力)。-l / --locals-name
当不使用 `with` 时,用指定的对象来存储本地变量。-w / --rm-whitespace
删除所有可以安全删除的空白符号,包括前导和尾部空白符号。-d / --debug
输出生成的函数体-h / --help
显示帮助信息。-V/v / --version
显示 EJS 的版本。用法示例:
$ ejs -p [ -c ] ./template_file.ejs -o ./output.html
$ ejs ./test/fixtures/user.ejs name=Lerxst
$ ejs -n -l _ ./some_template.ejs -f ./data_file.json
可针对单个模板或全局使用自定义分隔符:
let 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 附带了一个基本的进程内缓存,用于缓在渲染模板过程中所生成的临时 JavaScript 函数。 通过 Node 的 `lru-cache` 库可以很容易地加入 LRU 缓存:
let ejs = require('ejs'),
LRU = require('lru-cache');
ejs.cache = LRU(100); // 具有 100 条内容限制的 LRU 缓存
如果要清除 EJS 缓存,调用 ejs.clearCache
即可。如果你正在使用的是
LRU 缓存并且需要设置不同的限额,则只需要将 `ejs.cache` 重置为
一个新的 LRU 实例即可。
默认的文件加载器是 fs.readFileSync
,如果你想要的自定义它,
设置ejs.fileLoader
即可。
let ejs = require('ejs');
let myFileLoader = function (filePath) {
return 'myFileLoader: ' + fs.readFileSync(filePath);
};
ejs.fileLoader = myFileLoader;
使用此功能,您可以在读取模板之前对其进行预处理。
EJS 并未对块(blocks)提供专门的支持,但是可以通过 包含页眉和页脚来实现布局,如下所示:
<%- include('header'); -%>
<h1>
Title
</h1>
<p>
My page
</p>
<%- include('footer'); -%>
从latest release 链接下载
./ejs.js
或 ./ejs.min.js
文件。或者,你可以 clone 这个仓库并
通过执行 jake build
自己编译(或者执行 $(npm bin)/jake build
,如果 jake
不是安装在全局环境的话)。
在页面中包含上面的任意一个文件,然后 ejs
就全局可用了
<div id="output"></div>
<script src="ejs.min.js"></script>
<script>
let people = ['geddy', 'neil', 'alex'],
html = ejs.render('<%= people.join(", "); %>', {people: people});
// With jQuery:
$('#output').html(html);
// Vanilla JS:
document.getElementById('output').innerHTML = html;
</script>
大多数情况下,EJS 将会按照我们的预期运行; 但是, 仍然需要注意:
let str = "Hello <%= include('file', {person: 'John'}); %>",
fn = ejs.compile(str, {client: true});
fn(data, null, function(path, d){ // include callback
// path -> 'file'
// d -> {person: 'John'}
// Put your code here
// Return the contents of file as a string
}); // returns rendered string
此 GitHub Wiki 页面 介绍了几种向 Express 传递 EJS 参数的方式。
Ask questions about specific problems you have faced, including details about what exactly you are trying to do. Make sure you tag your question with ejs
. You can also read through existing ejs questions.
The issue tracker is the preferred channel for bug reports, features requests and submitting pull requests.
EJS is licensed under the Apache License, version 2.0. Information can found here: http://www.apache.org/licenses/.