ejs模板引擎
尽管前后端分离是趋势,但后端模板引擎在一些十分简单的场景下还是广泛使用的,这篇笔记我们介绍下如何在Express中整合ejs模板引擎。
注意:Express官网给出的模板引擎是pug,但是它过于难用(主要是不符合常人的思维习惯,而非设计的垃圾),因此这里我们主要介绍的是ejs。
安装ejs
我们可以执行以下命令用npm安装ejs模版引擎。
npm i ejs
配置Express使用ejs
在Express中配置ejs模板引擎非常简单,我们需要设置两个关键属性,模板文件的存放路径和模板引擎的类型。
import express from "express";
import path from "path";
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const app = express();
// 设置模板文件存放路径
app.set("views", path.join(__dirname, "views"));
// 设置模板引擎类型
app.set("view engine", "ejs");
app.listen(8080, () => {
console.log("Express server listen on 8080");
});
渲染数据
配置好模板引擎后,在路由处理函数中我们可以使用res.render()方法向模板中绑定数据并渲染页面。
import express from "express";
import path from "path";
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const app = express();
const router = express.Router();
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "ejs");
router.get("/", (req, res, next) => {
const user = {
username: "Tom",
password: "123456"
};
res.render("user", { user });
});
app.use(router);
app.listen(8080, () => {
console.log("Express server listen on 8080");
});
代码中,res.render()的第一个参数是模板文件名(不需要.ejs后缀),第二个参数是传递给模板的数据对象。Express会自动在views目录下查找对应的模板文件进行渲染。
ejs模板语法
下面是对应的ejs模板文件views/user.ejs的例子。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户信息</title>
</head>
<body>
<table>
<tr>
<td>用户名</td>
<td><%= user.username %></td>
</tr>
<tr>
<td>密码</td>
<td><%= user.password %></td>
</tr>
</table>
</body>
</html>
常用标签
ejs模板引擎提供了几种常用的标签语法。
| 标签 | 说明 |
|---|---|
<%= %> |
输出转义后的HTML内容,防止XSS攻击 |
<%- %> |
输出原始HTML内容,不进行转义 |
<% %> |
执行JavaScript代码,不输出内容 |
<%# %> |
注释,不会输出到页面 |
条件判断
<% if (user.role === "admin") { %>
<p>欢迎管理员</p>
<% } else { %>
<p>欢迎普通用户</p>
<% } %>
循环遍历
<ul>
<% for (const item of items) { %>
<li><%= item.name %></li>
<% } %>
</ul>
也可以使用forEach方法。
<ul>
<% items.forEach((item) => { %>
<li><%= item.name %></li>
<% }); %>
</ul>
引入子模板
ejs支持通过include引入其他模板文件,便于复用公共部分如页头、页脚等。
<%- include("header") %>
<div class="content">
<h1>页面内容</h1>
</div>
<%- include("footer") %>
引入子模板时也可以传递数据。
<%- include("userCard", { user: currentUser }) %>
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。