高性能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实现的鼠标链接提示效果生成器代码
Jun 28 Javascript
extjs DataReader、JsonReader、XmlReader的构造方法
Nov 07 Javascript
JavaScript 入门基础知识 想学习js的朋友可以参考下
Dec 26 Javascript
一个挺有意思的Javascript小问题说明
Sep 26 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
Jan 10 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
Apr 15 Javascript
拖动table标题实现改变td的大小(css+js代码)
Apr 16 Javascript
javascript进行数组追加方法小结
Jun 16 Javascript
JavaScript时间操作之年月日星期级联操作
Jan 15 Javascript
JavaScript cookie详解及简单实例应用
Dec 31 Javascript
react中fetch之cors跨域请求的实现方法
Mar 14 Javascript
通过实例学习React中事件节流防抖
Jun 17 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批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
php代码运行时间查看类代码分享
2011/08/06 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
php获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
jqPlot jquery的页面图表绘制工具
2009/07/25 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
js获取视频时长代码
2014/04/10 Javascript
JavaScript中九种常用排序算法
2014/09/02 Javascript
jQuery中click事件的定义和用法
2014/12/20 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
JQuery在循环中绑定事件的问题详解
2016/06/02 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
如何编写jquery插件
2017/03/29 jQuery
vue实现todolist单页面应用
2017/04/11 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
详解element上传组件before-remove钩子问题解决
2020/04/08 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
React实现todolist功能
2020/12/28 Javascript
详细解析Python当中的数据类型和变量
2015/04/25 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
计算机应用应届生求职信
2014/07/12 职场文书
村党支部对照检查材料思想汇报
2014/09/28 职场文书
拿破仑传读书笔记
2015/07/01 职场文书
如何利用Python实现一个论文降重工具
2021/07/09 Python
MYSQL 表的全面总结
2021/11/11 MySQL