迁移到 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
函数,从那时起它的使用就受到警告。