模板引擎artTemplate
文章目录
1. 模板引擎的基础概念
1.1 模板引擎
模板引擎是第三方模块。
让开发者以更加友好的方式拼接字符串,使项目代码更加清晰、更加易于维护。
// 未使用模板引擎的写法
var ary = [{ name: '张三', age: 20 }];
var str = '<ul>';
for (var i = 0; i < ary.length; i++) {
str += '<li>\
<span>'+ ary[i].name +'</span>\
<span>'+ ary[i].age +'</span>\
</li>';
}
str += '</ul>';
<!-- 使用模板引擎的写法 -->
<ul>
{{each ary}}
<!-- 双花括号的作用是把内部的变量替换成真实的数据 -->
<li>{{$value.name}}</li>
<li>{{$value.age}}</li>
{{/each}}
</ul>
1.2 art-template模板引擎
使用步骤:
1.在命令行工具中使用 npm install art-template 命令进行下载
2.使用const template = require**(‘art-template’)**引入模板引擎
3.告诉模板引擎要拼接的数据和模板在哪 const html = template(‘模板路径’, 数据);
4.使用模板语法告诉模板引擎,模板与数据应该如何进行拼接 views默认模板文件夹
//app.js
//引入art-template模板引擎 拼接字符串path模块
const template = require('art-template');
const path = require('path');
//template方法是用来拼接字符串的,返回拼接好的字符串 template('模板路径', 数据);
//参数一:模板路径-->绝对路径 __dirname当前文件所在的路径(app.js所在的路径)
//参数二:要在模板中显示的数据-->对象类型
const views = path.join(__dirname, 'views', 'index.art')//index.art的路径
const html = template(views, {
name: '张三',
age: 20,
})
console.log(html);
//index.art
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{{name}}
{{age}}
</body>
</html>
2. 模板引擎语法
2.1 模板语法
art-template同时支持两种模板语法:标准语法
和原始语法
。
标准语法可以让模板更容易读写
,原始语法具有强大的逻辑处理能力
。标准语法使用的比较多
输出
将某项数据输出在模板中,标准语法和原始语法如下:
●标准语法:{{ 数据 }}
●原始语法:<%= 数据 %>
原文输出
如果数据中携带HTML标签,默认模板引擎不会解析标签,会将其转义后输出。
●标准语法:{{@ 数据 }}
●原始语法:<%- 数据 %>
//01.输出语法.js
const template = require('art-template');
const path = require('path');
const views = path.join(__dirname, 'views', '01.art')
const html = template(views, {
name: '张三',
age: 20,
content: '<h1>我是标题</h1>'
})
console.log(html);
//01.art
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 标准语法 -->
<p>{{name}}</p>
<p>{{1+1}}</p>
<p>{{1+1==2?'相等':'不相等'}}</p>
<p>{{content}}</p>
<p>{{@content}}</p>
<!-- 原始语法 -->
<p><%= name %></p>
<p><%= 1+2 %></p>
<p><%= 1+1==2?'相等':'不相等' %></p>
<p><%= content %></p>
<p><%- content %></p>
</body>
</body>
</html>
2.2 条件判断
语法模板
<!-- 标准语法 -->
{{if 条件}} ... {{/if}}
{{if v1}} ... {{else if v2}} ... {{/if}}
<!-- 原始语法 -->
<% if (value) { %> ... <% } %>
<% if (v1) { %> ... <% } else if (v2) { %> ... <% } %>
//02.条件判断.js
const template = require('art-template');
const path = require('path');
const views = path.join(__dirname, 'views', '02.art')
const html = template(views, {
name: '张三',
age: 17,
})
console.log(html);
//02.art
<!-- 标准语法 -->
{{if age>18}}
年龄大于18
{{else if age <15 }}
年龄小于15
{{else}}
年龄不符合要求
{{/if}}
<!-- 原始语法 -->
<% if (age>18) {%>
年龄大于18
<%} else if (age<15){%>
年龄小于15
<%} else {%>
年龄不符合要求
<%}%>
2.3 循环
●标准语法:{{each 数据}} {{/each}}
●原始语法:<% for() { %> <% } %>
语法模板
<!-- 标准语法 -->
{{each target}}
{{$index}} {{$value}} 循环的索引 循环的这一项数据
{{/each}}
<!-- 原始语法 -->
<% for(var i = 0; i < target.length; i++){ %>
<%= i %> <%= target[i] %>
<% } %>
//03.数据循环.js
const template = require('art-template');
const path = require('path');
const views = path.join(__dirname, 'views', '03.art');
const html = template(views, {
users: [{
name: '张三',
age: 20,
sex: '男'
}, {
name: '李四',
age: 30,
sex: '男'
}, {
name: '玛丽',
age: 15,
sex: '女'
}]
});
console.log(html);
//03.art
<!-- 标准语法 -->
<ul>
{{each users}}
<li>
{{$value.name}}
{{$value.age}}
{{$value.sex}}
</li>
{{/each}}
</ul>
<!-- 原始语法 -->
<ul>
<% for (var i = 0; i<users.length;i++) { %>
<li>
<%= users[i].name %>
<%= users[i].age %>
<%= users[i].sex %>
</li>
<% } %>
</ul>
2.4 子模板
使用子模板
可以将网站公共区块(头部、底部)抽离到单独的文件中。
●标准语法:{{include ‘模板’}}
●原始语法:<%include(‘模板’) %>
语法模板
<!-- 标准语法 -->
{{include './header.art'}}
<!-- 原始语法 -->
<% include('./header.art') %>
//04.子模板
const template = require('art-template');
const path = require('path');
const views = path.join(__dirname, 'views', '04.art');
const html = template(views, {
msg: '我是首页'
});
console.log(html);
//header.art
我是头部
//footer.art
我是底部
//04.art
<!-- 标准语法 -->
{{include './common/header.art'}}
<div>{{msg}}</div>
{{include './common/footer.art'}}
<!-- 原始语法 -->
<% include('./common/header.art')%>
<div>{{msg}}</div>
<% include('./common/header.art')%>
2.5 模板继承
使用模板继承
可以将网站HTML骨架抽离到单独的文件中,其他页面模板可以继承骨架文件。
//05.模板继承.js
const template = require('art-template');
const path = require('path');
const views = path.join(__dirname, 'views', '05.art');
const html = template(views, {
msg: '首页模板'
});
console.log(html);
//05.art
{{extend './common/layout.art'}} //extend继承模板
{{block 'content'}}
<p>{{msg}}</p> //要填充的内容
{{/block}}
{{block 'link'}}
<link rel="stylesheet" href="./main.css">
{{/block}}
//layout.art html骨架模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HTML骨架模板</title>
{{block 'link'}}{{/block}} //block预留位置
</head>
<body>
{{block 'content'}}{{/block}}
</body>
</html>
2.6 模板配置
1.向模板中导入变量
template.defaults.imports.变量名 = 变量值;
2.设置模板根目录
template.defaults.root = 模板目录
3.设置模板默认后缀
template.defaults.extname = ‘.art’
//06.模板配置.js
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' //若写成.art 则后面的06.art可以省略.art
const html = template("06.art", { //前面只需写模板的名字,路径自动拼接好,省略路径拼接
time: new Date(),
});
console.log(template('07', {}));
console.log(html);
//06.art
{{dateFormat(time,'yyyy-mm-dd')}}
//07.html
我是07.html模板
3. 案例
3.1 案例介绍 – 学生档案管理
目标
:模板引擎应用,强化node.js项目制作流程。
知识点
:http请求响应、数据库、模板引擎、静态资源访问。
3.2 制作流程
1.建立项目文件夹并生成项目描述文件
npm init –y 生成package.json
2.创建网站服务器实现客户端和服务器端通信
3.连接数据库并根据需求设计学员信息表
连接数据库需要用到第三方模块mongoose npm i mongoose
4.创建路由并实现页面模板呈递
5.实现静态资源访问
6.实现学生信息添加功能
7.实现学生信息展示功能
3.3 第三方模块 router
功能
:实现路由
使用步骤
:
1.获取路由对象
2.调用路由对象提供的方法创建路由
3.启用路由,使路由生效
语法模板
//引入实现路由router模块
const getRouter = require('router')
//获取路由对象
const router = getRouter();
//调用路由对象提供的方法创建路由
router.get('/add', (req, res) => {
res.end('Hello World!')
})
server.on('request', (req, res) => {
//启动路由功能
router(req, res)
})
3.4 第三方模块 serve-static
功能
:实现静态资源访问服务
步骤
:
1.引入serve-static模块获取创建静态资源服务功能的方法
2.调用方法创建静态资源服务并指定静态资源服务目录
3.启用静态资源服务功能
语法模板
//引入静态资源访问serve-static模块
const serveStatic = require('serve-static')
//调用方法创建静态资源服务并指定静态资源服务目录
const serve = serveStatic('public')
//启动静态资源访问服务功能
server.on('request', () => {
serve(req, res)
})
server.listen(3000)
3.5 添加学生信息功能步骤分析
1.在模板的表单中指定请求地址与请求方式
2.为每一个表单项添加name属性 没有该属性服务器端接收不到请求参数
3.添加实现学生信息功能路由
4.接收客户端传递过来的学生信息
5.将学生信息添加到数据库中
6.将页面重定向到学生信息列表页面
3.6 学生信息列表页面分析
1.从数据库中将所有的学生信息查询出来
2.通过模板引擎将学生信息和HTML模板进行拼接
3.将拼接好的HTML模板响应给客户端