模板引擎用于生成页面,但是内容不是固定不变的,可以根据页面内容的不同进行调整。Blue的课程里主要介绍了两种模板引擎,一个是jade,另一个是ejs,全栈课程里用到的是art-template。
jade是一种“强依赖”的模板,即它无法和其他html和css文件共存,如果我们需要添加额外的非jade模板的页面代码,只能采用和jade兼容的其他模板,不能直接添加html。
jade的使用
先下载jade模块:
1 | npm i jade -S |
文件渲染
jade模块自带render方法,可以直接渲染模板文件。最基础的就是我们可以尝试直接在js文件里写页面内容:
1 | const jade = require("jade"); |
输出结果:

当然这种方法并不靠谱,如果文件比较复杂,js文件内会混乱不堪,我们还是用常规的单独将模板内容存在文件里的方式来操作:
- 创建
view文件夹存放模板文件
1 | html |
1 | const jade = require("jade"); |

我们使用renderFile来读取模板文件。
jade的语法
1. 根据缩进规定层级
从上面的例子我们能看到,jade模板中根据缩进来规定元素之间的关系。如果没有缩进,那么两个元素就是平级的关系。
2. 属性放在括号()里,多个属性用逗号隔开
1 | html |

3. 特殊属性的写法
style可以使用json写属性
1 | html |

class属性可以写成数组
1 | html |

简写
- class可以用
.简写div.active - id可以用
#简写div#div1
1 | html |

把所有属性都放进json
div&attributes({title: 'aaa', id:'div1'})1
2
3
4
5
6html
head
style
body
div(title="aaa",id="div1")
div&attributes({title: 'aaa', id: 'div1'})
4. 内容格式
- 标签/属性后空格+内容
- 内容不能转行
- 嵌套内容和子标签可以共存
1 | html |

导出jade模板内容
使用
fs模块,将内容写入到新的文件中1
2
3
4
5
6const jade = require("jade");
const fs = require("fs");
let str = jade.renderFile('view/1.jade', {pretty: true});
fs.writeFile('resource/1.html', str, (err) => {
console.log(err);
})
jade特色
1. 可以自动识别单双标签
- div =>
<div></div> - Input =>
<input />
2. 允许自定义标签
默认是双标签
1
2
3
4
5
6html
head
style
body
div
aaa
3. 原样输出内容
1. 内容前面加
|1
2
3
4
5
6
7
8
9
10
11
12
13html
head
script
|window.onload=function (){
| var oBtn=document.getElementById('btn1');
| oBtn.onclick=function (){
| alert('aaaa');
| };
|};
body
|abc
|ddd
|213
2. 标签后面加.(所有下级内容都原样输出)
1 | html |

3. include文件
include a.js1
2
3
4
5
6window.onload=function (){
var oBtn=document.getElementById('btn1');
oBtn.onclick=function (){
alert('aaaa');
};
};1
2
3
4
5
6
7
8html
head
script
include a.js
body
|abc
|ddd
|213
4. 输出变量
1. 模板中:#{变量}
2. renderFile(url, {变量: 值})
1 | html |
1 | const jade = require("jade"); |

3. 变量可以运算
1 | html |
1 | const jade = require("jade"); |

4. 变量可以是数据库获取的内容或用户输入内容
5. style和class不用花括号{},直接div(style=json)或div(class=arr)
1 | html |
1 | const jade = require("jade"); |

6. style和class后面可以增加新的内容
div(class=arr class="active")
5. 非转义输出html标签
- 在标签前面加
!,否则<>会被转义 - 目的:防止注入式攻击
1 | html |
1 | const jade = require("jade"); |

如果直接使用变量,标签括号会被转义
1
2
3
4html
head
body
div #{content}
6. jade直接编写js
1. 开头加-
1 | html |

2. 在模板输出变量
span = a等同于span #{a}1
2
3
4
5html
head
body
span #{a}
span=a
3. 循环
1 | html |
1 | const jade = require("jade"); |

4. if
1 | html |

5. switch
1 | html |
