概述
What is the "E" for? "Embedded?" Could be. How about "Effective," "Elegant," or just "Easy"? EJS is a simple templating language that lets you generate HTML markup with plain JavaScript. No religiousness about how to organize things. No reinvention of iteration and control-flow. It's just plain JavaScript. 简言之,
EJS
就是高效的可嵌入的JavaScript
模版引擎,用在从JSON
对象数据中生成HTML
字符串,即是HTML = Template + Data
。
const ejs = require('ejs');
const templateEngines = ['jade', 'ejs'];
const template = '
<ul>
<% templateEngines.forEach((engine) => { %>
<li>
<span><%= engine %></span>
</li>
<% }) %>
</ul>
';
const html = ejs.render(template, {templateEngines});
标签含义
<%
:'脚本' 标签,用于流程控制,无输出。<%_
:删除其前面的空格符<%=
:输出数据到模板(输出是转义 HTML 标签)<%-
:输出非转义的数据到模板<%#
:注释标签,不执行、不输出内容<%%
:输出字符串 '<%'%>
:一般结束标签-%>
:删除紧随其后的换行符_%>
:将结束标签后面的空格符删除
核心概念
EJS
的思想就是Template + Data => HTML
,也就是字符串 + 数据 => 目标字符串
。EJS
是字符串模版引擎,生成的也是字符串。因此其既可在服务端使用,也可浏览器端使用。EJS
比较重要的概念主要有四个Template
、Data
、complie
、render
。
Template
也就是模版,实质上就是字符串。
<% if (user) { %>
<p><%= user.name %></p>
<% } %>
Data
也就是数据,模版包括可变部分和固定部分,其中可变部分就是通过Data
控制的。
<ul>
<% templateEngines.forEach((engine) => { %>
<li>
<span><%= engine %></span>
</li>
<% }) %>
</ul>
complie
也就是编译函数,将Template
和option
配置参数转化为一个函数,往这个函数中注入数据,生成目标字符串。
const ejs = require('ejs');
const template = ejs.complie(template, option);
template(data); // 生成目标字符串
options
配置参数:
cache
缓存编译后的函数,需要指定filename
filename
被cache
参数用做键值,同时也用于include
语句context
函数执行时的上下文环境compileDebug
当值为false
时不编译调试语句client
返回独立的编译后的函数delimiter
放在角括号中的字符,用于标记标签的开与闭debug
将生成的函数体输出_with
是否使用with() {}
结构。如果值为false
,所有局部数据将存储locals
对象上。localsName
如果不使用with
,localsName
将作为存储局部变量的对象的名称。默认名称是 localsrmWhitespace
删除所有可安全删除的空白字符,包括开始与结尾处的空格。对于所有标签来说,它提供了一个更安全版本的-%>
标签(在一行的中间并不会剔除标签后面的换行符)。escape
为<%=
结构设置对应的转义escape
函数。它被用于输出结果以及在生成的客户端函数中通过.toString()
输出。(默认转义XML
)。outputFunctionName
设置为代表函数名的字符串(例如echo
或async
当值为true
时,EJS
将使用异步函数进行渲染。(依赖于JavaScript
运行环境对async/await
是否支持)
render
也就是渲染函数,可以直接通过template
、data
和option
生成目标字符串。
const ejs = require('ejs');
const template = '<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>'
ejs.render(template, {user: {name: 'ejs'}}, {async: true});
include
EJS
不支持潜逃语法,因此需要通过include
指令将引用其他模版。
<html>
<body>
<%- include('header'); -%>
<ul>
<% users.forEach(function(user){ %>
<%- include('user/show', {user: user}); %>
<% }); %>
</ul>
<%- include('footer'); -%>
</body>
</html>