高性能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 相关文章推荐
jsPDF生成pdf后在网页展示实例
Jan 16 Javascript
jQuery中:first选择器用法实例
Dec 30 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
Aug 19 Javascript
非常棒的jQuery图片轮播效果
Apr 17 Javascript
jQuery中通过ajax调用webservice传递数组参数的问题实例详解
May 20 Javascript
JavaScript实现移动端滑动选择日期功能
Jun 21 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
Aug 25 Javascript
详解Vue 事件驱动和依赖追踪
Apr 22 Javascript
基于Bootstrap实现城市三级联动
Nov 23 Javascript
详解Vue中watch对象内属性的方法
Feb 01 Javascript
JavaScript随机数的组合问题案例分析
May 16 Javascript
Vue性能优化的方法
Jul 30 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 feof用来识别文件末尾字符的方法
2010/08/01 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
php实现读取手机客户端浏览器的类
2015/01/09 PHP
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
微信分享invalid signature签名错误踩过的坑
2020/04/11 Javascript
python函数参数*args**kwargs用法实例
2013/12/04 Python
Python常用的爬虫技巧总结
2016/03/28 Python
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
flask框架视图函数用法示例
2018/07/19 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
python 实现简单的FTP程序
2019/12/27 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
美国网上书店:Barnes & Noble
2018/08/15 全球购物
会计专业求职信范文
2014/03/16 职场文书
化学专业自荐信
2014/05/28 职场文书
网站推广策划方案
2014/06/04 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
检讨书格式范文
2015/05/07 职场文书
教师旷工检讨书
2015/08/15 职场文书
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server