高性能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 相关文章推荐
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
May 07 Javascript
文本框水印提示效果的简单实现代码
Feb 22 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
Apr 08 Javascript
jquery实现文本框数量加减功能的例子分享
May 10 Javascript
JavaScript获取页面中表单(form)数量的方法
Apr 03 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
Aug 31 Javascript
理解 javascript 中的函数表达式与函数声明
Jul 07 Javascript
一个简易时钟效果js实现代码
Mar 25 Javascript
Electron 如何调用本地模块的方法
Feb 01 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
Apr 09 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
Apr 11 Javascript
使用React手写一个对话框或模态框的方法示例
Apr 25 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中利用XML技术构造远程服务(上)
2006/10/09 PHP
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
PHP小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
php session 检测和注销
2009/03/16 PHP
PHP学习笔记之一
2011/01/17 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
Jquery 基础学习笔记
2009/05/29 Javascript
自己的js工具 Cookie 封装
2009/08/21 Javascript
JS实现图片产生波纹一样flash效果的方法
2015/02/27 Javascript
基于JavaScript实现div层跟随滚动条滑动
2016/01/12 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
实例讲解React 组件生命周期
2020/07/08 Javascript
Python实现字符串格式化的方法小结
2017/02/20 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
python wsgiref源码解析
2021/02/06 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
Python的两道面试题
2013/06/29 面试题
大学生冰淇淋店商业计划书
2014/01/14 职场文书
贺卡寄语大全
2014/04/11 职场文书
初一军训感言
2015/08/01 职场文书
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript