0. 数据源
./views/addtional.art
{{ if age > 18 }}
age > 18;
{{ else if age < 15 }}
age < 15;
{{ else }}
age!!!!!!!!
{{/if}}
<%
if(age > 18)
{ %> 年龄大于18岁 <% }
else if(age < 15)
{ %> 年龄小于15岁 <% }
else
{ %> 其他年龄段 <%}
%>
<%
if(age > 18 )
{%> 孙菲菲 <%}
else
{%> sd <%}
%>
./views/cycle.art
<ul>
{{each Array}}
<li>
{{ $value.name }}
{{ $value.age }}
{{ $value.sex }}
</li>
{{/each}}
</ul>
/
<ul>
<%
for(var i = 0;i < Array.length; i++) {%>
<li>
<%= Array[i].name %>
<%= Array[i].age %>
<%= Array[i].sex %>
</li>
<%}
%>
</ul>
./views/index.art
<!-- 首先,这就是一个模板文件 -->
<!-- Hello World -->
<!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>
./views/language.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>{{ age }}</p>
<p>{{ 1+1 }}</p>
<p>{{ 1+1 == 2 ? 'true' : 'false'}}</p>
<p>{{ content }}</p> <!-- 默认不会解析HTML标签,需要加@才能解析 -->
<p>{{@ content }}</p> <!-- 此时可以正确解析出来, content不能和@连写, 同时注意@与{{不能有空格, 否则报错 -->
<!-- 原始语法 -->
<p><%= name %></p>
<p><%= age %></p>
<p><%= 1+3 %></p>
<p><%= 2+1 == 2 ? 'true' : 'false' %></p>
<p><%= content %></p> <!-- 此时不能解析 -->
<p><%- content %></p> <!-- 可以正确解析 -->
</body>
</html>
<!--
content是一个HTML标签, 通过模板解析替换时:
不加@: <p><h1>我是标题(解析)</h1></p>
加@: <p><h1>我是标题(解析)</h1></p>
-->
./views/subTemplate.art
{{include './common/header.art'}} <!-- 引入header子模板 -->
<div> {{msg}} </div>
{{include './common/footer.art'}} <!-- 引入footer子模板 -->
<% include('./common/header.art') %>
<div> {{msg}} </div>
<% include('./common/footer.art') %>
./views/common/header.art
我是头部
./views/common/footer.art
我是底部
1. 模板语法
1.1
模板使用
// 01_模板使用.js
/*
1. 模板引擎是第三方模块;
```更加友好的拼接字符串```,使项目代码更加清晰,更易于维护;
2. art-template 由腾讯提供;
3. npm install art-template;
4. const html = template('模板路径', 数据);
*/
const path = require('path');
const template = require('art-template');
const views = path.join(__dirname , 'views' , 'index.art'); // 模板路径
const html = template(views, { // 返回替换后的整体.art内容
name: 'ZhangSan',
age: 20
});
console.log(html);
/*
template(.art, {
name: 'ZhangSan',
age:20
});
总之,就是表达了这个意思,将对象 {name:'',age:} 中的内容给渲染到 .art 中相应的位置!
*/
1.2
模板语法1
// 02_模板语法1.js
/*
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. 标准语法可以让模板更容易阅读, 原始语法具有更强大的逻辑处理能力;
*/
/*
如果数据中携带HTML标签, 默认模板引擎不会解析标签, 而是将其转义后输出!
解决方案:
(1) 标准语法:{{@ 数据 }} <p> {{@ content }}</p>
(2) 原始语法:{{%- 数据 }} <p><%- content %></p>
*/
const path = require('path');
const template = require('art-template');
const views = path.join(__dirname,'views','language.art');
console.log(views);
const html = template(views, {
name: 'ZhangSan',
age: 20,
content: '<h1>Hello World</h1>',
});
console.log(html);
1.3
模板语法2(if条件语句)
// 03_模板语法2.js
/*
条件判断语法:
1. 标准语法:
(1) 单条件判断:
{{ if 条件 }}
...
{{ /if }}
(2) 多条件判断:
{{ if 条件 }}
...
{{ else if 条件 }}
...
{{ else }}
...
{{ /if }}
2. 原始语法:
<%
if(条件)
{%> ... <%}
else if(条件)
{%> ... <%}
else
{%> ... <%}
%>
*/
const path = require('path');
const template = require('art-template');
const views = path.join(__dirname,'views','addtional.art');
const html = template(views, {
name: 'LongDa',
age: 14,
});
console.log(html);
1.4
模板语法3(循环语法)
// 04_模板语法3.js
/*
循环语法:
标准语法:
{{ each 数组/对象 }}
{{ $index }} {{ $value }}
{{ /each }}
$index表示当前的索引;
$value表示当前项;
原始语法:
<%
for(...)
{%> ... <%}
%>
///
<%
for(var i = 0;i <Array.length;i++) {%>
<li>
<%=Array[i].name %>
<%=Array[i].age %>
<%=Array[i].sex %>
</li>
<%}
%>
*/
const path = require('path');
const template = require('art-template');
const views = path.join(__dirname,'views','cycle.art');
const html = template(views,{
Array: [{
name: 'Zhang',
age: 20,
sex: 'man'
},{
name: 'Wang',
age:34,
sex: 'woman'
},{
name: 'Li',
age: '21',
sex: 'gay'
}]
});
console.log(html);
1.5
子模板
// 05_子模板.js
/*
使用子模板可以将网站公共区块(头部,底部)抽离到单独的文件之中!
子模板语法:
标准语法:
{{ include '模板路径' }}
原始语法:
<% include('模板路径') %>
*/
const path = require('path');
const template = require('art-template');
const views = path.join(__dirname, 'views', 'subTemplate.art');
const html = template(views, {
msg: '我是首页',
});
console.log(html);
/*
subTemplate.art:
{{include './common/header.art'}} // 引入子模板
<div> {{msg}} </div>
{{include './common/footer.art'}} // 引入子模板
如上所说:在父模板中有引入了子模板!!!
*/
2. 模板继承
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>HTML骨架模板</title>
{{block 'test1'}} {{/block}}
</head>
<body>
{{block 'test2'}} {{/block}}
</body>
</html>
index.art
<!-- 继承模板, 获取layout.art中的骨架 -->
{{extend './layout.art'}}
<!-- 在继承的骨架的相应位置填充以下的内容: -->
{{block 'test1'}}
<p> {{msg}} </p>
{{/block}}
{{block 'test2'}}
<p> 中华人民共和国今天终于成立了 </p>
{{/block}}
index.js
/*
模板继承:
使用模板继承可以将网站HTML骨架抽离到单独的文件之中,
其他页面模板可以继承模板骨架文件;
预留位置:通过block来进行位置预留, 然后进行对应填充;
*/
const path = require('path');
const template = require('art-template');
const views = path.join(__dirname, 'index.art');
const html = template(views, {
msg: '首页模板',
});
console.log(html);
/*
index.js, index.art, main.art三者关系:
1. 首先将msg渲染到index.art中;
2. 因为index.art继承了main.art,
然后将index.art中的内容给渲染到main.art中预先留好的位置中去!!!
*/
3. 模板配置
config.art
{{ self(time, 'yyyy-mm-dd') }}
{{ $imports.self(time, 'yyyy-mm-dd') }}
test.html
i love studying NodeJs.
config.js
/*
config:
1. 向模板中导入变量 template.defaults.imports.变量名 = 变量值;
2. 设置模板根目录 template.defaults.root = 模板目录
3. 设置模板默认后缀:template.defaults.extname = '.art'
dateformat: 第三方模块;
npm包官网:https://www.npmjs.com(含有大量的第三方模块);
*/
const template = require('art-template');
const path = require('path');
const dateformat = require('dateformat'); // dateformat是一个方法
/* [1]. 向模板中导入变量self, 变量值是导入的第三方模块方法(```此时就可以模板中使用相关的方法了```) */
template.defaults.imports.self = dateformat;
/* [2]. 设置模板根目录(D:\Users\XingWei\Desktop\Node.JS\08_模板引擎\03_模板配置)
假如有多个.art文件:
const views1 = path.join(__dirname, 'views', '1.art'); // 模板路径
const views2 = path.join(__dirname, 'views', '2.art');
const views3 = path.join(__dirname, 'views', '3.art');
然后再在template(...)中替换相应的art文件路径, ..., 实际上这是非常冗余的, 为此可以设置模板的根目录;
*/
template.defaults.root = path.join(__dirname);
/* [3]. 配置模板的默认后缀
后续就不用添加.art后缀了;
甚至可以更改模板的后缀名;
*/
// template.defaults.extname = '.art';
template.defaults.extname = '.html';
/****************************************************************************************************************/
const html = template('config.art', { /* 因为上面配置了.art默认后缀, 所以此处的.art后缀可有可无 */
time: new Date(),
});
console.log(html);
console.log(template('test', {})); // 因为设置了默认后缀是html, 所以会寻找test.html文件
/*
为什么引入设置模板根目录??????
const views1 = path.join(__dirname,'views','01.art');
const views2 = path.join(__dirname,'views','02.art');
const views3 = path.join(__dirname,'views','03.art');
const html = template('views1',{
time: new Date(),
});
const html = template('views2',{
time: new Date(),
});
const html = template('views3',{
time: new Date(),
});
相信你应该可以看明白!!!
*/
4. 模板引擎综合案例
gitee地址:https://gitee.com/studyCodingEx/studys
内部的第三方模块需要自行下载,否则服务无法启动。
5. 二次进阶
5.1
render()函数的使用
<!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>
<script src="./js/template-web.js"></script>
<!--
template.render()函数的使用;
-->
</head>
<body>
<div></div>
<span></span>
<script>
let html = template.render('hi, my name is ```{{name}}!```', {
name: 'ZhangSan'
});
document.querySelector('div').innerHTML = html;
let _html = template.render('my age is ```{{age}}```old!', {
age: 23
});
document.querySelector('span').innerHTML = _html;
</script>
</body>
</html>
5.2
导入模板变量
<!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>
<!--
art-template在html页面中的使用:
1. 创建<script>标签, 并添加id属性;
2. 在<script>标签内部填充模板;
3. 调用template('tpl', { ... })将数据渲染到模板之中;
-->
<!--
a. 如果变量是在全局作用域下, 那么可以直接使用 ` $imports.变量名 ` 使用;
b. 否则用应该使用 template.defaults.imports.变量名 = 变量值; 来向模板导入变量, 然后就可以使用了;
-->
</head>
<body>
<div id="container"></div>
<script src="./js/template-web.js"></script>
<script type="text/html" id="tpl">
<div>当前时间:{{$imports.dateFormat(date)}}</div>
</script>
<script>
// template.defaults.imports.dateFormat = dateFormat;
var html = template('tpl', {
date: new Date()
});
document.getElementById('container').innerHTML = html;
function dateFormat(date) {
return date.getFullYear() + '年' + (date.getMonth() + 1) + '月' + date.getDate() + '日';
}
</script>
</body>
</html>