名站技术分析 — facebook奇特的页面加载技术

简介:

 没事使用代理上了下facebook,注册进入个人首页后,习惯性的查看源代码,发现了1个很有意思的现象,首页内容不少,但源代码中HTML的代码却很少,但去多出了很多段的javascript代码,这些js代码都是用于动态生成html的,facebook为什么需要这样做了?出于职业习惯,研究研究:

 

一、html代码。

     先看看首页查看的源代码,因为源代码比较大,所以把图片压缩了下,可能看不太清楚,只需要注意图中红色是html代码,其余黑压压一片的就全部是JS代码:

 

二、JS代码

     看到黑压压的JS代码是不是被吓一跳,下面就截取一段JS来分析(其余段的JS都是类似的),facebook源代码中充斥了类似于下面的JS代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script>
big_pipe.onPageletArrive({
     "id" : "pagelet_welcome_box" , "phase" :1, "is_last" : false , "append" : false , "bootloadable" :[],
     "css" :[ "lDRwi" , "eon+N" ],
     "js" :[ "F+B8D" , "IdQlc" ],
     "resource_map" :[], "requires" :[], "provides" :[],
     "onload" :[ "window.__UIControllerRegistry[\"c4c13a3ed2dd1e0e349b72\"] = new UIPagelet(\"c4c13a3ed2dd1e0e349b72\", \"\\\/pagelet\\\/generic.php\\\/WelcomeBoxPagelet\\\/\", {}, {});; ;" ],
     "onafterload" :[], "onpagecache" :[], "onafterpagecache" :[], "refresh_pagelets" :[], "invalidate_cache" :[],
     "content" :{
         "pagelet_welcome_box" : "<div id=\"c4c13a3ed2dd1e0e349b72\"><div class=\"UIImageBlock clearfix fbxWelcomeBox\"> ...这里省略N多HTML"
         },
     "page_cache" : true
});
</script>

 

让我们再看看big_pipe.onPageletArrive函数到底做了什么了?我们只关注参数中的id,js,css,content4个参数,可以看出js和css都是进行过编码,下面是解码后我们关注的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<script>
big_pipe.onPageletArrive({
     "id" : "pagelet_welcome_box" ,
     "css" :{
         name: "css/c5mv8gd5gwoc4kk0.pkg.css"
         permanent: true
         src: "http://static.ak.fbcdn.net/rsrc.php/zBP3B/hash/abee68r4.css"
         type: "css"
     },
     "js" :{
         name: "js/19khsprwvtvokwow.pkg.js"
         permanent: false
         src: "http://static.ak.fbcdn.net/rsrc.php/zAVXU/hash/e8mwcqsi.js"
         type: "js"
     },
     "content" :{
         "pagelet_welcome_box" : "<div id=\"c4c13a3ed2dd1e0e349b72\"><div class=\"UIImageBlock clearfix fbxWelcomeBox\"> ...这里省略N多HTML"
         }
});
</script>

看到还原后的JS,你应该猜出onPageletArrive函数是干嘛的吧,其实onPageletArrive最主要实现就是把"content"中的html内容插入到对应id(上面的"pagelet_welcome_box")的html元素中,并下载对应的css和JS。

 

三、chunk、flush

      看到上面的分析后,大家一定奇怪,facebook为什么要生成那么多段JS,再用js去动态插入html代码,这不是脱了裤子放屁,多此一举吗?还不如直接生成html代码了。facebook当然不会那么笨了,让我们先监控下facebook的http请求,监控图如下:

      注意上图中红色部分,原来facebook使用了chunk对页面进行分块输出。这就比较容易理解了,facebook首页的js代码段不是1次就全部输出的,而是一段一段进行输出的。

      什么是chunk和如何使用chunk,请参考我的另1篇博文:flush让页面分块,逐步呈现

 

