亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

高性能JavaScript模板引擎實現原理詳解

2019-11-20 13:13:20
字體:
來源:轉載
供稿:網友

隨著 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 倍。所以 artTemplate 根據 javascript 引擎特性采用了兩種不同的字符串拼接方式。

artTemplate 調試模式原理

前端模板引擎不像后端模板引擎,它是動態解析,所以調試器無法定位到錯誤行號,而 artTemplate 通過巧妙的方式讓模板調試器可以精確定位到引發渲染錯誤的模板語句,例如:

artTemplate 支持兩種類型的錯誤捕獲,一是渲染錯誤(Render Error)與編譯錯誤(Syntax Error)。

1、渲染錯誤

渲染錯誤一般是因為模板數據錯誤或者變量錯誤產生的,渲染的時候只有遇到錯誤才會進入調試模式重新編譯模板,而不會影響正常的模板執行效率。模板編譯器根據模板換行符記錄行號,編譯后的函數類似:

當執行過程遇到錯誤,立馬拋出異常模板對應的行號,模板調試器再根據行號反查模板對應的語句并打印到控制臺。

2、編譯錯誤

編譯錯誤一般是模板語法錯誤,如不合格的套嵌、未知語法等。由于 artTemplate 沒有進行完整的詞法分析,故無法確定錯誤源所在的位置,只能對錯誤信息與源碼進行原文輸出,供開發者判斷。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
青草青草久热精品视频在线观看| 欧美日本高清一区| 欧美性生活大片免费观看网址| 日韩综合中文字幕| 亚洲第一精品久久忘忧草社区| 91国产中文字幕| 久久综合久久88| 欧美重口另类videos人妖| 韩国美女主播一区| 亚洲欧美另类国产| 91黑丝高跟在线| 95av在线视频| 国产激情久久久久| 国产精品第三页| 欧美一性一乱一交一视频| 蜜臀久久99精品久久久久久宅男| 久久久欧美一区二区| 日韩在线免费观看视频| 中文字幕亚洲综合| 成人自拍性视频| 国产精品久久久av| 亚洲精选一区二区| 亚洲天堂成人在线| 亚洲一区二区三区成人在线视频精品| 久久久精品一区| 国产亚洲一级高清| 国产一区深夜福利| 欧美中文字幕第一页| 亚洲自拍偷拍在线| 欧美日韩久久久久| 欧美精品国产精品日韩精品| 91在线中文字幕| 91精品国产91久久久久| 国模精品视频一区二区| 美女撒尿一区二区三区| 国产精品久久久久久亚洲调教| 国产精品日日摸夜夜添夜夜av| 久久久久久久久电影| 国语自产偷拍精品视频偷| 亚洲最大成人网色| 88国产精品欧美一区二区三区| 在线午夜精品自拍| 亚洲国产另类 国产精品国产免费| 亚洲精品第一页| 久久91精品国产91久久久| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲一区二区三区777| 亚洲国产精品视频在线观看| 欧美香蕉大胸在线视频观看| 欧美黄色片免费观看| 中文欧美日本在线资源| 亚洲成人xxx| 欧美福利视频网站| 亚洲综合小说区| 57pao精品| 欧美视频国产精品| 亚洲欧美成人精品| 日韩精品视频在线播放| 精品久久久久久中文字幕大豆网| 欧美在线视频一区二区| 91久久久精品| 久久久久久欧美| 国产精品福利网| 欧美猛男性生活免费| 欧美插天视频在线播放| 日韩在线观看高清| 亚洲三级免费看| 91在线高清视频| 日韩视频免费中文字幕| 日本精品va在线观看| 伊人久久免费视频| 亚洲精品日韩久久久| 国产日韩欧美在线视频观看| 国产欧美韩国高清| 欧美视频裸体精品| 久久在精品线影院精品国产| 国产成人亚洲精品| 日韩电影中文字幕在线| 久久理论片午夜琪琪电影网| 97国产精品人人爽人人做| 主播福利视频一区| www国产亚洲精品久久网站| 黑人狂躁日本妞一区二区三区| 日韩欧美精品中文字幕| 欧美午夜精品伦理| 欧美激情一区二区三区高清视频| 色悠久久久久综合先锋影音下载| 亚洲欧美国产日韩天堂区| 动漫精品一区二区| 成人激情电影一区二区| 国产一区二区黑人欧美xxxx| 亚洲欧美www| 亚洲欧美日韩一区二区三区在线| 国产精品av在线播放| 欧美日韩中文在线观看| 亚洲人成自拍网站| 久久精品电影一区二区| 亚洲丁香婷深爱综合| 亚洲最大av在线| 国产一区二区三区视频在线观看| 黑人巨大精品欧美一区二区| 精品一区电影国产| 国内精品模特av私拍在线观看| 国产午夜精品免费一区二区三区| 国产精品jizz在线观看麻豆| 欧美成aaa人片在线观看蜜臀| 欧美极品xxxx| 国产精品视频资源| 亚洲国产日韩精品在线| 日韩一区二区在线视频| 日本精品在线视频| 88国产精品欧美一区二区三区| 欧美日韩国产第一页| 亚洲第一精品福利| 亚洲一区二区免费在线| 成人xvideos免费视频| 日本免费一区二区三区视频观看| 国产精品日韩在线观看| 久久久久久国产精品美女| 中国人与牲禽动交精品| zzjj国产精品一区二区| 欧美视频免费在线| 欧美激情一区二区三区久久久| 亚洲精品久久久久久下一站| 一区二区在线视频| 亚洲欧美日韩天堂一区二区| 久久精品影视伊人网| 日韩在线视频中文字幕| 日韩欧美在线观看视频| 日本韩国欧美精品大片卡二| 亚洲第一二三四五区| 国产精品久久久久一区二区| 91久久精品久久国产性色也91| 亚洲图片欧美日产| 成人精品久久av网站| 亚洲国产天堂网精品网站| 国产精品综合不卡av| 欧美情侣性视频| 欧美日韩精品中文字幕| 在线免费观看羞羞视频一区二区| 亚洲2020天天堂在线观看| 亚洲国产成人91精品| 亚洲精品电影网站| 国产91av在线| 中文字幕日韩欧美精品在线观看| 亚洲欧美一区二区三区情侣bbw| 欧美日韩成人精品| 2019中文字幕在线免费观看| 欧美亚洲一级片| 宅男66日本亚洲欧美视频| 欧美性受xxx| 精品自拍视频在线观看| 色偷偷91综合久久噜噜| 欧美亚洲一区在线| 亚洲第一男人天堂| 久久噜噜噜精品国产亚洲综合| 国产精品综合不卡av| 国产成人精品在线视频| 久久精品欧美视频| 国产精品女视频| 亚洲美女视频网| 久久久久久久久网站| 成人精品视频99在线观看免费| 国产精品久久久久影院日本|