# @cryptkeeperzk/ejs 中文文档

规范地址：https://npmcn.com/package/%40cryptkeeperzk/ejs/

版本：3\.1\.9
npm 元数据更新时间：2023-08-24T16:33:12.429Z
中文译文更新时间：2026-11-11T02:22:07.177Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40cryptkeeperzk/ejs
原文对照：https://npmcn.com/package/%40cryptkeeperzk/ejs/?lang=original
项目主页：https://github.com/mde/ejs
源码仓库：https://github.com/mde/ejs

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：111 kB，36 个文件
- 模块格式：CommonJS
- TypeScript 类型：未声明
- Node.js 要求：\>=0\.10\.0
- 运行依赖：1 个
- 首次发布：2023-08-18T08:52:46.262Z
- 最新版本发布：2023-08-18T08:52:46.533Z
- 近 30 天下载量：61825（2026-10-11 至 2026-11-09，npm 官方下载统计）
- 已发布版本数：1（近 12 个月 0 个）

## 中文简介

嵌入的 JavaScript 模板

## 安装

```sh
npm install @cryptkeeperzk/ejs
```

也可以使用：`pnpm add @cryptkeeperzk/ejs`、`yarn add @cryptkeeperzk/ejs`、`bun add @cryptkeeperzk/ejs`

## README

# `@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](https://snyk.io/test/npm/ejs/badge.svg?style=flat)](https://snyk.io/test/npm/ejs)

## 警卫

