高性能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访问XML数据的实例
Dec 27 Javascript
jquery tools之tabs 选项卡/页签
Jul 25 Javascript
jQuery复制表单元素附源码分享效果演示
Sep 30 Javascript
javascript手风琴下拉菜单实现代码
Nov 12 Javascript
jquery采用oop模式class类的使用示例
Jan 22 Javascript
javascript添加前置0(补零)的几种方法
Jan 05 Javascript
jQuery实现的简单在线计算器功能
May 11 jQuery
vue select二级联动第二级默认选中第一个option值的实例
Jan 10 Javascript
Vue.js单向绑定和双向绑定实例分析
Aug 14 Javascript
Vue实现手机扫描二维码预览页面效果
May 28 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
Apr 28 Javascript
js轮播图之旋转木马效果
Oct 13 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
简单实用的.net DataTable导出Execl
2013/10/28 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
python执行子进程实现进程间通信的方法
2015/06/02 Python
浅谈tensorflow中几个随机函数的用法
2018/07/27 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
python实现复制大量文件功能
2019/08/31 Python
如何在python中写hive脚本
2019/11/08 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
python利用platform模块获取系统信息
2020/10/09 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
使用HTML5的表单验证的简单示例
2015/09/09 HTML / CSS
Internal修饰符有什么含义
2013/07/10 面试题
奥巴马演讲稿
2014/01/08 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
公司租房协议书
2014/10/14 职场文书
公司总经理岗位职责
2015/04/01 职场文书
2015年秋季小学开学标语
2015/07/16 职场文书
表彰大会新闻稿
2015/07/17 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python