高性能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实现的链表数据结构实例
Apr 02 Javascript
javascript十六进制及二进制转化的方法
May 06 Javascript
javascript带回调函数的异步脚本载入方法实例分析
Jul 02 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
Aug 21 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
Dec 24 Javascript
浅谈JavaScript 标准对象
Jun 02 Javascript
gulp教程_从入门到项目中快速上手使用方法
Sep 14 Javascript
Node.js中你不可不精的Stream(流)
Jun 08 Javascript
JS实现显示当前日期的实例代码
Jul 03 Javascript
详解如何构建Promise队列实现异步函数顺序执行
Oct 23 Javascript
微信小程序实现页面浮动导航
Jan 08 Javascript
如何用JavaScript实现一个数组惰性求值库
May 05 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
配置支持SSI
2006/11/25 PHP
c#中的实现php中的preg_replace
2009/12/21 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
PHP 断点续传实例详解
2017/11/11 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
微信小程序  生命周期详解
2016/10/27 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
js实现搜索栏效果
2018/11/16 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
17个Python小技巧分享
2015/01/23 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
python中日志logging模块的性能及多进程详解
2017/07/18 Python
Python实现控制台中的进度条功能代码
2017/12/22 Python
python定时关机小脚本
2018/06/20 Python
flask中的wtforms使用方法
2018/07/21 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
int在python中的含义以及用法
2019/06/27 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
美国鲜花递送:UrbanStems
2021/01/04 全球购物
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
检讨书范文
2015/01/27 职场文书
学校证明范文
2015/06/24 职场文书
董事长致辞
2015/07/29 职场文书