天天看點

一個不成熟的模闆引擎思路

關于模闆,我倒是用過了不少。最開始要數Java的JSP了,然後接觸了PHP的smarty,再就是Python的jinja2, Django内置模闆,現在剛開始看Nodejs,也發現了不少類似的模闆引擎,ejs, jade等等吧。

模闆帶來的最直接的好處就是加速開發,前後端分離。除此之外,對于字元串的格式化同樣是個比較好的應用。習慣了Python中

這樣簡便的用法,突然來到nodejs中,沒有了這類特性的原生支援,寫起來列印語句就老是覺得很别扭,一點都不優雅。然後我就想自己做一個實作上述功能的工具函數,友善自己的使用。然後就想到了模闆這一個方向,雖然想法還不夠成熟,甚至是有點拙略,但是“靈(瞎)感(鬧)”還是得記錄一下不是。

JavaScript中有這麼一個神奇的對象,那就是Function。如果函數體符合文法要求,那麼你就可以動态建立出一個自己的函數出來。下面來個簡單的小例子。

運作結果如下:

剛才示範了一個無參數的情況,那麼有參數的情況如何呢?

同樣的運作結果如下:

到這裡,關于Function的内容就算是鋪墊完成了。隻需要了解這

探究模闆的真實原理,有些語言中是編譯型的,有些是替換型的。但是不管是哪種類型,都離不開扣出變量關鍵字這個步驟。而這個過程用正規表達式基本上是最好的方法了。是以需要掌握一點相關的技巧。

在Nodejs中,使用正規表達式有兩種形式:

字面量: <code>/pattern/flags</code>

RegExp: <code>new RegExp(pattern, flags)</code>

關于正規表達式的具體的規則,鑒于篇幅很長,這裡就不再贅述了。有興趣的可以浏覽下面的這篇文章。

<a href="http://www.cnblogs.com/chenmeng0818/p/6370819.html" target="_blank">http://www.cnblogs.com/chenmeng0818/p/6370819.html</a>

根據一開始的設想,目标是擷取<code>{{}}</code> 和<code>{%%}</code> 這種文法下的變量名稱,然後替換成對應的變量值。 是以可以寫出如下的正規表達式:

預設規則如下:

在<code>{{}}</code> 中直接替換為變量名對應的值。

在<code>{%%}</code> 中的則是可以添加到函數體的代碼塊,要保留起來。

下面簡單的對照着實作一下。

實作結果:

運作效果:

剛才實作了隻有關鍵字的和有對象性質的參數的例子,但是實際中情況可能比這要複雜的多,比如混雜模式。接下來着手實作一下混雜模式下的替換政策。

關于正則這塊,大緻的内容就是這樣了。如果要想更簡單的調用,隻需要封裝起來,用外部參數代替就好了。

當然,注意變量名的命名風格。

廢話連篇說了兩個小節,還沒到正式的模闆制作。下面就整合一下剛才例子。模拟着實作一下好了。

來個不完整的代碼,示意一下算了。

同級目錄下生成的檔案内容為:

感覺效果還行,但是這裡面參數太固定化了,實際封裝的時候還需要酌情指定,不然這東西也就沒什麼卵用。

要是論實用性價值的話,這個不成熟的模闆實作思路毫無價值。但是對于我而言,用來格式化字元串倒是個不錯的選擇,估計我會把這個小思路封裝成一個小小的子產品,詳情可以關注我的GitHub的這個連結。

<a href="https://github.com/guoruibiao/have-fun-in-node">https://github.com/guoruibiao/have-fun-in-node</a>