总结

     facebook使用chunk技术让页面分块输出成很多JS段,这样做的好处就是服务器和客户端可以并行进行处理,不用等服务器全部处理完毕,客户端才进行处理。

     举个博客园首页的列子,博客园首页分为下面几块("推荐博客排行","首页随笔列表","最新新闻"...),

     我们一般对该http请求处理如下:

         1. 浏览器发送http请求

         2. 服务器处理请求(从缓存读取前50个推荐博客,从数据库读取"首页随笔列表",从数据库读取"最新新闻"),生成首页的html代码。

         3. 服务器发送html代码给客户端

         4、浏览器接收到响应,处理html(下载css,js,image,执行js等等)

    可以看出传统的http请求4个过程中,每个过程都必须等待前1个过程完成后才能执行,这样就存在很大的资源浪费。

 

    facebook的对该http请求的处理如下:

        1. 浏览器发送http请求

        2. 服务器处理请求(从缓存读取前50个推荐博客,生成"推荐博客"的js代码段,flush输出该代码段,

      服务器继续读取"首页随笔列表",并生成输入js代码段。

      服务器继续读取"最新新闻",并生成输入js代码段。

        3. 浏览器接收到js代码段,下载该代码段所需的js和css。插入html代码。

     在这个处理流程中,最大的特点就是2,3是并行进行处理的,服务器处理完一部分数据就把已经处理好的数据交给浏览器进行呈现处理,自己再继续处理其他的数据。

 

PS:文章看完了,有些同学可能会想,为什么不像博客园一样,前台全部用ajax来异步读取"推荐博客" ,“最新新闻”的数据了,这样做就不会出现因为要处理太多数据而让客户端等待太久的问题了。我觉得对于facebook这种并发量巨大的网站,使用这种方法无疑会产生太多的请求,比如facebook首页用了14个chunk,如果使用ajax,则需要多14个request请求,这将增加不少服务器的压力吧。     

 

相关文章: 名站技术分析 — 浅谈tudou.com首页图片延迟加载的效果














本文转自BearRui(AK-47)博客园博客,原文链接:  http://www.cnblogs.com/BearsTaR/archive/2010/06/18/facebook_html_chunk.html  ,如需转载请自行联系原作者


相关文章
|
4天前
|
机器学习/深度学习 自然语言处理 搜索推荐
【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术QueSearch(下)
【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术QueSearch(下)
9 0
|
4天前
|
机器学习/深度学习 存储 自然语言处理
【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术QueSearch(上)
【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术QueSearch(上)
12 0
|
5月前
|
数据可视化
R语言ggplot2 对Facebook用户数据可视化分析
R语言ggplot2 对Facebook用户数据可视化分析
|
iOS开发
|
前端开发 JavaScript 容器
【React高级技术】合成事件以及 Test Utilities测试框架在Facebook内部进行测试
【React高级技术】合成事件以及 Test Utilities测试框架在Facebook内部进行测试
|
算法 vr&ar
拒绝晕眩呕吐,Facebook 公布 VR 全景视频稳定技术
VR 晕动症是一个一直未能很好解决的问题,除了硬件方面未能取得突破外,软件部分也是一个原因,特别是 VR 全景视频,如果使用手持式的全景相机拍摄,画面的抖动会进一步加速 VR 晕动症的产生。
194 0
拒绝晕眩呕吐,Facebook 公布 VR 全景视频稳定技术
|
SQL 机器学习/深度学习 人工智能
顶尖架构师能从Google、Facebook、Netflix等公司学到哪些技术?
  架构设计到底是做什么?每个人都有不同的答案,毕竟在不同的时间,不同的系统层级,不同的需求背景上,架构设计的任务都有所不同。那么换另外一个问题,如何成为顶尖的架构师?   先使用程序员的拆分技能:成就优秀需要划分两个阶段,先成为普通的架构师,然后再想办法成就优秀。   虽然 2022 年已经过了六分之一,但我们的新年也就刚开始,常言道种树最好的时间是十年前,其次是现在,学习架构也是一样,希望以下的学习小结可以给你帮助。
192 0
|
机器学习/深度学习 人工智能 大数据
|
机器学习/深度学习 算法 决策智能
【重磅开源】Facebook开源 Nevergrad:一种用于无梯度优化的开源工具
【重磅开源】Facebook开源 Nevergrad:一种用于无梯度优化的开源工具
179 0