Pug v2 已經(jīng)在 2016 年 8 月發(fā)布。為了盡可能改善新版本的體驗,我們不得不作出決定,移除、或者不贊成使用一些 API 和未歸檔的特性。我們努力讓這些變更盡可能不具破壞性。當前,這些變更大多數(shù)會以控制臺輸出的方式進行警告。
此頁面將詳細介紹您應該如何將代碼從舊版本遷移到最新版本的 Pug 上。
因為商標方面的問題,這個項目的名稱已經(jīng)在 Pug v2 發(fā)布之際從“Jade”變更為“Pug”。這也意味著官方支持的文件擴展名從 .jade 變?yōu)?nbsp;.pug。盡管依然支持 .jade,但這是不贊成的,我們建議所有的用戶都立刻將其改為 .pug。
絕大多數(shù)被移除的內(nèi)容都可以被 pug-lint 自動檢測出來,這是我們官方提供的代碼規(guī)范器。
//- 舊版本
mixin foo('whatever')
//- 新版本
+foo('whatever')
我們移除了傳統(tǒng)的調(diào)用 mixin 的語句,這樣可以更容易區(qū)分 Mixin 的聲明和調(diào)用。所有這類舊語句在 Jade v1 里都已經(jīng)警告。
//- 舊版本
a(href='#{link}')
a(href='before#{link}after')
//- 新版本
a(href=link)
//- (在 Node.js/io.js ≥ 1.0.0)
a(href=`before${link}after`)
//- (任何場合)
a(href='before' + link + 'after')
我們移除了在標簽屬性里的嵌入支持。它給實現(xiàn)平添了不必要的復雜度,而且也讓用戶不易注意到屬性的賦值其實可以是任意的 JavaScript 表達式。閱讀屬性的文檔來了解更多關(guān)于標簽屬性的語法。
//- 舊版本
- each a in b
= a
- for a in b
= a
//- 新版本
each a in b
= a
for a in b
= a
這里的 each 并非 JavaScript 的語法,在 JavaScript 代碼行中使用 each“關(guān)鍵字”會讓人感到非常困惑。沒有括號的 for 關(guān)鍵字也是同樣的情況。
只需要簡單地刪去 -,您的代碼應該就能重新工作。
以下導出屬性和編譯選項已經(jīng)被移除。請確保您的代碼沒有使用它們。
此前,未歸檔的對象 jade.doctype 是一個存放 doctype 縮寫的哈希表。用戶可以通過擴充這個對象來自定義額外的 doctype 縮寫,或者修改已有的 doctype 縮寫。
在 Pug v2 中,這個對象已經(jīng)從 Pug 分離出來,單獨成為一個叫做 doctypes 的包。如果您要擴充 doctype 縮寫,可以寫成一個 codeGen 的插件。
此前,未歸檔的對象 jade.nodes 是一個存放(未歸檔的)Jade 抽象語法樹節(jié)點的構(gòu)造函數(shù)的哈希表。
在 Pug v2 中,我們棄用了這種做法,取而代之的是使用抽象語法樹節(jié)點的 type 屬性實現(xiàn)鴨子類型。
此前,未歸檔的數(shù)組 jade.selfClosing 可以用于添加或者修改自閉合標簽的條目。
在 Pug v2 中,這個數(shù)組已經(jīng)從 Pug 分離出來,單獨成為一個叫做 void-elements 的包。如果您要修改這個數(shù)組,可以寫成一個 codeGen 的插件。
此前,jade.utils 對象包含了三個模板引擎內(nèi)部比較有用的函數(shù):
utils.merge 已經(jīng)從 Pug 中移除并不再使用。其功能大體上可以用 ECMAScript 2015 的 Object.assign 方法及其他變種來實現(xiàn)。
utils.stringify 已經(jīng)從 Pug 分離出來到叫做 js-stringify 的包,同時有額外的跨站腳本攻擊保護。建議所有用戶都改用此代碼包。
utils.walkAST 已經(jīng)分離到一個叫做 pug-walk 的包。
此前,未歸檔的 Jade 的編譯器(Compiler)、詞法分析器(Lexer)和解析器(Parser)通過這三個屬性導出。用戶可以從這些類創(chuàng)建自己的編譯器、詞法分析器和解析器,從而自定義編譯的行為。
Pug v2 允許通過插件自定義編譯的行為,同時移除這些導出屬性。
對應到 Pug v2 中,這幾個類現(xiàn)在已經(jīng)分為 pug-code-gen,pug-lexer 和 pug-parser 這幾個包,并且有各種與舊版本不兼容的變更。
這些選項曾被用于已經(jīng)被移除的 Compiler,Lexer 和 Parser 類。
該選項曾用于模板函數(shù)的編譯。大約從 2013 年起不推薦使用,并用 compileClient 函數(shù)代替,從那時起已經(jīng)進行了警告。
更多建議: