迁移到 Pug 2
Pug 2 于 2016 年 8 月发布。为了在新版本中进行改进,我们不得不做出弃用或删除一些 API 和未记录的语言特性的决定。我们努力使这些更改尽可能不显眼,并且其中许多更改以前在控制台警告中已被弃用。
本文详细介绍了如何将应用程序从 Jade 转换为 Pug v2。
项目重命名
由于商标问题,项目名称已在 Pug 2 发布时从“Jade”更改为“Pug”。这也意味着我们将官方支持的文件扩展名从.jade更改为.pug。虽然.jade仍然受支持,但已弃用。鼓励所有用户立即过渡到.pug。
已删除的语言特性
大多数这些删除都可以通过我们的官方 linter pug-lint 自动检测。
旧版混合调用
//- old
mixin foo('whatever')//- new
+foo('whatever')我们删除了调用 混合 的旧语法,以便于区分声明和调用。(旧语法的所有用法都在 Jade v1 中导致警告。)
属性插值
//- old
a(href='#{link}')
a(href='before#{link}after')//- new
a(href=link)
//- (on Node.js/io.js ≥ 1.0.0)
a(href=`before${link}after`)
//- (everywhere)
a(href='before' + link + 'after')我们删除了对属性中插值的 supports,因为实现不必要地复杂,并且该特性往往会阻止用户了解他们可以在属性中使用任何 JavaScript 值。有关属性语法的更多信息,请查看我们的 属性文档。
带前缀的each语法
//- old
- each a in b
= a
- for a in b
= a//- new
each a in b
= a
for a in b
= aeach 不是 JavaScript 语法的一部分,因此在 JavaScript 行中使用each“关键字”既令人困惑,又很黑客(在实现方面)。对于不带括号的for关键字也是如此。
只需删除 -,您的代码应该可以再次运行。
已删除的 API
这些已导出的属性和编译选项已被删除。在您的应用程序中,确保您未使用这些 API。
属性
doctype
以前,未记录的 jade.doctype 对象包含 doctype 快捷方式 的哈希。通过扩展此对象,用户可以创建其他快捷方式或修改现有 doctype 快捷方式。
在 Pug v2 中,此对象已从 Pug 拆分为 doctypes 包。要扩展 doctype 快捷方式,您可以编写一个 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 函数,并且从那时起就一直警告不要使用它。