模板引擎
一、什么是模板引擎?
模板引擎是第三方模块,是一个将页面模板和要显示的数据结合生成HTML页面的工具让开发者以更友好的方式拼接字符串,使项目代码更加清晰,更加易于维护。
二、art-template模板引擎
1.使用:
- 在命令行工具中使用npm install are-template安装
- 使用const template = require(‘art-template’)引入模板引擎
- 需要创建两个文件,一个js文件,一个art文件
- 告诉模板引擎要拼接的数据和模板在哪const html = template(‘模板路径’,数据)
app.js文件
//导入模板引擎
const template = require('art-template')
const path = require('path')
//模板路径为绝对路径
const views = path.join(__dirname, 'views', 'index.art')
//template方法用来拼接字符串,返回值为字符串
const html = template(views, {
name : '张三' ,
age : 20
})
console.log(html)
index.art文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{{name}}
{{age}}
</body>
</html>
运行结果:
2.模板语法
- art-template同时支持两种模板语法:标准语法和原始语法。
- 标准语法可以让模板更容易读写,原始语法具有强大的逻辑处理能力。
- 标准语法:{{数据}}
- 原始语法:<%= 数据%>
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 ,
})
console.log(html)
01.art文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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 ? 'Y' : 'N'}}</p>
<p>{{content}}</p>
<!--原始语法--!>
<p><%= name %></p>
<p><%= 1 + 1 %></p>
<p><%= 1 + 1 == 2 ? 'Y' : 'N' %></p>
<p><%= content %></p>
</body>
</html>
运行结果:
-
1)原文输出
如果数据中携带HTML标签,默认模板引擎不会解析标签,会将其转义后输出。- 标准语法:{{@数据}}
- 原始语法:<%-数据 %>
02.js文件
const template = require('art-template')
const path = require('path')
const views = path.join(__dirname, 'views', '02.art')
const html = template(views, {
a : '<h1>我是标题标签<h1>',
b : '<div>我是盒子</div>'
})
console.log(html)
02.art文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!--标准语法--!>
<p>{{a}}</p>
<p>{{b}}</p>
<p>{{@a}}</p>
<p>{{@b}}</p>
<!--原始语法--!>
<p><%= a %></p>
<p><%= b %></p>
<p><%- a %></p>
<p><%- b %></p>
</body>
</html>
- 运行结果:
- 2)条件判断
- 在模板中可以根据条件来决定显示哪块HTML代码。
- 标准语法:
- {{if 条件}} … {{/if}}
- {{if v1}} … {{else if v2}} … {{/if}}
- 原始语法
- <% if (value) { %> … <% } %>
- <% if (v1) { %> … <% } %> else if (v2) { %> … <% } %>
03.js
const template = require('art-template')
const path = require('path')
const views = path.join(__dirname, 'views', '03.art')
const html = template(views, {
name : '张三' ,
age : 20 ,
})
console.log(html)
03.art
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!--标准语法--!>
{{if age > 18}}
年龄大于18
{{else if age < 15}}
年龄小于15
{{else}}
年龄不符合要求
{{/if}}
<!--原始语法--!>
<% if(age > 18) { %>
年龄大于18
<% } else if (age < 15) { %>
年龄小于15
<% } else { %>
年龄不符合要求
<% } %>
</body>
</html>
- 运行结果
- 3 循环
04.js
const template = require('art-template')
const path = require('path')
const views = path.join(__dirname, 'views', '04.art')
const html = template(views, {
users: [
{
name : 'aa' ,
age : 20 ,
sex : '男'
},
{
name : 'bb' ,
age : 18 ,
sex : '女'
},
{
name : 'cc' ,
age : 22 ,
sex : '男'
}
]
})
console.log(html)
04.art
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!--标准语法--!>
<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>
</body>
</html>
- 运行结果:
- 3 .子模板
- 使用子模版可以将网站公共区块(头部、底部)抽离到单独的文件中。
- 标准语法:{{include ‘模板’}} include为关键字
- 原始语法:<%include(‘模板’) %> include为方法
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)
./common/header.art
我是头部
./common/footer.art
我是底部
05.art
{{include './common/header.art'}}
{{include './common/footer.art'}}
<div>{{msg}}</div>
<% include('./common/header.art')%>
<% include('./common/footer.art')%>
- 运行结果:
- 4.模板继承
- 使用模板继承可以将网站HTML骨架抽离到单独的文件中,其他网页可以继承骨架文件。
- 使用模板继承可以将网站HTML骨架抽离到单独的文件中,其他网页可以继承骨架文件。
06.js
const template = require('art-template')
const path = require('path')
const views = path.join(__dirname, 'views', '06.art')
const html = template(views, {
msg : '首页模板'
})
console.log(html)
06.art
{{extend './common/layout.art'}}
{{block 'content'}}
<p>{{msg}}</p>
{{/block}}
{{block 'link'}}
<link rel="stylesheet" type="text/css" href="./main.css">
{{/block}}
./common/layout.art
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
{{block 'link'}} {{/block}}
</head>
<body>
{{block 'content'}} {{/block}}
</body>
</html>
- 运行结果:
- 5.模板配置
- 向模板中导入变量template.defaults.imports.变量名 = 变量值
07.js
const template = require('art-template')
const path = require('path')
const dateFormat = require('dateformat')
const views = path.join(__dirname, 'views', '07.art')
//导入模板变量
template.defaults.imports.dateFormat = dateFormat
const html = template(views, {
time : new Date()
})
console.log(html)
07.art
{{ dateFormat(time, 'yyyy-mm-dd') }}
- 运行结果:
- 设置模板根目录 template.defaults.root = 模板目录
- 设置模板默认后缀template.defaults.extname = ‘.art’
08.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 = '.art'
const html = template('08', {
time : new Date()
})
console.log(html)
08.art
{{ dateFormat(time, 'yyyy-mm-dd') }}
- 运行结果: