Pug(前Jade)模板引擎详解
Pug(发音 /pʌɡ/),前身为 Jade,是一个高性能的 Node.js 模板引擎。它以其简洁、富有表现力的语法而闻名,旨在让 HTML 编写变得更加高效和愉快。Pug 摒弃了传统 HTML 的尖括号和闭合标签,转而使用缩进和基于文本的语法,这使得模板文件更小、更易读、也更不易出错。
核心思想:Pug 通过简洁的缩进语法替代冗长的 HTML 标签,提供强大的动态数据渲染、代码重用和条件逻辑功能。
一、Pug 简介
1.1 什么是模板引擎?
模板引擎是一种将数据填充到预定义模板中以生成最终输出(通常是 HTML 字符串)的工具。它将页面的结构(模板)与数据分离,使得前端开发更加模块化和可维护。
1.2 Pug 的特点
- 独特语法:使用缩进表示嵌套关系,无需关闭标签。
- 简洁明了:代码量显著少于对应的 HTML。
- 强大功能:支持变量、循环、条件判断、Mixin(类似于函数或组件)、包含(文件复用)、布局继承等高级特性。
- 编译到 HTML:Pug 模板最终会被编译成标准的 HTML。
- Node.js 支持:作为 Node.js 的模板引擎,Pug 完美集成于 Express 等 Web 框架。
- 社区活跃:拥有良好的社区支持和文档。
1.3 适用场景
- Node.js 后端渲染 HTML 页面。
- 静态站点生成。
- 作为 HTML 预处理器,提高 HTML 编写效率。
二、Pug (Jade) 的安装与使用
Pug 通常作为 Node.js 项目的依赖项安装。
2.1 安装
使用 npm 或 yarn 安装:
1 | npm install pug |
2.2 基本使用示例 (Node.js)
app.js (或 server.js):
1 | const express = require('express'); |
views/index.pug:
1 | doctype html |
运行 node app.js 并在浏览器中访问 http://localhost:3000,你将看到一个渲染好的 HTML 页面。
三、Pug 核心语法详解
3.1 标签与缩进
Pug 最核心的特性是其基于缩进的语法。标签名后跟内容,子标签通过缩进表示嵌套。
1 | div |
编译为:
1 | <div> |
3.2 属性
属性写在标签名后的圆括号内,多个属性用逗号或空格分隔。
1 | a(href="/about", title="关于我们", target="_blank") 关于 |
编译为:
1 | <a href="/about" title="关于我们" target="_blank">关于</a> |
Class 和 ID 简写
Class 属性可以使用 . 前缀,ID 属性可以使用 # 前缀,可以直接跟在标签名之后。
1 | div#container.wrapper.main |
编译为:
1 | <div id="container" class="wrapper main"> |
布尔属性 (Boolean Attributes)
对于 checked, selected, disabled 等布尔属性,只需写属性名即可。
1 | input(type="checkbox", checked) |
编译为:
1 | <input type="checkbox" checked> |
如果属性值为 false, null, undefined 或 0,则该布尔属性不会被渲染。
1 | - var isChecked = false |
编译为:
1 | <input type="checkbox"> |
3.3 文本内容
行内文本
标签后直接跟文本内容。
1 | p 这是行内文本。 |
块级文本
使用 . 运算符,或者直接在标签下方缩进文本块。
1 | p. |
编译为:
1 | <p>这是一个很长的文本段落, |
=:默认会转义 HTML 实体的文本输出。!=:不转义 HTML 实体的文本输出。在输出用户输入内容时使用要特别小心,防止 XSS 攻击。.:用于多行纯文本块。
3.4 变量
使用 #{} 或 = 来输出变量。
1 | - var name = 'Pug User' |
编译为:
1 | <p>Hello, Pug User!</p> |
3.5 条件判断 (Conditionals)
使用 if, else if, else 进行条件渲染。
1 | if user.isAdmin |
unless (反向判断)
1 | unless user.isLoggedIn |
等同于 if !user.isLoggedIn。
3.6 循环 (Iterations)
使用 each 循环遍历数组或对象。
1 | ul |
编译为:
1 | <ul> |
3.7 Mixins (混合)
Mixins 允许你创建可重用的 Pug 块,类似于组件或函数,可以接受参数。
1 | // 定义 Mixin |
编译为:
1 | <div class="user-card"> |
3.8 包含 (Includes)
使用 include 指令将其他 Pug 文件插入到当前模板中。
views/header.pug:
1 | header |
views/footer.pug:
1 | footer |
views/index.pug:
1 | doctype html |
3.9 布局继承 (Extends 和 Block)
布局继承是 Pug 中非常强大的特性,允许你定义一个基础布局模板,然后让其他模板继承并覆盖其中的特定块。这对于网站的统一结构非常有用。
views/layout.pug:
1 | doctype html |
views/page.pug:
1 | extends layout.pug // 继承 layout.pug |
#{super} 允许你在覆盖一个 block 的同时,仍然包含父模板中该 block 的内容。
3.10 注释
//:Pug 单行注释,不会编译到 HTML。//-:Pug 单行注释,不会编译到 HTML (与//相同)。// Some HTML comment:Pug 将其识别为 HTML 注释,会编译到 HTML。<!-- Some HTML comment -->:原生 HTML 注释,会编译到 HTML。
四、Pug 与 Express 框架集成
如在 app.js 示例所示,与 Express 集成非常简单:
1 | const express = require('express'); |
res.render() 方法会自动处理 Pug 模板的编译和 HTML 响应。
五、Pug 的优缺点
5.1 优点
- HTML 编写效率高:大幅减少击键次数,无需手动闭合标签。
- 代码简洁可读:缩进结构清晰,易于理解。
- 强大的模板功能:变量、循环、条件判断、Mixin、Include、Extends 等一应俱全。
- 避免 HTML 错误:由于 Pug 会编译成合法的 HTML,因此可以避免常见的 HTML 结构错误(如忘记关闭标签)。
- 易于重构:模块化设计使得模板更易于维护和重构。
5.2 缺点
- 学习曲线:对于习惯了传统 HTML 语法的开发者来说,Pug 的独特语法需要一定时间适应。
- 调试相对困难:如果模板出现错误,错误信息可能指向编译后的 JavaScript 或 HTML 行数,而不是原始 Pug 文件的行数,这会增加调试难度(不过现代工具链有所改进)。
- 语法严格:缩进是 Pug 语法的强制部分,错误的缩进会导致解析错误。
- 非标准语法:Pug 文件本身不能直接在浏览器中运行,必须经过编译。
六、结语
Pug 是一个独特且功能强大的模板引擎,它通过创新的语法设计,极大地提升了 HTML 编写的效率和体验。虽然存在一定的学习成本,但一旦掌握,它能让前端模板的开发变得更加愉快和高效。在 Node.js 生态系统中,如果你追求简洁、高效和可维护的模板编写方式,Pug 绝对是一个值得尝试的优秀选择。
