高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现


Posted in Javascript onJune 19, 2010

一般大家在处理这种情况,都使用ajax,先把html输出到客户端,然后再用ajax取加载比较耗时的资源。用ajax麻烦的地方是增加了请求数,而且需要写额外的js代码、和js调用的请求接口。
正对这种情况,还有一种处理方法,就是让response分块编码进行传输。response分块编码,可以先传输一部分不需要处理的html代码到客户端,等其他耗时代码执行完毕后再传输另外的html代码。
分块编码(chunked encoding)
chunked encoding 是http1.1 才支持编码格式(当然目前没有哪个浏览器不支持1.1了),chunked encoding 与一般的响应区别如下:

正常的响应: 
HTTP/1.1 200 OK 
Cache-Control: private, max-age=60 
Content-Length: 75785 
Content-Type: text/html; charset=utf-8 
..其他response headers 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

chunked encoding 响应: 
HTTP/1.1 200 OK 
Cache-Control: private, max-age=60 
Content-Length: 75785 
Content-Type: text/html; charset=utf-8 
Transfer-Encoding: chunked 
..其他response headers 
chunk #1(这里通常是16进制的数字,标志这个块的大小) 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN".... 
chunk #2 
<div ..... 
chunk #3 
....</body></html>

实例(JSP)
一个简单的页面,分为头部(header)和内容(部分),假设内容部分需要读取数据库,花费3秒时间,然后显示csdn的logo。header部分显示cnblogs的logo。代码如下:
<body> 
<div id="head" style="border:1px solid #ccc;"> 
cnblogs logo <img src="/upload/201006/20100619130753913.gif" /> 
</div> 
<br /> 
<div id="content" style="border:1px solid blue;"> 
<% 
// 睡眠3秒 
Thread.currentThread().sleep(3000); 
%> 
csdn logo<br /> 
<img src="/upload/201006/20100619130753558.gif" /> 
</div> 
</body>

演示地址:http://213.186.44.204:8080/ChunkTest/nochunk.jsp (服务器比较差,请大家温柔点)
打开这个演示地址发现很正常的页面,在3秒后才开始下载显示2个logo,资源加载瀑布图如下:
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
现在把代码改成如下,加上flush,让response把之前的html分块输出:
<div id="head" style="border:1px solid #ccc;">
cnblogs logo <img src="/upload/201006/20100619130753913.gif" /> 
</div> 
<% 
out.flush(); // flush response,分块输出 
%> 
<br /> 
<div id="content" style="border:1px solid blue;"> 
<% 
// 睡眠3秒 
Thread.currentThread().sleep(3000); 
%> 
csdn logo<br /> 
<img src="/upload/201006/20100619130753558.gif" /> 
</div>

演示地址:http://213.186.44.204:8080/ChunkTest/chunk.jsp
打开这个演示地址,是不是发现cnblogs logo先下载显示出来,3秒后csdn logo才显示,资源加载图如下:
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
从这个图发现,cnblogs的logo在jsp页面还没执行完就开始下载了,这就是分块输出的效果。

监控工具:

      如何知道我们是否成功使用了chunk encoding了 ,只要用工具查看response header 中是否包含了Transfer-Encoding: chunked,如果包含了,则是分块了。但要想监控分块的详细信息,据我所知,目前只有httpwatch支持,可以查看我们到底分了多少块,但是数量好像都多显示了1个,如下图:

     高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现

Javascript 相关文章推荐
JavaScript 拾漏补遗
Dec 27 Javascript
javascript时间函数基础介绍
Mar 28 Javascript
JavaScript获取页面上被选中文字的方法技巧
Mar 13 Javascript
jQuery检查事件是否触发的方法
Jun 26 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
Jul 31 Javascript
基于jquery实现省市区三级联动效果
Dec 25 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
Jun 06 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
Dec 01 Javascript
JavaScript严格模式详解
Jan 16 Javascript
Bootstrap 响应式实用工具实例详解
Mar 29 Javascript
Dropify.js图片宽高自适应的方法
Nov 27 Javascript
微信小程序开发注意指南和优化实践(小结)
Jun 21 Javascript
WEB高性能开发之疯狂的HTML压缩
Jun 19 #Javascript
Html中JS脚本执行顺序简单举例说明
Jun 19 #Javascript
js parseInt(&quot;08&quot;)未指定进位制问题
Jun 19 #Javascript
ExtJs grid行 右键菜单的两种方法
Jun 19 #Javascript
JavaScript中也使用$美元符号来代替document.getElementById
Jun 19 #Javascript
javascript,jquery闭包概念分析
Jun 19 #Javascript
基于jquery的滚动新闻列表
Jun 19 #Javascript
You might like
PHP file_exists问题杂谈
2012/05/07 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
JavaScript XML操作 封装类
2009/07/01 Javascript
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
JavaScript中string对象
2015/06/12 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
2019/02/26 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
Python新手们容易犯的几个错误总结
2017/04/01 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
Python实现八皇后问题示例代码
2018/12/09 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
python中tab键是什么意思
2020/06/18 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
年度考核自我鉴定
2013/11/09 职场文书
顶岗实习计划书
2015/01/16 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
2015年小学语文教师工作总结
2015/10/23 职场文书
OpenFeign实现远程调用
2022/08/14 Java/Android