迁移到 Pug 2
Pug 2 于 2016 年 8 月发布。为了使新版本的改进成为可能,我们必须决定弃用或删除一些 API 和未记录的语言功能。我们努力使这些更改尽可能不具有干扰性,其中许多更改以前在控制台警告中是不鼓励的。
本文详细介绍了如何将应用从 Jade 转换为 Pug v2。
项目重命名
由于商标问题,随着 Pug 2 的发布,项目名称已从 “Jade” 更改为 “Pug”。这也意味着我们已经将官方支持的文件扩展名从
.jade更改为.pug。尽管.jade仍然受支持,但已被弃用。我们鼓励所有用户立即过渡到.pug。
删除的语言功能
大多数删除可以被我们的官方 linter
pug-lint自动检测到。
旧版 Mixin 调用
//- oldmixinfoo('whatever')
//- new+foo('whatever')
我们删除了调用mixin 的旧语法,以便更容易区分声明和调用。(所有旧语法的使用都会在 Jade v1 中引起警告。)
属性插值
//- olda(href='#{link}')a(href='before#{link}after')
//- newa(href=link)//- (on Node.js/io.js ≥ 1.0.0)a(href=`before${link}after`)//- (everywhere)a(href='before'+link+'after')
我们取消了对属性插值的支持,因为实现过于复杂,并且该功能往往会阻止用户了解他们可以使用任何 JavaScript 值来代替属性。有关属性语法的更多信息,请查看我们的 属性文档。
带each前缀的语法
//- old- eachainb=a- forainb=a
//- neweachainb=aforainb=a
each 不是 JavaScript 语法的一部分,因此在 JavaScript 行中使用 each “keyword”
既令人困惑,又很黑客(就实现而言)。这同样适用于无括号的 for关键字。
只需删除-,你的代码就可以再次运行。
删除的 API
这些导出的属性和编译选项已被删除。在你的应用中,请确保你没有使用这些 API。
属性
doctype
此前,未记录的jade.doctype对象包含文档类型快捷方式的哈希值。通过扩展此对象,用户可以创建其他或修改现有的文档类型快捷方式。
在 Pug v2 中,该对象已从 Pug 中拆分到
doctypes包中。要扩展文档类型快捷方式,你可以编写一个codeGen插件。
nodes
以前,未记录的jade.nodes 对象持有类的哈希值,这些类充当(也未记录的)Jade 抽象语法树的节点的构造函数。在 Pug v2 中,我们放弃了这种方法,转而使用 AST
节点中的 type属性进行动态类型。
selfClosing
以前,未记录的jade.selfClosing数组可用于扩展或修改自闭合标签的行为。
在 Pug v2 中,该数组已从 Pug 中拆分到
void-elements包中。要修改这个数组,你可以编写一个codeGen插件。
utils
以前,未记录的jade.utils对象包含三个对模板引擎内部有用的函数。
utils.merge 已从 Pug 中删除,因为它不再使用。可以使用 ES2015
Object.assign方法以及其他变体大致复制其功能。
utils.stringify 已从 Pug 中拆分到
js-stringify
包中,并针对可能的 XSS 攻击提供了额外的保护。建议所有用户使用该包。
utils.walkAST已被拆分到pug-walk包中。
Compiler、Lexer、Parser
以前,未记录的 Jade
compiler、lexer和parser类是通过这些属性导出的。用户可以创建自己的从这些类派生的编译器、词法分析器和解析器,以便自定义编译行为。
Pug v2 允许通过插件自定义编译过程,并且这些导出的属性现在已被删除。
Pug v2 等价类现在是
pug-code-gen、pug-lexer和pug-parser包的一部分,但有各种不兼容的更改。
选项
compiler、lexer、parser
这些选项与删除的Compiler、Lexer和Parser级结合使用。
client
client 选项用于客户端函数编译。它在 2013 年被弃用,取而代之的是
compileClient函数,从那时起它的使用就受到警告。