高性能JavaScript模板引擎原理解析

2020-12-21 CSDN技術社區

隨著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

(責任編輯:張紅月)

相關焦點

  • 如何創建以EJS為模板引擎的Node.js項目
    Node.js技術expressejsJavaScript在創建Node.js項目時,可以使用不同的JavaScript模板引擎那麼,如何在Node.js項目中使用EJS模板引擎呢?下面利用實例說明:操作步驟:1、打開WebStorm工具,點擊File--->New--->Project,輸入項目名稱,然後選擇EJS模板引擎
  • 前端模板的原理與實現
    套頁面的過程實際就是將靜態頁面變成切割成一塊塊,每一塊都是一個php,jsp或vm文件,它們是後端模板引擎的處理對象! 其實模板是不局限於後端還是前端的, 模板的本質是用於從數據(變量)到實際的視覺表現(HTML代碼)這項工作的一種實現手段。由於後端近水樓臺先得月(取數據比較方便),因此先在後端發展出這種技術。
  • 如何使用JavaScript實現前端導入和導出excel文件
    1.2 實現一鍵導入excel文件並生成table表格導入excel文件的功能我們可以用javascript原生的方式實現解析, 比如可以用fileReader這些原生api,但考慮到開發效率和後期的維護, 筆者這裡採用antd的Upload組件和XLSX來實現上傳文件並解析的功能.
  • 在HTML中使用JavaScript實例代碼「言午」
    defer,charset,src,type, async(可選):關鍵詞:異步腳本,外部文件,立即下載;當標籤中包含這個屬性時會立即下載腳本(外部文件),只對外部腳本文件有效,下載的同時可以進行頁面的其他操作,下載完成後停止解析並執行
  • 油冷式引擎,Bosch噴射技術,怠速啟停系統,PGO高性能摩託車!
    油冷式引擎,Bosch噴射技術,怠速啟停系統,PGO高性能摩託車!PGO的J-BuBu系列又有新車了!最新作品系J Bubu S,採用全新ROBUST 4V 125油冷式引擎,搭載全球知名BOSCH新一代噴射系統,油冷式設計能大幅提升引擎散熱效率,長時間更確保高速運轉耐久犀利,根據廠方數據說明,這副機器強有陽極處理NASA高溫鋁合金科技活塞、以及BOSCH EMS數位引擎管理系統之外,更搭配HTR高滾流比涵道設計、滾子式進排氣搖臂以及高剛性一體式汽缸頭,讓4V引擎高轉速、高馬力、高性能、長壽命的特性展露無疑
  • TouchGFX中Callback模板實現原理
    TouchGFX是用C++編寫的,藉助C++的模板特性,TouchGFX定義了一組Callback模板,基於此模板來實現上述響應的功能。在TouchGFX中,Callback模板的描述放在Callback.hpp文件中,在此定義了兩組模板:GenericCallback與 Callback模板。
  • 真空泵的工作原理?真空泵工作原理解析
    下面一起看下真空泵工作原理解析吧。真空泵工作原理解析——種類1)、水環式真空泵工作原理水環式真空泵葉片的葉輪偏心地裝在圓柱形泵殼內。泵內注入一定量的水。2)、旋片式真空泵工作原理旋片式真空泵(簡稱旋片泵)是一種油封式機械真空泵。其工作壓強範圍為101325~1.33×10-2(pa)屬於低真空泵。它可以單獨使用,也可以作為其它高真空泵或超高真空泵的前級泵。它已廣泛地應用於冶金、機械、軍工、電子、化工、輕工、石油及醫藥等生產和科研部門。3)、羅茨真空泵工作原理羅茨泵的工作原理與羅茨鼓風機相似。
  • Thymeleaf 3.0.6 發布,HTML 5 模板引擎
    Thymeleaf 是一個 XML/XHTML/HTML5 模板引擎,可用於 Web 與非 Web 環境中的應用開發。它是一個開源的 Java 庫,基於 Apache License 2.0 許可。
  • V2引擎,哈雷高性能巡航摩託車,1500cc排量,長途旅行很有範!
    V2引擎,哈雷高性能巡航摩託車,1500cc排量,長途旅行很有範!Dyna是哈雷最平穩的重型巡航摩託車,以低座位、座下電池箱和雙筒尾避震為記,配備風冷雙凸輪96V2引擎和高級的車架設計,Dyna絕對適合長途行車,不計入門級Sportster車系,車迷如想以最相宜的價錢去享受1584cc的V-Twin引擎大車,Dyna車系便是最適當的選擇,Dyna車系頭輪改用了新沙板,全新銀色車速表和追加燃油旅程倒數功能,眼前這臺DynaWide
  • Cookie手工注入攻擊原理及實例 詳細教程
    )javascript:alert(document.cookie="id="+escape("212"));回車,這裡會彈窗id=212;以後自己想去SQL注入,js裡面的參數可以自行修改的。第三步:刷新不含參數的網頁,返回正常。
  • SATO發布高性能工業型列印引擎S84-ex和S86-ex
    2015年2月5日(東京),SATO(佐藤), 作為條碼列印、標籤、EPC/RFID解決方案的行業先鋒,今天在亞太區發布一款新產品——高性能工業型列印引擎S84-ex和S86-ex,應用於紙箱、託盤和單個產品的識別,以及自動化。新一代SATO列印引擎兼具安心品質、非凡吞吐量和無比簡易的操作、安裝維保,引領行業前沿。
  • 如何利用MyEclipse開發工具開發基於Velocity模板的Web應用
    try {outTemplate =getTemplate("WebVelocityApp.html");}catch( ParseErrorException e ){request.setAttribute("errorText","不能對模板進行解析
  • 5 月份最熱門的 10 個 JavaScript 庫
    Chronoline.js是一個javascript的類庫用來幫助開發者創建一個按時間來展示的時間線。 整個時間線水平方向顯示,我們可以方便的顯示任何時間長度的事件,並且提供一個tooltip來展示事件詳細內容。
  • 雙缸引擎,1200cc排量,哈雷高性能摩託車,騎過的都說是好車!
    雙缸引擎,1200cc排量,哈雷高性能摩託車,騎過的都說好!XL1200N Nightster的引擎仍是Sportster家族內的那臺1200cc風冷V2引擎,五前速,皮帶傳動,和H-D最新的燃油噴注程序,排氣管尾部是斜切設計,令排氣聲與別不同,個人認為,XL1200N Nightster頗適合新手、或不是太高的人使用,因為它操控相當容易,加速表現也相當線性,容易掌握,車架反應又直接,再加上容易掌握的一檔表現,即使是女騎士也應可操控自如
  • Javascript.info - 更新頻率極高的Javascript免費開源電子教程
    Javascript.info 首頁截圖Javascript.info 依託 learn.javascript.ru 而來的,learn.javascript.ru 是俄羅斯最大的 JavaScript 教程和學習平臺之一。
  • LC8引擎,超級跑車,比寶馬HP2優秀,KTM高性能摩託車RC8R!
    LC8引擎,超級跑車,比寶馬HP2優秀,KTM高性能摩託車RC8R!在前幾年才面世的RC8,未夠一年便有高階型號RC8R推出,但留意這不是入替取代,而是把KTM superbike的家族成員擴大至有兩位成員,新車雖仍採用現在的LC8引擎,但缸徑擴大了2mm,令RC8R的排氣量由原來RC8的1148cc增加至1195cc,壓縮比也由12.5:1增加至13.5:1,排氣量和壓縮比同時增加,可以看到RC8R是一臺相當認真的超級跑車。
  • 詳細圖片解析漏電保護器的工作原理
    打開APP 詳細圖片解析漏電保護器的工作原理 發表於 2018-01-08 09:07:37