高性能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 this 深入理解
Jul 30 Javascript
用js实现层随着内容大小动态渐变改变 推荐
Dec 19 Javascript
jquery ready(fn)事件使用介绍
Aug 21 Javascript
jQuery中ajax的post()方法用法实例
Dec 26 Javascript
JQUERY简单按钮轮换选中效果实现方法
May 07 Javascript
概述一个页面从输入URL到页面加载完的过程
Dec 16 Javascript
jQuery实现别踩白块儿网页版小游戏
Jan 18 Javascript
angularjs实现下拉列表的选中事件示例
Mar 03 Javascript
微信小程序之数据双向绑定与数据操作
May 12 Javascript
javascript实现Emrips反质数枚举的示例代码
Dec 06 Javascript
jquery无缝图片轮播组件封装
Nov 25 jQuery
Vue中多元素过渡特效的解决方案
Feb 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
php简单实现sql防注入的方法
2016/04/22 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
Javascript 按位与赋值运算符 (&amp;=)使用介绍
2014/02/04 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
2020/07/12 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[54:06]OG vs TNC 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
python实现宿舍管理系统
2019/11/22 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
python 实现音频叠加的示例
2020/10/29 Python
python实现三壶谜题的示例详解
2020/11/02 Python
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
党支部承诺书
2015/01/20 职场文书
关于军训的感想
2015/08/07 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
MySQL系列之六 用户与授权
2021/07/02 MySQL