EJS 嵌入式轻量级 JavaScript 模版引擎

发布于 2019-11-29 20:10:58 字数 6361 浏览 1430 评论 0

E 是 effective 的缩写,EJS 是一个嵌入式轻量级 JavaScript 模版引擎,让您通过简单易懂的 JavaScript 代码生成 HTML 标签,没有必须的操作流程,没有迭代和控制流程,这仅仅是一个 JavaScript 插件。

安装

$ npm install ejs

特点

  • Complies with the Express view system
  • Static caching of intermediate JavaScript
  • Unbuffered code for conditionals etc <% code %>
  • Escapes html by default with <%= code %>
  • Unescaped buffering with <%- code %>
  • Supports tag customization
  • Filter support for designer-friendly templates
  • Includes
  • Client-side support
  • Newline slurping with <% code -%> or <% -%> or <%= code -%> or <%- code -%>

简单示例

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

使用方法

ejs.compile(str, options);
// => Function

ejs.render(str, options);
// => str

可选参数

  • cache Compiled functions are cached, requires filename
  • filename Used by cache to key caches
  • scope Function execution context
  • debug Output generated function body
  • compileDebug When false no debug instrumentation is compiled
  • client Returns standalone compiled function
  • open Open tag, defaulting to “<%”
  • close Closing tag, defaulting to “%>”
    • All others are template-local variables

引入模版

Includes are relative to the template with the include statement,for example if you have “./views/users.ejs” and “./views/user/show.ejs”you would use <% include user/show %>. The included file(s) are literallyincluded into the template, no IO is performed after compilation, thuslocal variables are available to these included templates.

<ul>
  <% users.forEach(function(user){ %>
    <% include user/show %>
  <% }) %>
</ul>

一般插入公共模板,也就是引入文件,必须要设置 filename 选项才能启动 include 特性,不然 include 无从知晓所在目录。

自定义分隔符

Custom delimiters can also be applied globally:

var ejs = require('ejs');
ejs.open = '{{';
ejs.close = '}}';

Which would make the following a valid template:

<h1>{{= title }}</h1>

滤镜

EJS conditionally supports the concept of “filters”. A “filter chain”
is a designer friendly api for manipulating data, without writing JavaScript.

Filters can be applied by supplying the : modifier, so for example if we wish to take the array [{ name: 'tj' }, { name: 'mape' }, { name: 'guillermo' }] and output a list of names we can do this simply with filters:

Template:

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

Output:

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

Render call:

ejs.render(str, {
    users: [
      { name: 'tj' },
      { name: 'mape' },
      { name: 'guillermo' }
    ]
});

Or perhaps capitalize the first user’s name for display:

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

滤镜列表

Currently these filters are available:

  • 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’

添加滤镜

To add a filter simply add a method to the .filters object:

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

客户端支持

include ./ejs.js or ./ejs.min.js and require("ejs").compile(str).

<html>  
  <head>  
    <script src="../ejs.js"></script>  
    <script id="users" type="text/template">  
      <% if (names.length) { %>  
        <ul>  
          <% names.forEach(function(name){ %>  
            <li><%= name %></li>  
          <% }) %>  
        </ul>  
      <% } %>  
    </script>  
    <script>  
      onload = function(){  
        var users = document.getElementById('users').innerHTML;  
        var names = ['loki', 'tobi', 'jane'];  
        var html = ejs.render(users, { names: names });  
        document.body.innerHTML = html;  
      }  
    </script>  
  </head>  
  <body>  
  </body>  
</html>

模板

在CODE上查看代码片派生到我的代码片

<h1>Users</h1>
  
<% function user(user) { %>  
  <li><strong><%= user.name %></strong> is a <%= user.age %> year old <%= user.species %>.</li>  
<% } %>
  
<ul>  
  <% users.map(user) %>  
</ul>

EJS 支持编译模板。经过模板编译后就没有 IO 操作,会非常快,而且可以公用本地变量。下面例子 user/show 忽略 ejs 扩展名:

在CODE上查看代码片派生到我的代码片

<ul>  
  <% users.forEach(function(user){ %>  
    <% include user/show %>  
  <% }) %>  
</ul>

相关链接

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文