久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

剝離模板代碼加速Web頁(yè)面加載 | Tencent AlloyTeam

 看見(jiàn)就非常 2012-08-02

開(kāi)篇

現(xiàn)在Web富應(yīng)用越來(lái)越多, 越來(lái)越多網(wǎng)站朝單頁(yè)面發(fā)展, 所有功能模塊都在一個(gè)頁(yè)面中創(chuàng)建. 作為一個(gè)合格的前端, 所負(fù)責(zé)的模塊一定是邏輯跟UI分離的, 通常的做法就是頁(yè)面代碼編寫(xiě)成模板, 然后往模板填充數(shù)據(jù)并輸出到頁(yè)面上. 關(guān)于前端模板的介紹和使用我就不說(shuō)了, 不了解的可以先看看這篇文章(http://www./archives/4564), 這里討論下使用模板引擎引入的另外一個(gè)問(wèn)題(也不是Bug啦~) — 頁(yè)面模板代碼放哪?

頁(yè)面模板代碼放哪

呼~(yú)~總算到正題了(- -||). 說(shuō)回來(lái), 頁(yè)面模板的代碼到底要放哪呢?

  1. 放在 js 文件中;
  2. 放在頁(yè)面不可見(jiàn)的地方, 比如 <script type=”text/plain”></script>標(biāo)簽內(nèi);

話(huà)說(shuō)很久很久以前, 我也是把模板寫(xiě)在js里面的, 然后需要修改的時(shí)候就崩潰了~ 在一堆字符串里面找到想要改動(dòng)的地方就像是在一坨黃色的屎里面找個(gè)金戒指(惡…). 過(guò)了不久學(xué)乖了, 把模板像寫(xiě)html那樣換行和縮進(jìn), 就跟下面一樣.

雙擊選中源代碼
1
2
3
4
5
var html = '\
    <div id="container">\
    <div>...</div>\
    <div>...</div>\
</div>'

然后代價(jià)是 — 要給會(huì)混淆的引號(hào)轉(zhuǎn)義以及每行末尾都要一個(gè)反斜杠! oh~天啊, 我可是程序員啊, 為什么要做這種重復(fù)無(wú)趣的工作!

于是很久很久以前的以后, 我又學(xué)乖了一次, 咱這次把模板寫(xiě)在html頁(yè)面里面, 放到一個(gè)特殊的script標(biāo)簽內(nèi), 用到的時(shí)候根據(jù)id找到這個(gè)script, 讀取innerHTML拿來(lái)用. 哇, 簡(jiǎn)直是perfect!~~吼吼~~

雙擊選中源代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * shot of getElementById
 * @param {String} id 
 */
this.get = function(id){
    return document.getElementById(id);
}
var templateList = {};
/**
 * 獲取頁(yè)面的一個(gè) html 模板
 * @param {String} tmplId 模板的 dom id
 */
this.getTemplate = function(tmplId){
    var tmpl = templateList[tmplId];
    if(!tmpl){
        var tmplNode = this.get(tmplId);
        tmpl = tmplNode.innerHTML;
        tmplNode.parentNode.removeChild(tmplNode);
        templateList[tmplId] = tmpl;//緩存起來(lái), 避免再次查找dom
    }
    if(!tmpl){
        throw new Error('no such template. [id="' + tmplId + '"]');
    }
    return tmpl;
}

模板的飛來(lái)橫禍

從此, 模板和頁(yè)面過(guò)著幸??鞓?lè)的生活…然后直到有一天…

A: 為什么打開(kāi)頁(yè)面的那個(gè)菊花轉(zhuǎn)那么久!

我:…

然后就如五雷轟頂般的醒悟, 由于是單頁(yè)面, 模板都堆積到頁(yè)面, 大大增加了首頁(yè)的大小, 沒(méi)什么邏輯的頁(yè)面竟然有37KB(gzip前). 更因?yàn)閖s/css/images等都放到了多臺(tái)cdn, 讀取速度快而且可以設(shè)置和利用瀏覽器cache. 而html頁(yè)面則只放在一臺(tái)web server, 而且因?yàn)榘姹镜容^快, 不能給html設(shè)置緩存策略(那樣會(huì)導(dǎo)致用戶(hù)那里不能及時(shí)更新).

王子和公主就這樣被硬生生拆散了~T_T

模板該放哪里

如果現(xiàn)在要我把模板都改成js變量, 放到j(luò)s文件里, 我一定死給他看, 哼~

然而, 只是, 可是, 但是, 加載速度還是得優(yōu)化啊. 既然開(kāi)發(fā)的時(shí)候要方便, 發(fā)布之后要速度, 那發(fā)布前用腳本把模板抽取到j(luò)s文件中不就結(jié)了? 頓時(shí)感覺(jué)柳暗花明又一村呀~~呼啦啦啦~~

抽取的步驟為:

  1. 在js文件中增加一個(gè)變量 templateList, 值為 {/*HtmlTemplates*/} (注: 其實(shí)什么都行啦, 這樣只是為了可以正常運(yùn)行以及不讓編輯器報(bào)錯(cuò)…);
  2. 編寫(xiě)腳本(nodejs/python/shell/etc.), 用正則把作為模板的script的id和innerHTML都匹配出來(lái), 拼裝成一個(gè)json字符串, 如: { “templateId1″: “value…..”, “templateId2″:”xxxx”} ;
  3. 讀取該js文件, 把 “ {/*HtmlTemplates*/} “替換成生成的json字符串;
  4. 修改getTemplate方法, 優(yōu)先從templateList查找模板;

至于抽取用什么語(yǔ)言寫(xiě)都沒(méi)所謂啦, 僅僅是正則和文件操作, 推薦用nodejs, 真是太方便了. 不過(guò)大部分機(jī)器都木有裝, 需要自己裝. 有些環(huán)境不能隨便裝新程序, 那也可以用python寫(xiě)個(gè), 花半個(gè)鐘現(xiàn)學(xué)現(xiàn)用就夠了. 附上個(gè)NodeJs版的.

雙擊選中源代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var fs = require('fs');
var inputHtmlFile = './index.html';
var outputHtmlFile = './out/index.html';
var inputJsFile = './js/mb.templates.js'
var outputJsFile = './out/js/mb.templates.js';
  
var content = fs.readFileSync(inputHtmlFile).toString();
var regex = /<script\s*id="(\w+)"\s*type="text\/plain"\s*>([\s\S]*?)<\/script>/ig;
  
var result = {};
content = content.replace(regex, function(m, $1, $2){
    result[$1] = $2.replace(/\n|\r/g, '');
    return '';
});
fs.writeFileSync(outputHtmlFile, content);
  
content = fs.readFileSync(inputJsFile).toString();
var templateStr = JSON.stringify(result);
content = content.replace('{%HtmlTemplates%}', templateStr);
fs.writeFileSync(outputJsFile, content);

收尾

經(jīng)過(guò)這么一搞, 把模板代碼抽出來(lái)之后, 首頁(yè)的大小立馬從37KB降到1.7KB. 雖然是個(gè)小技巧, 也足以成大謀. 那感覺(jué), 可是跟漲薪一樣爽哇~~

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多