国产成人啪精品视频免费网,国产亚洲精品aaaa片app,亚洲av综合色区无码二区爱av,日欧一片内射va在线影院

浙江省永康市錦尚庭門業(yè)

高性能JavaScript模板發(fā)動機(jī)原理解析

瀏覽: 作者: 來源: 時間:2024-05-21 分類:
隨著 web 發(fā)展,前端應(yīng)用變得越來越復(fù)雜,基于后端的 javascript(Node.js) 也開始嶄露頭角,此時 javascript 被寄予了更大的期望,與此同時 javascript MVC 思想也開始流行起來。javascript 模板引擎作為數(shù)據(jù)...

隨著 web 發(fā)展,前端應(yīng)用變得越來越復(fù)雜,基于后端的 javascript(Node.js) 也開始嶄露頭角,此時 javascript 被寄予了更大的期望,與此同時 javascript MVC 思想也開始流行起來。javascript 模板發(fā)動機(jī)作為數(shù)據(jù)與界面分離工作中最重要一環(huán),越來越受開發(fā)者關(guān)注,近一年來在開源社區(qū)中更是百花齊放,在 Twitter、淘寶網(wǎng)、新浪微博、騰訊QQ空間、騰訊微博等大型網(wǎng)站中均能看到它們的身影。

本文將用最簡單的示例代碼描述現(xiàn)有的 javascript 模板發(fā)動機(jī)的原理,包括新一代 javascript 模板發(fā)動機(jī) artTemplate 的特性實現(xiàn)原理,歡迎共同探討。

artTemplate 介紹

artTemplate 是新一代 javascript 模板發(fā)動機(jī),它采用預(yù)編譯方式讓性能有了質(zhì)的飛躍,并且充分利用 javascript 發(fā)動機(jī)特性,使得其性能無論在前端還是后端都有極其出色的表現(xiàn)。在 chrome 下渲染效率測試中分別是知名發(fā)動機(jī) Mustache 與 micro tmpl 的 25 、 32 倍。

除了性能優(yōu)勢外,調(diào)試功能也值得一提。模板調(diào)試器可以精確定位到引發(fā)渲染錯誤的模板語句,解決了編寫模板過程中無法調(diào)試的痛苦,讓開發(fā)變得高效,也避免了因為單個模板出錯導(dǎo)致整個應(yīng)用崩潰的情況發(fā)生。

artTemplate 這一切都在 1.7kb(gzip) 中實現(xiàn)!

javascript 模板發(fā)動機(jī)基本原理

雖然每個發(fā)動機(jī)從模板語法、語法解析、變量賦值、字符串拼接的實現(xiàn)方式各有所不同,但關(guān)鍵的渲染原理仍然是動態(tài)執(zhí)行 javascript 字符串。

關(guān)于動態(tài)執(zhí)行 javascript 字符串,本文以一段模板代碼舉例:

這是一段非常樸素的模板寫法,其中,”” 為 closeTag (邏輯語句閉合標(biāo)簽),若 openTag 后面緊跟 “=” 則會輸出變量的內(nèi)容。

HTML語句與變量輸出語句被直接輸出,解析后的字符串類似:

語法分析完畢一般還會返回渲染方法:

渲染測試:

由原理實現(xiàn)可見,傳統(tǒng) javascript 模板發(fā)動機(jī)中留下兩個待解決的問題:

1、性能:模板發(fā)動機(jī)渲染的時候依賴 Function 構(gòu)造器實現(xiàn),F(xiàn)unction 與 eval、setTimeout、setInterval 一樣,提供了使用文本訪問 javascript 解析發(fā)動機(jī)的方法,但這樣執(zhí)行 javascript 的性能非常低下。

2、調(diào)試:由于是動態(tài)執(zhí)行字符串,若遇到錯誤調(diào)試器無法捕獲錯誤源,導(dǎo)致模板 BUG 調(diào)試變得異常痛苦。在沒有進(jìn)行容錯的發(fā)動機(jī)中,局部模板若因為數(shù)據(jù)異常甚至可以導(dǎo)致整個應(yīng)用崩潰,隨著模板的數(shù)目增加,維護(hù)成本將劇增。

