1 课程简介
模版引擎:将动态的数据和静态的页面糅合在一起的实现机制或技术
流行的模版:
实现语言 | 模版引擎例子 |
---|---|
PHP | Smarty 、SimpleTemplate 、 Xtemplate 、 Savant |
Java | Velocity 、 FreeMarker 、 Jbyte |
C# | Dotliquid 、 SharpDom 、 Razor |
JavaScript | Mustache 、 Handlebars 、 Juicer 、 Xtemplate 、 EJS 、 pug |
官网:http://pug-lang.com/
提示:jade
改名为pug
了
1.1 pug环境配置
Mac
- 升级 mac 系统到最新
- 升级 xcode 及 xcode command line tools 到最新
- 安装 homebrew
- 通过 homebrew 安装 git 和 node
- 通过 npm 安装 pug
npm i -g pug
Windows
- 安装 node 可执行文件
- 通过 cygwin, 及可能的 openssl、g++-gcc、python、git等
- 通过 npm 安装 pug
npm install -g pug
1.2 pug特点
- 超强的可读性
- 灵活易用的缩进
- 块扩展
- 代码默认经过编码处理,以增强安全性
- 编译及运行时的上下文错误报告
- 命令行编译支持
- HTML5模式(使用!!!5文档类型)
- 可选的内存缓存
- 联合动态的静态标记类
- 利用过滤器解析树的处理
1.3 pug的诞生
1.4 命令行中的 pug
1 | $ npm install pug -g --client |
1 | Usage: pug [options] [dir|file ...] |
2 pug基础语法知识
2.1 文档声明和头尾标签
index.pug
1 | doctype html |
2.2 实现命令行实时编译
-P
: 不压缩生成的html文件-w
:实时监控
1 | $ tree |
2.3 标签语法
- 不需要尖括号
- 不需要闭合
- 通过缩进实现嵌套
2.4 属性文本和值
属性类型 | 书写方式 |
---|---|
id | [标签]#[id] 或[标签] (id=[id]) |
class | [标签].[className1].[classeName2] 或[标签] (class="[className1] [className2]") |
其它 | [标签] ([属性]="[属性值]" [省略值的属性]) |
注意:对于id和class属性,编写div标签且采用#
、.
的方式时可以省略div
1 | doctype html |
1 |
|
2.5 混合的成段文本和标签
说明:两种方式
- 每一行文本前加
|
- 为标签添加后缀
.
1 | p |
1 | <p> |
2.6 注释和条件注释
2.6.1 注释
分类:
- 缓冲注释
//
:会输出到html - 非缓冲注释
//-
:不会输出到html
注意:当注释放在标签下部时,表示块注释
2.6.2 条件注释
注意:当使用条件注释时,html需要使用标签,且需要闭合。
1 | doctype html |
1 | <!--[if IE 7]><html class='ie7'><![end if]--> |
2.7 变量声明与数据传递
2.7.1 变量声明与使用
- 声明:
- var variableName
- 调用
#{variableName}
1 | doctype html |
1 |
|
2.7.2 数据传递
说明:通过命令行指令传递数据
--obj {jsonString}
:直接传递对象字符串-O file.json
:载入json文件
注意:如果在pug文件中声明了同样的变量,则被pug文件中的覆盖。
1 | $pug index.pug -P -w --obj '{"course":"pug"}' |
1 | doctype html |
1 |
|
2.8 安全转义与非转义
说明:解析并输出变量的内容时,默认会对变量进行安全转义
1 | doctype html |
1 |
|
2.9 流程代码for-in /each-in / while
2.9.1 for-in
1 | h3 for |
1 | <h3>each</h3> |
2.9.2 each-in
1 | h3 each |
1 | <h3>each</h3> |
2.9.3 while
1 | h3 while |
1 | <h3>while</h3> |
2.10 流程代码 if - else/unless
2.10.1 if-else
1 | h3 if else |
1 | <h3>if else</h3> |
2.10.2 unless
1 |
|
1 | <h3>unless</h3> |
2.10.3 case-when
1 | h3 case |
1 | <h3>case</h3> |
2.11 神奇的mixins
2.11.1 参数
2.11.1.1 无参数
1 | h3 无参数 |
1 | <h3>无参数</h3> |
2.22.1.2 有参数
1 | h3 带参数 |
1 | <h3>带参数</h3> |
2.22.1.3 可变参数
1 | h3 可变参数 |
1 | <h3>可变参数</h3> |
2.11.2 嵌套
说明:在一个mixin
的定义中调用另一个mixin
1 | h3 mixin中调用另一个mixin |
2.11.3 块包含
1 | h3 块包含 |
1 | <h3>块包含</h3> |
2.11.4 传递属性
说明:设置标签的属性有两种方式
- 单个设置:
标签(属性名=attributes.属性名)
- 批量设置:
标签&attributes(attributes)
1 | h3 传递属性 |
1 | <h3>传递属性</h3> |
3 pug进级
3.1 模版的继承
关键字 | 说明 |
---|---|
extents [pug文件] |
继承 |
block |
定义(或引用,可追加)被继承的内容 |
3.1.1 案例源码
head.pug
1 | meta(charset='utf-8') |
layout.pug
1 | doctype html |
index.pug
1 | extends layout |
3.1.2 编译后
index.html
1 | <!--[if IE 8]><html class='ie8'><![endif]--> |
3.2 模版的包含
3.2.1 包含其它 pug 文件
style.pug
1 | style. |
index.pug
1 | h1 模版包含 |
index.html
1 | <h1>模版包含</h1> |
3.2.2 包含 html 文件
原文件
index.pug
1 | //- 引入静态文件,添加后缀名(.html),就不会被当做pug模版文件处理 |
title.html
1 | <div> |
编译后
index.html
1 | <div> |
3.3 render及renderFile方法
3.3.1 pug API
3.3.2 compile、render、renderFile
说明:pug
提供写一些方法,帮助开发着在服务端灵活地处理编译工作。
- compile:返回一个编译特定模版片段的方法
- render:直接编译定模版片段
- renderFile:直接编译特定pug模版文件
server.js
1 | var http = require('http') |
1 |
|
3.4 过滤器 filters
3.4.1 markdown
注意:markdown
中不能使用pug
变量
1 | $ npm i jstransformer-markdown -g |
1 | h1 过滤器filters |
1 | <h1>过滤器filters</h1> |
3.4.2 less
1 | $ npm i -g jstransformer-less |
1 | h3 less |
1 | h3>less</h3> |
3.4.3 coffee-script
1 | $ npm i -g jstransformer-coffee-script |
1 | h3 coffee |
1 | <h3>coffee</h3> |
3.5 runtime环境下使用pug
说明:runtime
环境这里特指浏览器
1 | h1 浏览器端和服务器端能使用pug |
1 | <h1>浏览器端和服务器端能使用pug</h1> |
3.6 利用html2pug反编译
1 | $ npm i html2jade -g |
命令行中使用
1 |
node端使用
1 | var html2pug = require('html2jade') |
4 pug缺点及如何取舍
4.1 Pug 的缺点
- 可移植差
- 调试困难
- 性能不是非常出色(对性能有需求考虑 doT)
4.2 选择的因素
- 初始阶段(开发效率)
- 稳定阶段(性能和协作成本)