隨著web發展,前端應用變得越來越複雜,基於後端的JavaScript(Node.js)也開始嶄露頭角,此時JavaScript被寄予了更大的期望,與此同時JavaScript MVC思想也開始流行起來。JavaScript模板引擎作為數據與界面分離工作中最重要一環,越來越受開發者關注,近一年來在開源社區中更是百花齊放,在Twitter、淘寶網、新浪微博、騰訊QQ空間、騰訊微博等大型網站中均能看到它們的身影。
本文將用最簡單的示例代碼描述現有的JavaScript模板引擎的原理,包括新一代JavaScript模板引擎artTemplate的特性實現原理,歡迎共同探討。
artTemplate介紹
artTemplate是新一代JavaScript模板引擎,它採用預編譯方式讓性能有了質的飛躍,並且充分利用JavaScript引擎特性,使得其性能無論在前端還是後端都有極其出色的表現。在Chrome下渲染效率測試中分別是知名引擎Mustache與micro tmpl的25、32倍。
除了性能優勢外,調試功能也值得一提。模板調試器可以精確定位到引發渲染錯誤的模板語句,解決了編寫模板過程中無法調試的痛苦,讓開發變得高效,也避免了因為單個模板出錯導致整個應用崩潰的情況發生。
artTemplate這一切都在1.7kb(gzip)中實現!
JavaScript模板引擎基本原理
雖然每個引擎從模板語法、語法解析、變量賦值、字符串拼接的實現方式各有所不同,但關鍵的渲染原理仍然是動態執行JavaScript字符串。
關於動態執行JavaScript字符串,本文以一段模板代碼舉例:
這是一段非常樸素的模板寫法,其中,""為closeTag(邏輯語句閉合標籤),若openTag後面緊跟「=」則會輸出變量的內容。
HTML語句與變量輸出語句被直接輸出,解析後的字符串類似:
語法分析完畢一般還會返回渲染方法:
渲染測試:
在上面render方法中,模板變量賦值採用了with語句,字符串拼接採用數組的push方法以提升在IE6、7下的性能,jQuery作者john開發的微型模板引擎tmpl是這種方式的典型代表,參見:http://ejohn.org/blog/javascript-micro-templating/由原理實現可見,傳統JavaScript模板引擎中留下兩個待解決的問題:
1、性能:模板引擎渲染的時候依賴Function構造器實現,Function與eval、setTimeout、setInterval一樣,提供了使用文本訪問JavaScript解析引擎的方法,但這樣執行JavaScript的性能非常低下。
2、調試:由於是動態執行字符串,若遇到錯誤調試器無法捕獲錯誤源,導致模板BUG調試變得異常痛苦。在沒有進行容錯的引擎中,局部模板若因為數據異常甚至可以導致整個應用崩潰,隨著模板的數目增加,維護成本將劇增。
artTemplate高效的秘密
1、預編譯
在上述模板引擎實現原理中,因為要對模板變量進行賦值,所以每次渲染都需要動態編譯JavaScript字符串完成變量賦值。而artTemplate的編譯賦值過程卻是在渲染之前完成的,這種方式稱之為「預編譯」。artTemplate模板編譯器會根據一些簡單的規則提取好所有模板變量,聲明在渲染函數頭部,這個函數類似:
這個自動生成的函數就如同一個手工編寫的JavaScript函數一樣,同等的執行次數下無論CPU還是內存佔用都有顯著減少,性能近乎極限。
值得一提的是:artTemplate很多特性都基於預編譯實現,如沙箱規範與自定義語法等。
2、更快的字符串相加方式
很多人誤以為數組push方法拼接字符串會比+=快,要知道這僅僅是IE6-8的瀏覽器下。實測表明現代瀏覽器使用+=會比數組push方法快,而在v8引擎中,使用+=方式比數組拼接快4.7倍。所以rtTemplate根據JavaScript引擎特性採用了兩種不同的字符串拼接方式。
artTemplate調試模式原理
前端模板引擎不像後端模板引擎,它是動態解析,所以調試器無法定位到錯誤行號,而artTemplate通過巧妙的方式讓模板調試器可以精確定位到引發渲染錯誤的模板語句,例如:
artTemplate支持兩種類型的錯誤捕獲,一是渲染錯誤(Render Error)與編譯錯誤(Syntax Error)。
1、渲染錯誤
渲染錯誤一般是因為模板數據錯誤或者變量錯誤產生的,渲染的時候只有遇到錯誤才會進入調試模式重新編譯模板,而不會影響正常的模板執行效率。模板編譯器根據模板換行符記錄行號,編譯後的函數類似:
當執行過程遇到錯誤,立馬拋出異常模板對應的行號,模板調試器再根據行號反查模板對應的語句並列印到控制臺。
2、編譯錯誤
編譯錯誤一般是模板語法錯誤,如不合格的套嵌、未知語法等。由於artTemplate沒有進行完整的詞法分析,故無法確定錯誤源所在的位置,只能對錯誤信息與源碼進行原文輸出,供開發者判斷。
開源節流
artTemplate基於開源協議發布,無論是商業公司還是個人都可以免費在項目中使用,歡迎共同完善。
下載地址:https://github.com/aui/artTemplate
在線預覽:http://aui.github.com/artTemplate/
來自:騰訊cdc
(責任編輯:張紅月)