高性能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 相关文章推荐
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
Dec 28 Javascript
js实现异步循环实现代码
Feb 16 Javascript
Javascript之面向对象--接口
Dec 02 Javascript
js实现文字列表无缝滚动效果
Jun 23 Javascript
vue通过点击事件读取音频文件的方法
May 30 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
Nov 06 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
Dec 02 Javascript
微信小程序整个页面的自动适应布局的实现
Jul 12 Javascript
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
vue代码分块和懒加载非必要资源文件
Apr 11 Vue.js
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无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
Javascript 入门基础学习
2010/03/10 Javascript
JS拖动技术 关于setCapture使用
2010/12/09 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
JavaScript检查某个function是否是原生代码的方法
2014/08/20 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
nodejs个人博客开发第一步 准备工作
2017/04/12 NodeJs
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
Vue scoped及deep使用方法解析
2020/08/01 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
python中元类用法实例
2014/10/10 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
python中如何使用虚拟环境
2020/10/14 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
财务主管的岗位职责
2013/12/30 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
节能环保演讲稿
2014/08/28 职场文书
党校学习党性分析材料
2014/12/19 职场文书
Ruby处理CSV数据方法详解
2022/04/18 Ruby
MySQL添加索引特点及优化问题
2022/07/23 MySQL