高性能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 给元素绑定click事件多次执行的解决方法
Sep 09 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
Jul 17 Javascript
JavaScript实现将文本框的值插入指定位置的方法
Aug 13 Javascript
jQuery实现获取table表格第一列值的方法
Mar 01 Javascript
简单的JS轮播图代码
Jul 18 Javascript
jQuery ztree实现动态树形多选菜单
Aug 12 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
Aug 15 Javascript
微信小程序 详解页面跳转与返回并回传数据
Feb 13 Javascript
详解react-webpack2-热模块替换[HMR]
Aug 03 Javascript
Vue异步加载about组件
Oct 31 Javascript
vue如何在自定义组件中使用v-model
May 14 Javascript
vuejs前后端数据交互之从后端请求数据的实例
Aug 11 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.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
php实现文本数据导入SQL SERVER
2015/05/17 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
2017/12/29 Javascript
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
Python批量修改文件后缀的方法
2014/01/26 Python
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
给你一面国旗 教你用python画中国国旗
2019/09/24 Python
python如何求100以内的素数
2020/05/27 Python
python2和python3哪个使用率高
2020/06/23 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
html5实现多图片预览上传及点击可拖拽控件
2018/03/15 HTML / CSS
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
运动会领导邀请函
2014/01/10 职场文书
渡河少年教学反思
2014/02/12 职场文书
德育标兵事迹材料
2014/08/24 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
如何用python清洗文件中的数据
2021/06/18 Python