Skip to content

模板引擎

  • 渲染产生HTML
  • 替换HTML中的数据内容
  • 通过模板引擎的模板继承功能或模版包含功能实现页面的复用(如页头,页脚等)

模板引擎设置

需要使用 ejs npm包

js
npm install ejs
js
//1. 设置 express 所使用的模板引擎 会根据这里的设置自动引入模板引擎,无需再写 require()
app.set('view engine', 'ejs');

//2. 设置模板文件的存放目录
app.set('views', path.join(__dirname, 'pages'));

渲染

render() 方法用于加载模板文件 放入数据 响应给客户端

js
render() 第一个参数是模版文件的文件名,第二个参数是一个对象
js
app.get('/', function (req, res) {
  // 会在模板文件的存放目录中查找 index.ejs 文件
  res.render('index', { title: 'Hey', message: 'Hello there!'});
});

修改模板文件扩展名

js
const ejs = require('ejs');

//1. 更改模板引擎名字为 html
app.engine('html', ejs.renderFile);
//2. 设置 express 所使用的模板引擎 
app.set('view engine', 'html');
//3. 设置模板文件的存放目录
app.set('views', path.join(__dirname, 'pages'));

EJS 模板引擎

定界符

①执行语句

ejs
<% code %>
ejs
<% top.forEach(item => { %>	// 这里括号包裹的只能是语句 ,变量等JS语法,不能是HTML语法
    <tr>
        <td><%= item.id %></td>
        <td><%= item.name %></td>
        <td><%= item.money %> 亿美元</td>
    </tr>
<% }) %> // 这里括号包裹的只能是语句 ,变量等JS语法,不能是HTML语法

②输出转义的数据

ejs
<%= code %>
js
<p class="alert alert-warning">
    <%= Date.now() %> <br>
    <%= Math.random() %> <br>
    <%= 10 * 7 + 8 %> <br>
</p>

③输出非转义的数据

ejs
<%- code %>
mjs
<%= code %> 如果 code 的值中有html标签,会被转义成字符实体,原样显示
<%- code %> 如果 code 的值中有html标签,浏览器会解析处理

④注释标签

ejs
`<%#` 注释标签,不执行、不输出内容

⑤结束标签(定界符)

  • %> 一般结束标签
  • -%> 删除紧随其后的换行符

⑥模板内使用JavaScript

ejs
<%= new Date() %>
<%= 1 + 100 %>
<%= nameList.join(',') %>

⑦ includes 语法

ejs
<ul>
  <% users.forEach(function(user){ %>
    <%- include('user/show', {user: user}) %>
  <% }); %>
</ul>
<%- include('header') -%>
<h1>
  Title
</h1>
<p>
  My page
</p>
<%- include('footer') -%>

⑧自定义定界符

javascript
// 单个模板文件
ejs.render('<?= users.join(" | "); ?>', {users: users},
    {delimiter: '?'});


// 全局
ejs.delimiter = '$';
ejs.render('<$= users.join(" | "); $>', {users: users});

Express 项目生成器

使用npm包express-generator

js
express-generator自带body-prase中间件把req.body中的数据转为对象

全局安装:

shell
npm install -g express-generator

运行命令生成目录结构并指定模板引擎为 ejs:

shell
express --view=ejs

安装依赖:

shell
npm install

启动项目:

shell
npm start

注意不要直接运行入口文件!

记账本项目

需要使用 lowdb npm包,用于存储少量数据

js
npm i lowdb@1.0.0
js
第一步: 使用 express-generator 创建目录结构并安装依赖
	   express --view=ejs
	   npm install

第二步: 设计路由
      GET /  				    重定向到 /account
      GET /account			    展示账单列表
      GET /account/create       添加表单页面
      POST /account/create  	执行添加
      GET  /account/delete/:id  执行删除	
   
第三步: 模板和静态资源设置
	  1. 将账单相关模板文件放入 views 下的 account 目录中
	  2. 将模板所需要的css、js 放入静态资源目录 public
	  3. 路由回调函数渲染对应的模板
	  
第四步: 添加账单记录
      1. get  /account/create 
         给表单控件设置 name, 给 form 设置 method 和 action
      2. post /account/create  
         取出请求体
         使用 shortid 创建唯一 id
         将id和请求体里的数据添加到 lowdb 中(提取进行手动初始化)
         渲染 success 模板
         
第五步: 账单列表
       get /account
       1. 从lowdb中取出所有账单
       2. 渲染模板,向模板发送数据
       3. 在模板中展示数据
          遍历
          三元运算符
          双向分支
          
 第六步: 删除指定的账单
       1. 在列表页模板中设置超级链接,将id拼接到路径中
       2. get /account/delete/:id
          获取id
          根据id从lowdb中删除对应的记录
          渲染 success 模板