維基百科中模板和模塊有什麼區別?

如題


我覺得解釋這個問題先明確下模板(Template)的作用:

其實mediaWiki里的模板類似編程中的子程序(Function),具體功能是通過語法執行一個可以反覆調用的邏輯塊,用以簡化操作和勞動。

個人理解一個Template的組成包括:

  1. 外觀樣式:也就是style,本質上是符合HTML標準的語法,可以是Html代碼、CSS樣式表,也可以是wikitext(標記語言),當然標記語言本質還是html,兩者也可以混用
  2. 內在邏輯:也就是骨骼,主要靠解析器函數{{#}}和標籤&<&>來實現,類似程序語言中的函數。
  3. 參數:可以沒有參數。如果有參數可以極大的簡化操作,通過傳遞不同的參數,調用同一個模板減少重複勞動。

模塊(Module)我認為並不是與Template平行的一個功能(儘管在namespace層面他們是平級的),而是對Template的一個升級,我們從module的產生就能看出來,module最初只是基於函數解析器中{{#invoke:}}函數的一個擴展,

也就是說,module是template的高階形態,兩者意欲解決的事情是同樣的,只不過template受制於mediaWiki的parser機制和標記語言語法,很多東西做不了,所以才引入了功能更強大、性能更高的lua語言。而module是lua語言塊的一個載體。

很多時候template和module都是可以互換的,從外表根本看不出來。但是我個人更推薦module和lua,我認為具有以下優勢

  • 可讀性,lua是標準的程序語言寫法,搭配優化的代碼編輯器,分行、分段、縮進、參數、語法一目了然,維護起來非常愜意。而template大量使用標記語法,經常會出現{{{{{{{{{}}}}}}}}}}這種無限大括弧嵌套,維護起來非常麻煩,尤其是這個模板不是你寫的,你想來修改,必須查清楚層級,差一個就全盤亂掉

對比下:圖1是template,圖2是module

  • 擴展性,簡單來說就是能幹的事情更多了,從語法來說,函數解析器能幹的事情就那麼多,if判斷、映射switch、replace之類的比較常用。一牽扯到循環就沒轍了,也不能用正則。基礎的template還不能調用變數(當然安裝了語義擴展後是可以的)。而lua則強大的多,給了程序員們更廣闊的想像空間~

  • 性能,template涉及到嵌套和重複調用的時候性能開銷還是非常大的~lua則小巧的多,我手頭沒有數據 佐證,抽時間我會留意一下。lua性能的提升也是mw官方指明的一個優點。(儘管幾十幾百ms很多時候用戶並感覺不出來)

但是也不是說module就要全面取代template

很多簡單的邏輯還是template寫的更快更實用

個人經驗總結,對於html布局的渲染,和大規模架構的模板,比如infobox、navbox、refdata這種用module非常合適。模板和模塊要根據具體情況結合使用,互相補充!


模板名字空間:前綴為「Template:」,別名為「模板:」,簡寫「T:」。包含了所有的模板。模板是一類特殊的頁面,用於嵌入或替換引用進其他的頁面,以加入一些標準化的內容,或者信息欄、導航欄等。

模塊名字空間:前綴為「Module:」。包含了所有的Scribunto模塊。模塊讓人使用Lua腳本語言實現在MediaWiki及其擴展的基本集中未包含的可供在模板中調用的解析器函數。

From: https://zh.wikipedia.org/wiki/Wikipedia%3A%E5%90%8D%E5%AD%97%E7%A9%BA%E9%97%B4


最簡單的說,模板使用Mediawiki語法(也就是平時寫條目的語法)編寫的,模塊使用Lua語言編寫的。當然共同點是,主要目的為被其他頁面調用。


推薦閱讀:

公式計算機的另一種實現思路
Lua5.2和5.1有哪些不同?相對與5.1有什麼進步?Lua5.2能用5.1的庫嗎?如果不能,有哪些可用的庫?
C、Scheme、Lua 和 Go 究竟哪個最簡單?

TAG:維基百科 | MediaWiki | Lua |