@cryptkeeperzk/ejs数字 :
NOTE: Since ejs.js is being used through Snark.js, which is used inside CryptKeeper ZK Browser Extension.
We faced this error:
`
Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval'
is not an allowed source of script in the following Content Security Policy directive:
"script-src 'self' 'wasm-unsafe-eval' 'inline-speculation-rules' http://localhost:* http://127.0.0.1:*".
`
Therefore, according to this issue: https://github.com/mde/ejs/issues/468
We forked the main ejs to adjust this line with this suggested solution: https://github.com/facebook/regenerator/issues/336#issuecomment-355832435
嵌入的 JavaScript 模板

警卫
安全专业人员在报告任何安全问题之前,请参考 警卫 在这个项目中,特别是以下内容:"EJS实际上是一个JavaScript runtime. 它的全部工作是执行JavaScript. 如果您运行 EJS 渲染方法,则不 自己检查输入,你对结果负责"
简言之, 不要提交包含此代码片段的“ 脆弱” :
app.get('/', (req, res) => {
res.render('index', req.query);
});
安装
$ npm install ejs
特征
- 控制流量
<% %> - 已退出输出
<%= %>(可配置的逃避函数) - 未脱逃的原始输出
<%- %> - 新建线条模式(“ 新建线 slurping ”)
-%>结束标记 - 用于控制流的白空- 三角模式( 全部为白空)
<%_ _%> - 自定义分隔符( 如 ).
[? ?]改为<% %>(中文(简体) ) - 包括
- 客户端支持
- 静态缓存中间 JavaScript
- 静态缓存模板
- 遵守 快递 查看系统
示例
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
尝试在线 EJS : https://ionicabizau.github.io/ejs-playground/ 互联网档案馆的存檔,存档日期2011-12-21。 。 。 .
基本用途
let template = ejs.compile(str, options);
template(data);
// => Rendered HTML string
ejs.render(str, data, options);
// => Rendered HTML string
ejs.renderFile(filename, data, options, function(err, str){
// str => Rendered HTML string
});
也可使用 ejs.render(dataAndOptions); 你通过的地方
在一个单一物体中的一切。 这样的话,你最后会有本地变量
所有通过的选择。 但是,要知道,如果我们
添加一个与您的数据对象属性名称相同的选项.
因此,我们不建议使用这一捷径.
重要
你不应该让最终用户不受限制地使用 EJS 渲染方法,如果你这样做的话,你使用 EJS 的方式本身就不安全.
选项
cache编译的函数被缓存, 需要filenamefilename正在提供的文件名称 。 无需,如果您 正在使用中renderFile()用于cache到密钥缓存,并用于包含.root设置包含绝对路径的模板根( 如 / file. ejs) . 可以被数组试图从多个目录中解析包含 .views解析时使用的一系列路径包括相对路径.context函数执行背景compileDebug何时false没有编译调试仪器client何时true,编译一个可以渲染的函数 在浏览器中不需要加载 EJS 运行时 (单位:千美元)(单位:千美元)) (中文(简体) ).delimiter默认用于内置分隔符的字符“% ”openDelimiter用于打开分隔符的字符,默认为 “ < ”closeDelimiter用于关闭分隔符的字符,默认为“ > ”debug产出生成函数体strict设定为true,生成的函数为严格模式_with是否使用with() {}构造 若为false然后将本地人存放在locals对象。 设定为false严格模式.destructuredLocals总是从 本地对象,即使在严格模式下也可以使用.localsName不使用时用于存储本地变量的对象的名称with默认为localsrmWhitespace删除所有安全移动的空白, 包括引导 沿着白色空间走 这还有助于提供更安全的版本-%>线条 对所有脚本标签进行 slurping( 它不会在其中剥去新标签行) 中间的一行).escape用于<%=构造。 没错 用于渲染.toString()ed 在生成客户端功能中. (默认逃出XML).outputFunctionName设定为要打印的函数的字符串( 如“ echo ” 或“ print ” ) 在脚本标签中输出.async何时true,EJS将使用同位素函数来渲染. (抚养人) 等待JS运行时间的支持.includer自定义处理 EJS 的函数包括、接收(originalPath, parsedPath)参数,其中originalPath是包含的路径parsedPath这是 已解决路径。 应返回对象{ filename, template }, (中文(简体) ), 您只能返回一个属性, 其中filename是最后解析路径,并且template是包含的内容.
这个项目使用 联合来文文件。对于完全公开的 API
文档,复制存储器并运行 jake doc这将运行 JSDoc
附带适当的选项并输出文档到 out/。如果需要的话
公有和私有 API 文件,运行 jake devdoc 换句话说.
标记
<%“ 脚本” 标签, 用于控制流量, 无输出<%_白地滑动 脚本标记, 在它之前剥去所有空白<%=将值输出到模板( 已退出)<%-将未脱逃值输出到模板<%#注释标记, 没有执行, 没有输出<%%输出正文 “ Q ”%%>输出正文 “ Q ”%>平端标签-%>Trim- mode ('newline slrp') 标记, 沿着新线修饰_%>“ 白空间 slurping” 结束标记, 之后删除所有白空间
完整的语法文档请参见: 文件/语法.md。 。 。 .
包括
包括必须是绝对路径,或者如果不是,则假定为
相对模板 include 电话 举例来说,如果你是
包括 ./views/user/show.ejs 从 ./views/users.ejs 你会
使用情况 <%- include('user/show') %>。 。 。 .
您必须指定 filename 选项 include
调用,除非您正在使用 renderFile()。 。 。 .
您可能想要使用原始输出标记( Name<%-) 与您的内容避免
双面覆盖 HTML 输出.
<ul>
<% users.forEach(function(user){ %>
<%- include('user/show', {user: user}) %>
<% }); %>
</ul>
包含在运行时插入,这样您就可以为路径使用变量
include 调用( 例如 <%- include(somePath) %>) (中文(简体) ). 您的变量
您所有包含的顶级数据对象都可以使用, 但本地变量
需要通过下来.
注:包括预处理指令(<% include user/show %>已经
在 v3. 0+ 中不支持.
自定义分隔符
自定义的分界符可以在每分层的基础上应用,也可以在全球应用:
let ejs = require('ejs'),
users = ['geddy', 'neil', 'alex'];
// Just one template
ejs.render('<p>[?= users.join(" | "); ?]</p>', {users: users}, {delimiter: '?', openDelimiter: '[', closeDelimiter: ']'});
// => '<p>geddy | neil | alex</p>'
// Or globally
ejs.delimiter = '?';
ejs.openDelimiter = '[';
ejs.closeDelimiter = ']';
ejs.render('<p>[?= users.join(" | "); ?]</p>', {users: users});
// => '<p>geddy | neil | alex</p>'
缓存
EJS 有用于缓存中间 JavaScript 的基本流程中的舰只
用于渲染模板的函数。 很容易插入LRU缓冲
节点的 lru-cache 库 :
let ejs = require('ejs'),
LRU = require('lru-cache');
ejs.cache = LRU(100); // LRU cache with 100-item limit
如果你想清除 EJS 缓存,请打电话 ejs.clearCache。如果你使用
LRU 缓存需要不同的限制, 简单的重置 ejs.cache 新实例
(原始内容存档于2017-09-21). LRU.
自定义文件加载器
默认文件加载器是 fs.readFileSync,如果想要自定义,可以设置 ejs.fileLoader .
let ejs = require('ejs');
let myFileLoad = function (filePath) {
return 'myFileLoad: ' + fs.readFileSync(filePath);
};
ejs.fileLoader = myFileLoad;
使用此功能,您可以在读取前预先处理模板.
布局
EJS 不具体支持块, 但布局可以通过 包括页眉和页脚,例如:
<%- include('header') -%>
<h1>
Title
</h1>
<p>
My page
</p>
<%- include('footer') -%>
客户端支持
转到 最近发布下载
./ejs.js 或者说 ./ejs.min.js,也可以自己通过克隆来编译
存储和运行 jake build (或 $(npm bin)/jake build 如果贾克是
未在全球安装).
在您的页面中包含这些文件之一,以及 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.renderFile()没用的. - 出于同样的原因,
includes不起作用,除非您使用include callback。这里有一个例子:
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
见 示例文件夹 更多细节.
国 际
具有全地CLI的EJS舰. 选项类似于 JavaScript 代码中所用的选项 :
-o / --output-file FILE将输出写入 FILE 而不是 stdout .-f / --data-file FILE一定是JSON格式化的。 使用 FILE 的解析输入作为渲染数据 .-i / --data-input STRING一定是JSON格式化和URI编码的 使用 STRING 的解析输入作为渲染数据 .-m / --delimiter CHARACTER打开/ 关闭时使用带有角括号的 CHARACTER( 默认为%) .-p / --open-delimiter CHARACTER使用 CHARACTER 而不是左角括号打开 .-c / --close-delimiter CHARACTER使用 CHARACTER 而不是右角括号来关闭 .-s / --strict设定为true,生成的函数为严格模式-n / --no-with将“ 本地” 对象用于 vars 而不是使用with(缩写为-严格).-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
数据输入
可以通过多种方式通过CLI数据进行渲染.
斯丁语 :
$ ./test/fixtures/user_data.json | ejs ./test/fixtures/user.ejs
$ ejs ./test/fixtures/user.ejs < test/fixtures/user_data.json
数据文件 :
$ ejs ./test/fixtures/user.ejs -f ./user_data.json
命令行选项( 必须是URI 编码) :
./bin/cli.js -i %7B%22name%22%3A%20%22foo%22%7D ./test/fixtures/user.ejs
或者,在引用结尾直接传递价值:
./bin/cli.js -m $ ./test/fixtures/user.ejs name=foo
产出
CLI 默认发送输出到 stdout, 但您可以使用 -o 或者说 --output-file
标记以指定发送输出到的目标文件.
以语法突出显示的 IDE 集成
校对:Soup 数字脑
相关项目
执行环境司法战略的若干方面:
- TJ的执行,本库v1: https://github.com/tj/ejs (中文(简体) )
- 谷歌代码上的EJS嵌入式JavaScript框架: https://code.google.com/p/embedededjavascript/ (中文(简体) )
- 萨姆·斯蒂芬森"鲁比"执行: https://rubygems.org/gems/ejs (中文(简体) )
- Erubis, 也运行 JavaScript 的ERB 执行 : http://www.kuwata-lab.com/erubis/uses-guide.04.html#lang-javascript
- 数字脑 EJS 语言支持 : https://github.com/ Digitalbrainstem/ejs-语法
许可证
根据Apache 许可证颁发的许可证,2.0版本 (单位:千美元)http://www.apache.org/licenses/LICENSE-2.0 (中文(简体) )(中文(简体) )
EJS 嵌入式 JavaScript 模板版权 2112 [email protected] (英语)。 。 。 .