安全专业人员在报告任何安全问题之前,请参考 [警卫](https://github.com/mde/ejs/blob/main/SECURITY.md) 在这个项目中,特别是以下内容:"EJS实际上是一个JavaScript runtime. 它的全部工作是执行JavaScript. 如果您运行 EJS 渲染方法,则不 自己检查输入,你对结果负责"

简言之, 不要提交包含此代码片段的“ 脆弱” :

```javascript
app.get('/', (req, res) => {
  res.render('index', req.query);
});
```

## 安装

```bash
$ npm install ejs
```

## 特征

-   控制流量 `<% %>`
-   已退出输出 `<%= %>` (可配置的逃避函数)
-   未脱逃的原始输出 `<%- %>`
-   新建线条模式(“ 新建线 slurping ”) `-%>` 结束标记
-   用于控制流的白空- 三角模式( 全部为白空) `<%_ _%>`
-   自定义分隔符( 如 ). `[? ?]` 改为 `<% %>`(中文(简体) )
-   包括
-   客户端支持
-   静态缓存中间 JavaScript
-   静态缓存模板
-   遵守 [快递](http://expressjs.com/) 查看系统

## 示例

```ejs
<% if (user) { %>
  <h2><%= user.name %></h2>
<% } %>
```

尝试在线 EJS : [https://ionicabizau.github.io/ejs-playground/ 互联网档案馆的存檔,存档日期2011-12-21](https://ionicabizau.github.io/ejs-playground/)。 。 。 .

## 基本用途

```javascript
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 运行时 (单位:千美元)[(单位:千美元)](https://github.com/mde/ejs/releases/latest)) (中文(简体) ).
-   `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` 是包含的内容.

这个项目使用 [联合来文文件](http://usejsdoc.org/)。对于完全公开的 API 文档,复制存储器并运行 `jake doc`这将运行 JSDoc 附带适当的选项并输出文档到 `out/`。如果需要的话 公有和私有 API 文件,运行 `jake devdoc` 换句话说.

### 标记

-   `<%` “ 脚本” 标签, 用于控制流量, 无输出
-   `<%_` 白地滑动 脚本标记, 在它之前剥去所有空白
-   `<%=` 将值输出到模板( 已退出)
-   `<%-` 将未脱逃值输出到模板
-   `<%#` 注释标记, 没有执行, 没有输出
-   `<%%` 输出正文 “ Q ”
-   `%%>` 输出正文 “ Q ”
-   `%>` 平端标签
-   `-%>` Trim- mode ('newline slrp') 标记, 沿着新线修饰
-   `_%>` “ 白空间 slurping” 结束标记, 之后删除所有白空间

完整的语法文档请参见: [文件/语法.md](https://github.com/mde/ejs/blob/master/docs/syntax.md)。 。 。 .

### 包括

包括必须是绝对路径,或者如果不是,则假定为 相对模板 `include` 电话 举例来说,如果你是 包括 `./views/user/show.ejs` 从 `./views/users.ejs` 你会 使用情况 `<%- include('user/show') %>`。 。 。 .

您必须指定 `filename` 选项 `include` 调用,除非您正在使用 `renderFile()`。 。 。 .

您可能想要使用原始输出标记( Name`<%-`) 与您的内容避免 双面覆盖 HTML 输出.

```ejs
<ul>
  <% users.forEach(function(user){ %>
    <%- include('user/show', {user: user}) %>
  <% }); %>
</ul>
```

包含在运行时插入,这样您就可以为路径使用变量 `include` 调用( 例如 `<%- include(somePath) %>`) (中文(简体) ). 您的变量 您所有包含的顶级数据对象都可以使用, 但本地变量 需要通过下来.

注:包括预处理指令(`<% include user/show %>`已经 在 v3. 0+ 中不支持.

## 自定义分隔符

自定义的分界符可以在每分层的基础上应用,也可以在全球应用:

```javascript
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` 库 :

```javascript
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 .

```javascript
let ejs = require('ejs');
let myFileLoad = function (filePath) {
  return 'myFileLoad: ' + fs.readFileSync(filePath);
};

ejs.fileLoader = myFileLoad;
```

使用此功能,您可以在读取前预先处理模板.

### 布局

EJS 不具体支持块, 但布局可以通过 包括页眉和页脚,例如:

```ejs
<%- include('header') -%>
<h1>
  Title
</h1>
<p>
  My page
</p>
<%- include('footer') -%>
```

## 客户端支持

转到 [最近发布](https://github.com/mde/ejs/releases/latest)下载 `./ejs.js` 或者说 `./ejs.min.js`,也可以自己通过克隆来编译 存储和运行 `jake build` (或 `$(npm bin)/jake build` 如果贾克是 未在全球安装).

在您的页面中包含这些文件之一,以及 `ejs` 应在全球范围内提供.

### 示例

```html
<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.  出于同样的原因, `include`s不起作用,除非您使用 `include callback`。这里有一个例子:

```javascript
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
```

见 [示例文件夹](https://github.com/mde/ejs/tree/master/examples) 更多细节.

## 国 际

具有全地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 版本 .

以下是使用的一些例子:

```shell
$ 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数据进行渲染.

斯丁语 :

```shell
$ ./test/fixtures/user_data.json | ejs ./test/fixtures/user.ejs
$ ejs ./test/fixtures/user.ejs < test/fixtures/user_data.json
```

数据文件 :

```shell
$ ejs ./test/fixtures/user.ejs -f ./user_data.json
```

命令行选项( 必须是URI 编码) :

```shell
./bin/cli.js -i %7B%22name%22%3A%20%22foo%22%7D ./test/fixtures/user.ejs
```

或者,在引用结尾直接传递价值:

```shell
./bin/cli.js -m $ ./test/fixtures/user.ejs name=foo
```

### 产出

CLI 默认发送输出到 stdout, 但您可以使用 `-o` 或者说 `--output-file` 标记以指定发送输出到的目标文件.

## 以语法突出显示的 IDE 集成

校对:Soup _数字脑_

## 相关项目

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

-   TJ的执行,本库v1: [https://github.com/tj/ejs (中文(简体) )](https://github.com/tj/ejs)
-   谷歌代码上的EJS嵌入式JavaScript框架: [https://code.google.com/p/embedededjavascript/ (中文(简体) )](https://code.google.com/p/embeddedjavascript/)
-   萨姆·斯蒂芬森"鲁比"执行: [https://rubygems.org/gems/ejs (中文(简体) )](https://rubygems.org/gems/ejs)
-   Erubis, 也运行 JavaScript 的ERB 执行 : [http://www.kuwata-lab.com/erubis/uses-guide.04.html#lang-javascript](http://www.kuwata-lab.com/erubis/users-guide.04.html#lang-javascript)
-   数字脑 EJS 语言支持 : [https://github.com/ Digitalbrainstem/ejs-语法](https://github.com/Digitalbrainstem/ejs-grammar)

## 许可证

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

* * *

EJS 嵌入式 JavaScript 模板版权 2112 [mde@fleegix.org (英语)](mailto:mde@fleegix.org)。 。 。 .

## 常见问题

### @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 和提交记录判断。

