移轉至 Pug 2

Pug 2 於 2016 年 8 月發布。為了在新的版本中進行改進,我們必須做出棄用或移除某些 API 和未記錄語言功能的決定。我們努力讓這些變更盡可能不具侵入性,而且其中許多變更先前已在主控台警告中予以勸阻。

本文詳細說明如何將應用程式從 Jade 轉換為 Pug v2。

專案重新命名

由於商標問題,專案名稱已從「Jade」變更為「Pug」,並與 Pug 2 一起發布。這也表示我們已將官方支援的檔案副檔名從 .jade 變更為 .pug。雖然 .jade 仍受支援,但已不建議使用。建議所有使用者立即轉換為 .pug

移除的語言功能

這些移除的項目大部分都可以由我們的官方 linter pug-lint 自動偵測。

舊版 Mixin 呼叫

//- old

mixin foo('whatever')
//- new

+foo('whatever')

我們移除了呼叫 mixin 的舊版語法,以便更輕易地區分宣告和呼叫。(舊語法的所有使用在 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')

我們移除了屬性中的內插支援,因為實作過於複雜,而且此功能會讓使用者無法學習到他們可以在屬性中使用任何 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 函式,自此之後便不再建議使用。