博客魔改 | 网页模板 pug 的基本语法
唠唠闲话
暑假在家搭建了博客网站 (看这里),通过博客写作进行技术积累。
目前写了差不多 20 篇,没搞 SEO 收录,也没做阅读统计,网站主要自己用。
最近打算把网站公开,一些原本懒得弄的设置,都要补上。
博客用的是 Butterfly 主题,高级的“魔改”方案要修改配置文件,即 *.pug
文件。
这篇就聊聊 pug 的基本语法。
pug
pug 模板引擎, 之前也叫 jade 模板引擎. 用来做服务端渲染常用的一种模板引擎。
参考文章
CSDN:网页模板 pug 基本语法
CSDN:pug 的安装和编译
CSDN:pug 模板引擎语法学习和记录
安装和编译
- 安装很简单,输入下边命令
1 | npm install pug # 安装插件 |
- 编译语法如下
1
pug -P <文件/文件夹>
基础内容
语法
pug 不同于 html,前者不需要标签的开和闭,如 html 的 <p>Demo</p>
,在 pug 使用 p Demo
即可。
缩进
pug 对空格敏感,有点类似 python 对制表符 tab 敏感。pug 使用空格作为缩进符。同一级标签需保证左对齐。
示例:
1 | div |
渲染结果:
1 | <div> |
注释
pug 使用 //-
或 //
对代码进行注释,前者注释内容不出现在渲染后的 html 文件中,后者反之。
示例:
1 | //- html中不包含此行 |
渲染结果:
1 |
|
属性
pug 将标签属性存放于括号()内,多个属性之间以逗号或空格分隔。此外,对于标签的 id
和 class
,pug 使用 #
紧跟标签 id
,使用 .
紧跟标签的 class
,可以同时设置多个 class
。
示例:
1 | h1#title Test title |
渲染效果:
1 | <h1 id="title">Test title</h1> |
包含
为了方便代码复用,pug 提供了 include 包含功能,以下代码会将_partial
目录下的 head.pug
文件内容包含到当前调用的位置。类似与 LaTeX 的 \input
。
示例:
1 | doctype html |
较复杂内容
继承
下面是一个简单的 base 模板,通过 block
定义了页面头部 head
和内容 body
。块 block
有点类似 C/C++
的抽象函数,需要在继承者中完成定义,填充具体内容。
1 | //- base.pug |
以下文件使用 extends
继承以上模板,通过 block
覆盖或替换原有块 block
。当然,继承者也可以在原有基础上继续扩展。
示例:
1 | //- index.pug |
等效于:
1 | html |
渲染效果:
1 | <html> |
变量
pug 中通过 - var name = value
或 - let name = value
的形式定义变量和变量赋值。
需注意的是,在引用变量时,需要在引用位置加上 =
号,否则会默认将变量名当成普通字符串使用。
错误示例
1 | - var test = 1 |
效果:
1 | <p>1+test</p> |
正确示例
1 | - var test = 1 |
效果:
1 | <p>2</p> |
标签 p
后追加 =
,后续的字符串按变量看待。
转义
如果想要将变量与其它字符串常量或是变量连接在一起,就不能用等号了,而是应该用#{},该符号会对大括号内的变量进行求值和转义,最终得到渲染输出的内容。
示例:
1 | - var girl = 'Lily' |
效果
1 | <p>Lily is so beautiful!</p> |
条件结构
pug 的条件语句与其它语言类似,均是如下这般:
1 | - var A = {value: 'Test'} |
效果:
1 | <p>Test</p> |
迭代
pug 中使用 each 和 while 实现循环迭代,each 可以返回当前所在项的索引值,默认从 0 开始计数。
each
示例(第二参数 index 可不加):
1 | //- get index of each |
效果:
1 | <ol> |
while
while 调用方式如下:
1 | //- while |
效果:
1 | <ul> |
for
for 调用示例如下:
1 | ul |
效果同 while。
逻辑运算
逻辑运算结合 ?
可以实现条件赋值。
示例:
1 | - let res1 = (false || true) ? 'a' : 'b' |
效果:
1 | <p>a</p> |
Mixin
用作函数
mixin 名曰混入,类似其它编程语言中的函数,也是为了代码复用,可带参数或不带参数,定义方式如下:
1 | mixin menu-item(href, name) |
其中,menu-item
为调用时所用名称,可认为是函数名,href
及 name
是参数。同上定义变量所说,a(href=href)= name
中第二个 =
是为了将后面的name当作参数来处理,而不是当作字符串 “name” 来处理。
调用 mixin 定义的代码块,需通过 +
号紧跟 mixin 名称及参数:
1 | +menu-item('/Archives','Archives') |
效果:
1 | <li><span class="dot"> </span><a href="/Archives">Archives</a></li> |
混合使用
(这部分不理解)
mixin 之所以称为混入,是因为其语法不局限于函数调用,在 mixin 可以使用块 block
1 | mixin print(post) |
效果:
1 | <p>no block</p> |
JavaScript
注意以下 pug 语句中第一行的 .
号。
1 | script(type='text/javascript'). |
效果
1 | <script type='text/javascript'> |
对于简单脚本,使用 pug 尚可,复杂的还是单独写到 .js
文件中,然后通过 pug 引用方便一些,引用方式如下:
1 | script(type='text/javascript', src='/path/to/js') |
hexo 相关
在 hexo 主题中使用 pug 时,可以通过使用 hexo 提供的全局变量config,theme 来分别调用博客根目录下 _config.yml
文件中的参数以及主题根目录下 _config.yml
文件中的参数。
1 | //- blog config |
当然,pug 中可以直接使用 hexo 提供的其它全局变量及辅助函数,使用方法详见 hexo 的文档
示例:
1 | //- head.pug |
1 | //- base.pug |
其中:
theme.*
为主题配置文件_config.yml
中的参数url_for
为 hexo 提供的用于查找资源路径的函数
总结
pug 提供了包含,继承,Mixin 等多种方式用于代码复用,语法简洁易懂,除了初学时需花费一些时间学习各种标点符号的含义外,其它倒也没有太大困难。
当然啦,pug 还有许多其它特性,但就我目前使用情况而言,以上这些便已足够。