迁移到 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
  = a

each 不是 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 包。

CompilerLexerParser

以前,未记录的 Jade compilerlexerparser 类通过这些属性导出。用户可以创建自己的编译器、词法分析器和解析器,这些编译器、词法分析器和解析器派生自这些类,以便自定义编译行为。

Pug v2 允许通过插件自定义编译过程,并且这些已导出的属性现已删除。

Pug v2 等效的类现在是 pug-code-genpug-lexerpug-parser 包的一部分,其中包含各种不兼容的更改。

选项

compilerlexerparser

这些选项与已删除的 CompilerLexerParser 结合使用。

client

client 选项用于客户端函数编译。它在 2013 年被废弃,取而代之的是 compileClient 函数,并且从那时起就一直警告不要使用它。