過去的幾個月裏,漢吉斯特Hanjst進行了一些升級,有功能加強,也有性能優化,爲Hanjst的生產環境部署增磚添瓦、保駕護航。爲便於後續維護和持續更新改進,茲備忘於下。前端
當Hanjst遇到語法錯誤時,拋出可讀性的異常代碼描述,造成能夠追蹤的錯誤報告,其大體形式以下:
Hanjst template code exec failed.jquery
{「stack」:」ReferenceError: $myAds2 is not defined\n at eval (eval at renderTemplate (http://example.com/view/default/js/Hanjst.js?v=201906171103:468:15), :405:1)\n at renderTemplate (http://example.com//view/default/js/Hanjst.js?v=201906171103:468:39)\n at _callRender (http://example.com//view/default/js/Hanjst.js?v=201906171103:679:9)\n at http://example.com//view/default/js/Hanjst.js?v=201906171103:698:9\n at http://example.com//view/default/js/Hanjst.js?v=201906171103:701:3″,」message」:」$myAds2 is not defined」}編程
Line 404:瀏覽器
Line 405: if( $myAds2[‘sadplace’]==’homepage_up_right’){性能優化
Line 406: tpl2js.push(」 <a href=」」);服務器
根據這些具體到行號的錯誤提示信息,開發者能夠較快地找到出錯位置並進行修正。如上所示,代表在模板引擎進行解析時,發如今第405行有未定義的 $myAds2 這樣的變量未經初始化就開始使用,因此報錯。app
注意!值得注意! Hanjst 全程開啓 JavaScript 的 Strict mode,不容許使用未經定義的變量!異步
在第一版的 Hanjst模板引擎設計中,咱們假定模板的嵌套只有一層,也即一個模板中經過include 指令引入了另一個模板內容。
{include file=」$anotherTemplateFileContent」}
隨着 Hanjst 應用場景的複雜化,多層嵌套成爲必然,有鑑於此,咱們升級改進了 Hanjst,容許無限層的模板內容嵌套。也就是父頁面能夠引入嵌套子頁面,子頁面內也能夠進一步的嵌套引入孫頁面,如此遞歸不止。async
一般狀況下,若是循環一個數列,若是遇到輪空的狀況,默認咱們設計了給一個提示,以下所示。
{foreach $myList as $l}性能
//- some data
{foreachelse}
//- a warning…
{/foreach}
此次改進是在 「a warning」 部分給與有限功能的模板支持,好比容許使用變量進行替換操做等。
對嵌套頁面的腳本程序引入有兩種方式,一種是直接執行,另一種方式是記帳並延後進行引入。
其中後面一種異步的async方式,對提高頁面加載速度有很大幫助。因此在 Hanjst的改進中予以實現,當有非必要能夠延後加載的腳本,均可以經過 async方式安排當頁面首屏加載完成後再繼續。
上面是理想狀況,還有非理想的狀況時,當有些頁面元素還爲就緒時,一些依賴於其上的腳本就沒法執行,這時候就是無可奈何須要等頁面元素就緒後再加載腳本程序。
根據這些,咱們建議對象什麼類腳本程序能夠直接加載,而對對象的調用類腳本,通常都安排async異步加載爲好。
<!–
JavaScript codes which will be run only once after Hanjst’s work,
should be placed below here, after Hanjst, and keep in mind:
1) ‘use strict’ mode, add comma for each sentence;
2) src of Objects should be loaded in sync mode, e.g. jquery.min.js;
3) invokes with Objects should be loaded in async mode, e.g. base.js;
–>
這是改進是因爲 HTM自己限制致使的,根據實驗結果所示,瀏覽器的解析引擎進行頁面渲染時,若是是放入未關閉的 div 內的腳本,默認是不執行而直接跳過的。
如此以來,若是將 Hanjst 放入一個 div 元素,則默認隨頁面自動啓動的 Hanjst解析引擎啓動後,隨後的加載嵌套頁面的腳本等就沒法實現了。
有鑑於此,當 Hanjst啓動時,探測若是其父元素不是默認和預期的 body 時,就拋出異常進行報錯。
待開發者進一步解決問題以後再繼續。
當Hanjst進行編譯頁面時,原始代碼會曝露給調用者,儘管時間是 毫秒級(ms)的,但若是碰上較慢的網速,依然有不完美的「印象」。
爲此,咱們設計了當 Hanjst 工做時,前端預置一個」幕布」, loadingLayer , 顯示給用戶,當頁面完成編譯後,大幕揭開,完美呈現!
<div id=」Hanjstloading」 style=」width:100%;height:100%;z-index:99;opacity:0.92;position:absolute;background-color:#ffffff;」> Hanjst Loading… 加載中
Hanjst loading layer默認的元素id是 Hanjstloading, 也能夠經過啓動參數:
Hanjst.LoadingLayerId = ‘myLoadingLayer’;
來指定自定義的元素Id。
若是瀏覽器太老了,好比 微軟 IE瀏覽器,特別是8.0之前的版本,對JavaScript支持有限,沒法順利完成 Hanjst 的編譯與解析,就會出錯。
爲便於用戶感知這些,咱們改進 Hanjst 增長了對 MSIE太老版本的探測,並給用於相應的提示。
Hanjst可以表述邏輯控制,可以實現與服務器端模塊語言相同的功能。
Hanjst當徹底在客戶端解析時,節省服務器端計算資源;
Hanjst模板語言獨立,不與服務器端資源作任何綁定;
純粹的MVC,層間數據用JSON格式傳遞;
常見模板語言功能全支持,附帶複雜而強大的JavaScript編程能力;
無學習成本,直接使用JavaScript書寫模板語言;
….
-R/s2ST