<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 36, comments - 419, trackbacks - 0, articles - 0
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    沒(méi)事使用代理上了下facebook,注冊(cè)進(jìn)入個(gè)人首頁(yè)后,習(xí)慣性的查看源代碼,發(fā)現(xiàn)了1個(gè)很有意思的現(xiàn)象,首頁(yè)內(nèi)容不少,但源代碼中HTML的代碼卻很少,但去多出了很多段的javascript代碼,這些js代碼都是用于動(dòng)態(tài)生成html的,facebook為什么需要這樣做了?出于職業(yè)習(xí)慣,研究研究:

     

    一、html代碼。

         先看看首頁(yè)查看的源代碼,因?yàn)樵创a比較大,所以把圖片壓縮了下,可能看不太清楚,只需要注意圖中紅色是html代碼,其余黑壓壓一片的就全部是JS代碼:

     

    二、JS代碼

         看到黑壓壓的JS代碼是不是被嚇一跳,下面就截取一段JS來(lái)分析(其余段的JS都是類似的),facebook源代碼中充斥了類似于下面的JS代碼:

     

    
    

     

    讓我們?cè)倏纯碽ig_pipe.onPageletArrive函數(shù)到底做了什么了?我們只關(guān)注參數(shù)中的id,js,css,content4個(gè)參數(shù),可以看出js和css都是進(jìn)行過(guò)編碼,下面是解碼后我們關(guān)注的代碼:

    看到還原后的JS,你應(yīng)該猜出onPageletArrive函數(shù)是干嘛的吧,其實(shí)onPageletArrive最主要實(shí)現(xiàn)就是把"content"中的html內(nèi)容插入到對(duì)應(yīng)id(上面的"pagelet_welcome_box")的html元素中,并下載對(duì)應(yīng)的css和JS。

     

    三、chunk、flush

          看到上面的分析后,大家一定奇怪,facebook為什么要生成那么多段JS,再用js去動(dòng)態(tài)插入html代碼,這不是脫了褲子放屁,多此一舉嗎?還不如直接生成html代碼了。facebook當(dāng)然不會(huì)那么笨了,讓我們先監(jiān)控下facebook的http請(qǐng)求,監(jiān)控圖如下:

          注意上圖中紅色部分,原來(lái)facebook使用了chunk對(duì)頁(yè)面進(jìn)行分塊輸出。這就比較容易理解了,facebook首頁(yè)的js代碼段不是1次就全部輸出的,而是一段一段進(jìn)行輸出的。

          什么是chunk和如何使用chunk,請(qǐng)參考我的另1篇博文:flush讓頁(yè)面分塊,逐步呈現(xiàn)

     

    總結(jié)

         facebook使用chunk技術(shù)讓頁(yè)面分塊輸出成很多JS段,這樣做的好處就是服務(wù)器和客戶端可以并行進(jìn)行處理,不用等服務(wù)器全部處理完畢,客戶端才進(jìn)行處理。

         舉個(gè)博客園首頁(yè)的列子,博客園首頁(yè)分為下面幾塊("推薦博客排行","首頁(yè)隨筆列表","最新新聞"...),

         我們一般對(duì)該http請(qǐng)求處理如下:

             1. 瀏覽器發(fā)送http請(qǐng)求

             2. 服務(wù)器處理請(qǐng)求(從緩存讀取前50個(gè)推薦博客,從數(shù)據(jù)庫(kù)讀取"首頁(yè)隨筆列表",從數(shù)據(jù)庫(kù)讀取"最新新聞"),生成首頁(yè)的html代碼。

             3. 服務(wù)器發(fā)送html代碼給客戶端

             4、瀏覽器接收到響應(yīng),處理html(下載css,js,image,執(zhí)行js等等)

        可以看出傳統(tǒng)的http請(qǐng)求4個(gè)過(guò)程中,每個(gè)過(guò)程都必須等待前1個(gè)過(guò)程完成后才能執(zhí)行,這樣就存在很大的資源浪費(fèi)。

     

        facebook的對(duì)該http請(qǐng)求的處理如下:

            1. 瀏覽器發(fā)送http請(qǐng)求

            2. 服務(wù)器處理請(qǐng)求(從緩存讀取前50個(gè)推薦博客,生成"推薦博客"的js代碼段,flush輸出該代碼段,

    服務(wù)器繼續(xù)讀取"首頁(yè)隨筆列表",并生成輸入js代碼段。

    服務(wù)器繼續(xù)讀取"最新新聞",并生成輸入js代碼段。

            3. 瀏覽器接收到j(luò)s代碼段,下載該代碼段所需的js和css。插入html代碼。

         在這個(gè)處理流程中,最大的特點(diǎn)就是2,3是并行進(jìn)行處理的,服務(wù)器處理完一部分?jǐn)?shù)據(jù)就把已經(jīng)處理好的數(shù)據(jù)交給瀏覽器進(jìn)行呈現(xiàn)處理,自己再繼續(xù)處理其他的數(shù)據(jù)。

     

    PS:文章看完了,有些同學(xué)可能會(huì)想,為什么不像博客園一樣,前臺(tái)全部用ajax來(lái)異步讀取"推薦博客" ,“最新新聞”的數(shù)據(jù)了,這樣做就不會(huì)出現(xiàn)因?yàn)橐幚硖鄶?shù)據(jù)而讓客戶端等待太久的問(wèn)題了。我覺(jué)得對(duì)于facebook這種并發(fā)量巨大的網(wǎng)站,使用這種方法無(wú)疑會(huì)產(chǎn)生太多的請(qǐng)求,比如facebook首頁(yè)用了14個(gè)chunk,如果使用ajax,則需要多14個(gè)request請(qǐng)求,這將增加不少服務(wù)器的壓力吧。     

     

    相關(guān)文章: 名站技術(shù)分析 — 淺談tudou.com首頁(yè)圖片延遲加載的效果



    [作者]:BearRui(AK-47)
    [博客]: http://www.tkk7.com/bearrui/
    [聲明]:本博所有文章版權(quán)歸作者所有(除特殊說(shuō)明以外),轉(zhuǎn)載請(qǐng)注明出處.
    英雄,別走啊,幫哥評(píng)論下:  

    精彩推薦 好文要頂 水平一般 看不懂 還需努力

    評(píng)論

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-06-17 15:15 by 特立獨(dú)行
    文章很精彩,推薦一下!

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-06-17 18:44 by rox
    好文章,頂一下!

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-06-17 20:21 by BearRui(AK-47)
    謝謝樓上二位支持...

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-06-18 01:05 by Jie
    文章很精彩,推薦一下!

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-06-18 16:34 by fanfan
    好文章!
    我后來(lái)想,為什么服務(wù)器對(duì)于分片的部分不能并行處理,然后一起發(fā)給客戶端,這樣效率不更高么?但是這樣的話,系統(tǒng)的瓶頸全聚集在server端,伸縮性更差了。

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-06-18 16:45 by BearRui(AK-47)
    @fanfan
    對(duì),服務(wù)器并行處理,就提高了服務(wù)器的壓力,而且要在服務(wù)器端用多線程進(jìn)行并行處理,代碼會(huì)寫的非常復(fù)雜。

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-06-18 21:39 by BeanSoft
    好文章,頂一下! 精品文章! 評(píng)論框也很棒!

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-06-18 21:49 by BearRui(AK-47)
    @BeanSoft
    老大經(jīng)常來(lái)捧場(chǎng)啊,非常感謝。

    現(xiàn)在怎么沒(méi)去看世界杯,呵呵。

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-06-24 11:50 by thomas sabo uhren sale
    寫的不錯(cuò),留著以后有用。

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-06-24 11:52 by authentic pandora charms
    呵呵喜歡

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-06-24 12:18 by BearRui(AK-47)
    謝謝支持,^_^

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2010-12-09 17:24 by liangkun
    有的不是很明白,

    # re: 名站技術(shù)分析 — facebook奇特的頁(yè)面加載技術(shù)  回復(fù)  更多評(píng)論   

    2014-04-11 19:51 by 墨菲
    不錯(cuò) 頂
    主站蜘蛛池模板: 美女视频黄频a免费观看| 日韩免费视频播播| 黄色a三级免费看| 亚洲免费视频播放| 亚洲一区二区三区香蕉| 国产免费黄色大片| 人禽杂交18禁网站免费| 日韩人妻无码精品久久免费一| 特级毛片A级毛片100免费播放| 午夜在线a亚洲v天堂网2019| 亚洲综合小说久久另类区| 亚洲精品狼友在线播放| 亚洲国产日韩成人综合天堂 | 日本免费人成黄页在线观看视频| 免费无码VA一区二区三区| 久久一区二区三区免费| 国产精品亚洲综合网站| 亚洲精品天堂无码中文字幕| 亚洲国产午夜电影在线入口| 亚洲色偷偷av男人的天堂| 亚洲成av人影院| 亚洲精品国产精品乱码在线观看| 中文字幕精品亚洲无线码二区| 亚洲精品视频免费观看| 亚洲精品专区在线观看| heyzo亚洲精品日韩| 亚洲国产婷婷综合在线精品| 亚洲精品麻豆av| 亚洲综合AV在线在线播放| 中文亚洲AV片在线观看不卡| 国产亚洲真人做受在线观看| 亚洲成AV人片一区二区密柚| 亚洲第一AV网站| 久久亚洲美女精品国产精品| 亚洲精品永久www忘忧草| 亚洲精品一区二区三区四区乱码| 亚洲国产成人在线视频| 亚洲 欧洲 自拍 另类 校园| 色偷偷噜噜噜亚洲男人| 一级特黄aaa大片免费看| 久青草视频在线观看免费|