@cryptkeeperzk/ejs

中文文档
3.1.9发布于 2023/08/18Apache-2.0CommonJS近 30 天下载 6.2万

嵌入的 JavaScript 模板

中文使用文档
文档目录22 节
  1. 警卫
  2. 安装
  3. 特征
  4. 示例
  5. 基本用途
  6. 重要
  7. 选项
  8. 标记
  9. 包括
  10. 自定义分隔符
  11. 缓存
  12. 自定义文件加载器
  13. 布局
  14. 客户端支持
  15. 示例
  16. 洞穴
  17. 国 际
  18. 数据输入
  19. 产出
  20. 以语法突出显示的 IDE 集成
  21. 相关项目
  22. 许可证

@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 模板
Known Vulnerabilities

警卫

安全专业人员在报告任何安全问题之前,请参考 警卫 在这个项目中,特别是以下内容:"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 编译的函数被缓存, 需要 filename
  • filename 正在提供的文件名称 。 无需,如果您 正在使用中 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 默认为 locals
  • rmWhitespace 删除所有安全移动的空白, 包括引导 沿着白色空间走 这还有助于提供更安全的版本 -%> 线条 对所有脚本标签进行 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>

洞穴

大部分司法服务项目将按预期进行;然而,有一些事情需要注意:

  1. 显然,既然你无法进入文件系统, ejs.renderFile() 没用的.
  2. 出于同样的原因, 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 数字脑

执行环境司法战略的若干方面:

许可证

根据Apache 许可证颁发的许可证,2.0版本 (单位:千美元)http://www.apache.org/licenses/LICENSE-2.0 (中文(简体) )(中文(简体) )


EJS 嵌入式 JavaScript 模板版权 2112 [email protected] (英语)。 。 。 .

版本与发布记录

@cryptkeeperzk/ejs 共发布 1 个版本,首次发布于 2023/08/18;过去 12 个月发布了 0 个版本。

版本发布日期距今
3.1.9latest2023/08/183 年前

关于 @cryptkeeperzk/ejs 的常见问题

@cryptkeeperzk/ejs 是什么?

嵌入的 JavaScript 模板

如何安装 @cryptkeeperzk/ejs?

在项目目录运行 npm install @cryptkeeperzk/ejs,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 ejs,可以用 npx ejs 直接运行。

@cryptkeeperzk/ejs 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/cryptkeeperzk__ejs 是否存在。

@cryptkeeperzk/ejs 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@cryptkeeperzk/ejs 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=0.10.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@cryptkeeperzk/ejs 可以商用吗?

@cryptkeeperzk/ejs 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@cryptkeeperzk/ejs 的下载量有多少?

根据 npm 官方下载统计,@cryptkeeperzk/ejs 在 2026/10/11 – 2026/11/09 这 30 天内被下载 61,825 次,日均约 2,061 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cryptkeeperzk/ejs 还在维护吗?

最新版本 3.1.9 发布于 2023/08/18(3 年前);至今共发布 1 个版本,其中过去 12 个月发布了 0 个;首次发布于 2023/08/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。