模板引擎
1. 模板引擎的基础概念
1.1 模板引擎
模板引擎是第三方模块
让开发者以更加友好的方式拼接字符串,使项目代码更加清晰、更加易于维护
1.2 模块:模板引擎 art-template
下载:npm install art-template
引入:const template = require('art-template')
使用:const html = template('模板路径', 数据);
告诉模板引擎要拼接的数据和模板在哪,应该如何进行拼接
const template = require('art-template'); // 模板引擎
const path = require('path'); // 路径拼接
const views = path.join(__dirname, 'views', '01.art');
const html = template(views, { age: 20 }); // 传入数据
console.log(html);
2. 模板引擎的语法
2.1 模板语法
art-template 同时支持两种模板语法:
-
标准:
{{ 数据 }}
可以让模板更容易读写 -
原始:
<%= 数据 %>
具有强大的逻辑处理能力
将某项数据输出在模板中如下:
<!-- 标准语法 -->
<h2>{{ value }}</h2>
<h2>{{ a ? b : c }}</h2>
<h2>{{ a + b }}</h2>
<!-- 原始语法 -->
<h2><%= value %></h2>
<h2><%= a ? b : c %></h2>
<h2><%= a + b %></h2>
2.2 原文输出
如果数据中携带 HTML 标签,默认模板引擎不会解析标签,会将其转义后输出
将 HTML 标签 输出:
- 标准语法:
{{@ 数据 }}
- 原始语法:
<%- 数据 %>
// js 传入数据
const html = template(views, { content: '<h1>标题</h1>' });
// art 文件可解析 HTML 标签
<p>{{@ content }}</p> // <h1>我是标题</h1>
2.3 条件判断
<!-- 标准语法 -->
{{if age>18 }}
年龄大于18
{{else if age < 15 }}
年龄小于15
{{else}}
年龄不符合要求
{{/if}}
<!-- 原始语法 -->
<% if (age > 18) { %>
年龄大于18
<% } else if (age < 15) { %>
年龄小于15
<% } else { %>
年龄不符合要求
<% } %>
2.4 循环
- 标准:
{{each 数据}} {{/each}}
- 原始:
<% for() { %> <% } %>
<!-- 标准语法 -->
{{each target}}
{{$index}} {{$value}}
{{/each}}
<!-- 原始语法 -->
<% for(var i = 0; i < target.length; i++){ %>
<%= i %> <%= target[i] %>
<% } %>
2.5 子模版
使用子模板可以将网站公共区块(头部、底部)抽离到单独的文件中
- 标准语法:
{{ include '模板' }}
- 原始语法:
<% include('模板') %>
<!-- 标准语法 -->
{{include './header.art'}}
<!-- 原始语法 -->
<% include('./header.art') %>
2.6 模板继承
使用模板继承可以将网站 HTML 骨架抽离到单独的文件中,其他页面模板可以继承骨架文件
在骨架文件中预留一些位置,可给位置起名,在其他页面中填入内容
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>HTML骨架模板</title>
{{block 'head'}}{{/block}} // 预留位置
</head>
<body>
{{block 'content'}}{{/block}}
</body>
</html>
<!--index.art 首页模板-->
{{extend './common/layout.art'}} // 继承
{{block 'content'}}
<p>{{ msg }}</p> // <p>首页模板</p>
{{/block}}
{{block 'link'}}
<link rel="stylesheet" type="text/css" href="./main.css">
{{/block}}
2.8 模板配置
-
向模板中导入变量:
template.defaults.imports.变量名 = 变量值;
-
设置模板根目录:
template.defaults.root = 模板目录
-
设置模板默认后缀:
template.defaults.extname = '.art'
const template = require('art-template');
const path = require('path');
const dateFormat = require('dateformat'); // 格式化日期模块
// 设置模板根目录
template.defaults.root = path.join(__dirname, 'views');
// 导入模板变量
template.defaults.imports.dateFormat = dateFormat;
// 配置模板的默认后缀
template.defaults.extname = '.html';
const html = template('06.art', { time: new Date() });
console.log(html); // 2020-10-31
console.log(template('07', {})); // 默认识别 html
// art 文件
{{ dateFormat(time, 'yyyy-mm-dd')}} // 几位写几个
3. 案例:学生档案管理
3.1 案例介绍
目标:模板引擎应用,强化 node.js 项目制作流程
知识点:http 请求响应、数据库、模板引擎、静态资源访问
3.2 制作流程
- 建立项目文件夹并生成项目描述文件
- 创建网站服务器实现客户端和服务器端通信
- 连接数据库并根据需求设计学员信息表
- 创建路由并实现页面模板呈递
- 实现静态资源访问
- 实现学生信息添加功能
- 实现学生信息展示功能
3.3 模块:路由 router
- 获取路由对象
- 调用路由对象提供的方法创建路由
- 启用路由,使路由生效
const getRouter = require('router'); // 路由模块
const router = getRouter(); // 获取路由对象
router.get('/add', (req, res) => {res.end('Hello')});
router.post('/add', (req, res) => {
let formData = '';
req.on('data', param => { formData += param });
req.on('end', async() => {})
});
server.on('request', (req, res) => {router(req, res)})
3.4 模块:静态资源访问服务
- 引入 serve-static 模块获取创建静态资源服务功能的方法
- 调用方法创建静态资源服务并指定静态资源服务目录
- 启用静态资源服务功能
const serveStatic = require('serve-static')
const serve = serveStatic('public')
server.on('request', () => { serve(req, res)})
server.listen(3000)
3.5 添加学生信息功能步骤分析
- 在模板的表单中指定请求地址与请求方式
- 为每一个表单项添加 name 属性
- 添加实现学生信息功能路由
- 接收客户端传递过来的学生信息
- 将学生信息添加到数据库中
- 将页面重定向到学生信息列表页面
3.6 学生信息列表页面分析
- 从数据库中将所有的学生信息查询出来
- 通过模板引擎将学生信息和 HTML 模板进行拼接
- 将拼接好的 HTML 模板响应给客户端
© 版权声明
文章版权归作者所有,未经允许请勿转载。
文章版权归作者所有,未经允许请勿转载。
THE END