WebQQ 2.0实现分析(一)
来源:互联网 发布:mac电脑如何格式化u盘 编辑:程序博客网 时间:2024/06/11 18:21
Web前端开发听上去并不是一份牛逼的工作,但如果你的Web前端开发搞的很牛逼,那么你一定是做到了Steve Souders提到的那14条,个人认为如果前端开发有什么所谓的金科玉律,应该就是指他们了。Yahoo!后来还据此专门为Firebug开发了一个插件:YSlow。
闭门造车不是个好主意,Web QQ 2.0的前端我认为做的很有创意,所以我准备停下来,认真分析一下其实现。在开始分析之前,先来了解一些基础知识。
基础知识
那些不得不说的工具
“工欲善其事,必先利其器”,我所使用的分析工具简单而强大,上文已经提到过:Firebug + YSlow,显然,你还需要一个FireFox(推荐使用FX 3.6,4.0的组件比较少吧?)。
一次页面访问的执行顺序是怎样的?
当用户通过浏览器访问指定页面(url)时,浏览器将其包装为一个http请求,该请求除包含待访问页面地址及若干参数(可选)外,还包含了用户的浏览器及操作系统信息,语言、编码信息,缓存信息及其它一些浏览器配置信息等。
这是请求http://web2.qq.com/时的头信息(部分):
这是对上述请求的响应的头信息:
关于http请求的更多内容见这里。
一次http请求的执行顺序是怎样的?
从浏览器发出http请求,到收到服务器响应,整个过程通常可能持续几毫秒到几秒不等的时间,其顺序如下:
- 域名解析:时间一般比较短(n ms),取决于所访问站点隶属的DNS服务器及网络环境。
- 建立连接:时间一般稍长(n*10^1 ms),取决于所访问站点对应服务器及网络环境。
- 发送请求:时间一般很短(接近于0 ms),取决于本地浏览器。
- 等待响应:时间一般稍长(n*10^1 – n*10^3 ms),取决于所访问站点对应服务器的处理效率及网络环境。
- 接收数据:时间一般稍长(n*10^1 – n*10^3 ms),取决于请求内容的多少及网络环境。
下面将根据http请求发送顺序具体分析webqq 2.0的http请求。
http请求分析
分析之前,先看一张图,这是http请求序列中的一小部分(由于Web QQ 2.0资源更新比较频繁,内容不尽相同,但影响不大)。后面还会有更加详细的分解:
我们注意到图中有颜色为蓝色和红色的两条竖线,蓝色线表示页面的所有DOM(文档对象模型)加载完成,为DomContentLoaded
事件的触发点,jQuery的$(document).ready()
将开始执行,IE不支持该事件;红色线为文档load
事件的触发点,意味着所有内容加载完毕(含图片资源等),window.onload()
将会被执行。
1. 加载页面
首先看一下具体响应页面内容(这也是上图中的第一个http请求)。为了方便,我直接将分析内容以注释形式夹在其中(位于对应内容上方):
如果在没有缓存的情况下,下载该页面(大约1.4K)可能耗费n ms的时间,资源的加载时间与其大小成正比(同时受当时网络环境影响)。
通过Firebug查看该页面效果是这样的:
2. 加载资源
正如我们在前面的序列图中看到的,浏览器在处理返回的页面过程(从上到下顺序执行,遇到错误将中止)中,该页面所使用(直接使用)的脚本及样式表会依次加载。加载过程是异步的,后续资源不需要等待前面的资源加载完成,但如果遇到内联或外联脚本,则需等待脚本执行后才能继续。因此,如果可能,将脚本置于页面底部是明智的选择:
- Line 20: http://web2.qq.com/js/jet.all.js?t=20101014002
- Line 22: http://hp.qq.com/webqqpic/style/jet.all.css?t=20101014002
- Line 23: http://hp.qq.com/webqqpic/style/qqweb.main.css?t=20101014002
- Line 66: http://pingjs.qq.com/tcss.ping.js
- Line 78: http://web2.qq.com/js/qqweb.all.js?t=20101014002
3. 执行页面
接下来便是执行脚本以及加载各DOM所需的资源并完成元素绘制。
- Line 25:内联脚本功能为加载当前使用的主题样式,并将所加载的样式表嵌入到Line 24对应的结点中。
- Line 43:针对触屏用户添加触屏响应,将其置入一个
iframe
中。 - Line 47:样式填充——加载logo(背景图片元素,由qqweb.main.css给出)。
- Line 75:内联脚本功能为处理缓存(cookie)并发送统计信息。
通过上面的http请求顺序,我们也能够看出:页面执行是从上到下的,DOM元素(如Line 47的logo)必须等到前面的脚本(Line 25)执行完毕才能开始绘制,这也印证了我们上文提到的尽量将脚本放在页面底部的必要性。当然,如果脚本本身不需要立即执行(如这里的jet库),放在页面顶部反而是必须的,后续脚本的执行依赖它们,需要等待其加载完成才能继续执行,前面序列图的时间线已经很好的证明了这一点。
Web QQ的实现逻辑全部位于上文分析的页面底部的javascript文件qqweb.all.js中,其实现基于JET。
欲知后事,且听下回……
- WebQQ 2.0实现分析(一)
- WebQQ 2.0实现分析(一)
- 关于WEBQQ的实现(一)
- 模拟登陆webqq总结(一)
- webqq登录协议分析
- webQQ消息分析
- WebQQ分析|qq登陆|--不断更新
- WEBQQ通讯协议分析--前言
- WebQQ
- WEBQQ
- webQQ
- WebQQ
- 关于WEBQQ的实现(二)
- 利用webQQ实现聊天机器人。。
- 腾讯WebQQ聊天架构分析1
- WebQQ协议分析(1)——登录
- WebQQ协议分析——目录
- WebQQ协议分析(1)——登录
- 让记录成为一种习惯
- (转)C++继承中的重载、覆盖和隐藏
- windows service
- Eval() 的常用格式
- js window.open 传递中文参数出现乱码解决办法
- WebQQ 2.0实现分析(一)
- 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--听听低级建模的故事(五)
- Apache-ApacheBench(ab)网站压力测试
- JQuery radio,select选中与取值
- DEL命令
- 关于Net::FTP
- VMWare克隆或复制Linux虚拟机后eth0找不到的解决方案
- Linux内核中读写文件数据的方法
- VS提示真让人蛋疼 也许看久了 习惯就好