artTemplate 高效的秘密

1、預(yù)編譯

在上述模板發(fā)動機(jī)實現(xiàn)原理中,因為要對模板變量進(jìn)行賦值,所以每次渲染都需要動態(tài)編譯 javascript 字符串完成變量賦值。而 artTemplate 的編譯賦值過程卻是在渲染之前完成的,這種方式稱之為“預(yù)編譯”。artTemplate 模板編譯器會根據(jù)一些簡單的規(guī)則提取好所有模板變量,聲明在渲染函數(shù)頭部,這個函數(shù)類似:

這個自動生成的函數(shù)就如同一個手工編寫的 javascript 函數(shù)一樣,同等的執(zhí)行次數(shù)下無論 CPU 還是內(nèi)存占用都有顯著減少,性能近乎極限。

值得一提的是:artTemplate 很多特性都基于預(yù)編譯實現(xiàn),如沙箱規(guī)范與自定義語法等。

2、更快的字符串相加方式

很多人誤以為數(shù)組 push 方法拼接字符串會比 += 快,要知道這僅僅是 IE6-8 的瀏覽器下。實測表明現(xiàn)代瀏覽器使用 += 會比數(shù)組 push 方法快,而在 v8 發(fā)動機(jī)中,使用 += 方式比數(shù)組拼接快 4.7 倍。所以 artTemplate 根據(jù) javascript 發(fā)動機(jī)特性采用了兩種不同的字符串拼接方式。

artTemplate 調(diào)試模式原理

前端模板發(fā)動機(jī)不像后端模板發(fā)動機(jī),它是動態(tài)解析,所以調(diào)試器無法定位到錯誤行號,而 artTemplate 通過巧妙的方式讓模板調(diào)試器可以精確定位到引發(fā)渲染錯誤的模板語句,例如:

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

1、渲染錯誤

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

當(dāng)執(zhí)行過程遇到錯誤,立馬拋出異常模板對應(yīng)的行號,模板調(diào)試器再根據(jù)行號反查模板對應(yīng)的語句并打印到控制臺。

2、編譯錯誤

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

開源節(jié)流

artTemplate 基于開源協(xié)議發(fā)布,無論是商業(yè)公司還是個人都可以免費在項目中使用,歡迎共同完善。

下載地址:

https://github.com/aui/artTemplate

在線預(yù)覽:

http://aui.github.com/artTemplate/

反饋:

騰訊微博 | 新浪微博

欧美日韩精品一区二区在线观看| 成熟丰满熟妇AV无码区| 国产精品无码免费专区午夜| 久久综合无码中文字幕无码TS| 亚洲卡一卡2卡三卡4卡国色| 1000又爽又黄禁片45分钟| 国产成人精品一区二区三区免费| 精品亚洲AV无码喷奶水LIER| 久久精品一区二区三区中文字幕| 日本熟妇XXXX潮喷视频| 国产欧美日韩一区二区三区| 人人妻人人藻人人爽欧美一区| 亚洲日韩在线中文字幕综合| 色综合 图片区 小说区| 国内精品国产成人国产三级| 精品人成视频免费国产| 国语自产少妇精品视频| 疯狂做受xxxx高潮视频免费| 色综合视频一区二区三区44| 最新国产色视频在线播放| 国产SUV精品一区二区88L| 成人欧美日韩一区二区三区| 18禁黄无遮挡免费网站动漫| 麻婆豆传媒一区二区三区| 亚洲av无码片vr一区二区三区| 欧美精产国品一二三区别| 夜夜爽夜夜叫夜夜高潮| 国产农村妇女毛片精品久久| 国产果冻豆传媒麻婆精东| 国产真人无码作爱视频免费| 亚洲av成人一区二区三区在线观看| 人妻少妇精品一区二区三区| 精品亚洲一区二区三区在线观看| 国产真实强被迫伦姧女在线观看| 丰满爆乳肉感一区二区三区| 欧美男男激情VIDEOS高清| 国产在线精品观看免费观看| 国产免费牲交视频| 国产精品黑色丝袜高跟鞋| 国产宅男宅女精品A片在线观看| 国产成人综合亚洲看片|