Facebook奇特的页面加载技术

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

一、html代码

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

查看大图

二、JS代码

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

<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都是进行过编码,下面是解码后我们关注的代码:

<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是并行进行处理的,服务器处理完一部分数据就把已经处理好的数据交给浏览器进行呈现处理,自己再继续处理其他的数据。

时间: 2024-10-25 06:42:32

Facebook奇特的页面加载技术的相关文章

Firefox 跟踪保护技术将页面加载时间减少 44%

Mozilla开发者获得了Web 2.0 Security and Privacy 2015会议的最佳论文奖,他们的论文(PDF) 介绍了Firefox的跟踪保护技术.跟踪保护技术是一项新的隐私保护技术,通过屏蔽请求和跟踪域名去弱化侵入式的在线用户行为跟踪.Mozilla开发 者称,跟踪保护技术减少了Alexa Top 200新闻网站67.5%的HTTP cookies数量. 由于Firefox没有从跟踪域名下载和渲染内容,跟踪保护技术将Alexa Top 200新闻网站的页面加载时间减少了4

网页页面加载对用户访问的影响

页面访问慢是网站公认的死穴,如果页面都没法访问,往后再精彩的体验都等于零.这个问题如果专业点说,叫做"加载"呈现效率.那么具体了讲,除常规的服务器处理速度.服务器端网络带宽.客户端网络带宽等"硬"问题外,有哪些是技术上没处理好的"软"问题? 举个例子,某页面浏览到一个地方卡住了,至少要等十几秒才出来内容.排查原因,浏览其他网站页面很快,说明客户端网络带宽没问题:浏览同个服务器上其他网站页面都很快,说明服务器的处理速度和网络带宽也没问题.分析代码可

ASP.NET MVC中利用脚本优化提高页面加载速度:

在这里我们说一下脚本优化的三个方法: 一.在我们做Web开发的时候,当我们引用Js文件的时候,我们一般会将js文件放在文档的head标签中,这时当页面加载的时候,浏览器会按着由上到下的顺序,当浏览器遇到script标签时,它会阻止其他内容的下载,知道他检索完整个脚本,这样会减慢页面加载速度,因此,script标签应该尽可能的放到页面的底部(仅仅位于body结束标签之前)就会产生很好的用户体验. 二.另一种减少页面加载时间的技术就是精简自定义脚本.比如我们经常用到的jquery.validate.

JavaScript中的对象动态加载技术

 什么是JavaScript对象动态加载 JavaScript动态加载(JavaScript Object Dynamic Loading) - 之所以叫做动态,是应为其有别与通常的静态加载形式. 典型的JavaScript静态加载方式,是通过<script>标签将我们可能需要的所有JS文件依次嵌入到一个HTML页面中,当浏览器执行到<script> 标签,就会到我们指定的地方去加载JavaScript并运行,这时,文件中定义的无论方法.类.对象等,已经存在与浏览器,等待被使用.除

400% 的飞跃-web 页面加载速度优化实战

前言 一个网站的加载速度有多重要? 反正我相信之前来博主网站的人至少有 50% 在加载完成前关闭了本站. 为啥捏? 看图 首页完整加载时间 8.18s,看来能进来看博主网站的人都是真爱呀,哈哈. 正常来讲一个网页 4s 加载不完就会流失很大一部分用户,而博主的网站加载时间竟然达到了 8s 还是在电脑端,如果在移动端,加载时间会更久,体验会更差. 这样的话网站做得再难看批判者进不来不是白搭嘛,于是针对 web 页面加载速度的优化迫在眉睫. 基于博主以前优化过其他网站,于是博主准备把这次的优化过程记

javascript-JSP页面加载过程中阻塞与优化

问题描述 JSP页面加载过程中阻塞与优化 加载JSP页面时,由于初始化的js执行的方法与数据库进行大量的交互,造成阻塞,页面加载不完整,页面处于无响应状态,在加载时,添加一个超时方法,页面显示完整,页面处于无响应状态,如何优化 解决方案 参考Facebook的pipeline架构.页面分为许多pagelet,然后通过chunk-encoding来分块加载会好些.也就是在页面里一块一块加载. 还有,常用数据最好放在Redis中,数据库查询比缓存慢多了.

《jQuery Cookbook中文版》——1.2 在DOM加载之后、整个页面加载之前执行jQuery/JavaScript代码

1.2 在DOM加载之后.整个页面加载之前执行jQuery/JavaScript代码 1.2.1 问题 采用无干扰式JavaScript方法论的现代JavaScript应用程序通常只在DOM完全加载之后才执行JavaScript.实际情况是,任何DOM遍历和操纵都要求在操作之前必须加载DOM.需要一种手段来确定客户端(最常见的是Web浏览器)何时完成DOM的加载(这时图片和SWF文件等资源可能还没有完全加载).如果在这种情况下使用window.onload事件,包括所有资源的整个文档完全加载之后

异步加载技术实现当滚动条到最底部的瀑布流效果_php技巧

异步加载技术实现瀑布流效果.当滚动条到最底部的时候触发一个事件,这个事件写入$.get()事件,向内部程序页传递类别id和页码,程序将会返回那个类别下的相对页的产品列表,如果程序查询当前类无产品即返回空. 滚动条事件要写在window.onscroll中才有效判断.如下: window.onscroll=function(){<br> // var scrolltop=document.documentElement.scrollTop||document.body.scrollTop; va

js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)_javascript技巧

问题缘由:负责公司的开发平台研发工作,考虑的知识产权的保护工作,必须要考虑java的加密技术和js脚本的加密技术.在目前java加密很容易破解的情况下,还是先搞定js的加密和压缩,一方面可以提高页面加载性能,另外一方面也希望辛苦研发出来的成果得到一定的保护. 研究过程: 1.先强烈鄙视一下哪些随便转载文章的家伙,给我制造了很大的麻烦!!网上很多帖子都不靠谱.. 2.首先想了解jquery使用什么压缩的, 网上找了半天,说法不一样,后来还是在jquery官网的最频繁问题中找到了答案,但这已经是绕了