高性能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 相关文章推荐
不错的新闻标题颜色效果
Dec 10 Javascript
javascript onmouseout 解决办法
Jul 17 Javascript
Javascript编程之继承实例汇总
Nov 28 Javascript
JavaScript实现显示函数调用堆栈的方法
Apr 21 Javascript
JavaScript新增样式规则(推荐)
Jul 19 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
Sep 20 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
Sep 28 Javascript
vue-resource调用promise取数据方式详解
Jul 21 Javascript
vue-resource + json-server模拟数据的方法
Nov 02 Javascript
vue 父组件调用子组件方法及事件
Mar 29 Javascript
layui关闭层级、简单监听的实例
Sep 06 Javascript
vue实现打地鼠小游戏
Aug 21 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
基于mysql的bbs设计(一)
2006/10/09 PHP
php在线打包程序源码
2008/07/27 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
php max_execution_time执行时间问题
2011/07/17 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
jQuery树形控件zTree使用小结
2016/08/02 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
webpack构建的详细流程探底
2018/01/08 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
Vue常用的几个指令附完整案例
2018/11/06 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
写了个监控nginx进程的Python脚本
2012/05/10 Python
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
python实现控制COM口的示例
2019/07/03 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
Python中logging日志库实例详解
2020/02/19 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
加热夹克:RAVEAN
2018/10/19 全球购物
捷克购买家具网站:JENA nábytek
2020/03/19 全球购物
大学生水文观测实习自我鉴定
2013/09/29 职场文书
网上卖盒饭创业计划书范文
2014/02/07 职场文书
趣味比赛活动方案
2014/02/15 职场文书
中学校庆方案
2014/03/17 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书