高性能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 相关文章推荐
Jquery网页内滑动缓冲导航的实现代码
Apr 05 Javascript
jQuery实现文本展开收缩特效
Jun 03 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
Aug 21 Javascript
AngularJS ng-mousedown 指令
Aug 02 Javascript
Angular2 环境配置详细介绍
Sep 21 Javascript
JS基于面向对象实现的选项卡效果示例
Dec 20 Javascript
简单谈谈关于Angular Cli打包的事
Sep 05 Javascript
React通过父组件传递类名给子组件的实现方法
Nov 13 Javascript
详解Node 定时器
Feb 26 Javascript
React 无状态组件(Stateless Component) 与高阶组件
Aug 14 Javascript
学习node.js 断言的使用详解
Mar 18 Javascript
react使用antd表单赋值,用于修改弹框的操作
Oct 29 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中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
javascript中HTMLDOM操作详解
2014/12/11 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
Bootstrap轮播插件简单使用方法介绍
2016/06/21 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
Python数据类型学习笔记
2016/01/13 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
python url 参数修改方法
2018/12/26 Python
详解Python sys.argv使用方法
2019/05/10 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
Python读写压缩文件的方法
2020/07/30 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
美德好少年事迹材料
2014/01/19 职场文书
不错的求职信范文
2014/07/20 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
余世维讲座观后感
2015/06/11 职场文书
北京青年观后感
2015/06/15 职场文书
离职信范本
2015/06/23 职场文书
数学备课组工作总结
2015/08/12 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
九年级语文教学反思
2016/03/03 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
python for循环赋值问题
2021/06/03 Python