快速实现一个简单的bigpipe模型
2011-01-18 22:17
405 查看
先描述几个概念:
Pagelet:页面功能模块化的单位
BigPipeClient:解释并呈现Pagelet的客户端,可以是javascript或服务器端语言编写(如c#)
其实重点在于模块化以及模块化之后随之带来的好处,功能开发分工,页面级别的功能隔离、功能降级等都可以以模块为单位进行,从而简化web项目的模型,在这个基础上再构建一系列的开发框架来支撑这种开发模式即可
先看一下Pagelet的定义:
它包含了模块的Html模板内容,呈现的位置,获取数据的地址等,
这是一个pagelet实例,
然后编写一个页面,把这个页面需要的模块都输出到页面中:
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
BigPipe.js客户端的简易实现:
调用add的时候将pagelet加入客户端缓存,同时执行ajax请求数据并和html模板装配后呈现到指定位置
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
本文实现了两种呈现方式的pagelet:服务器端并行push和客户端pull方式
下图为使用bigpipe.js客户端进行ajaxpull方式拉取数据并呈现pagelet
生成的pagelet内容如下:
下图为使用服务器端并行push多个pagelet内容并呈现,可以看到模块并不会按顺序加载,而是根据各自加载情况决定顺序,这样可以使得更快被处理完的模块立刻被呈现给用户:
原理就是对respone并行写入内容并立刻flush到客户端:
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
本文只简易实现了pagelet的处理模型,描述一下思路,相信有思路之后针对各自的应用或项目情况编写一套合适模块化框架会有些益处的
在完成bigpipe加载后,pageCache以及记录回放等在浏览器中的优化技巧也是很有意思的,之后会尝试做一些实现
DEMO源码可以在这里下载:https://github.com/wsky/wsky.github.com/tree/master/bigpipe
DEMO中用到简单并行实现:/article/5273950.html
Pagelet:页面功能模块化的单位
BigPipeClient:解释并呈现Pagelet的客户端,可以是javascript或服务器端语言编写(如c#)
其实重点在于模块化以及模块化之后随之带来的好处,功能开发分工,页面级别的功能隔离、功能降级等都可以以模块为单位进行,从而简化web项目的模型,在这个基础上再构建一系列的开发框架来支撑这种开发模式即可
先看一下Pagelet的定义:
///<summary>
///模块
///</summary>
publicclassPagelet
{
///<summary>
///模块标识
///</summary>
publicstringName{get;set;}
///<summary>
///获取数据Url
///</summary>
publicstringUrl{get;set;}
///<summary>
///目标容器
///</summary>
publicstringTarget{get;set;}
///<summary>
///HTML内容模板
///</summary>
publicstringTemplate{get;set;}
//andsoon
}
它包含了模块的Html模板内容,呈现的位置,获取数据的地址等,
这是一个pagelet实例,
然后编写一个页面,把这个页面需要的模块都输出到页面中:
<%foreach(varletinViewData["pagelets"]asIEnumerable<BigPipe.Controllers.Pagelet>)
{%>
<scripttype="text/javascript">
$(function(){
<%="client.add("+newJavaScriptSerializer().Serialize(let)+");"%>
});
</script>
<%}%>
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
BigPipe.js客户端的简易实现:
(function($){
//pageletsholder
varpagelets={};
//bipipe
varbigpipe=function(){this._init.apply(this,arguments);};
bigpipe.prototype={
_init:function(){},
add:function(let){
pagelets[let['Name']]=let;
$.getJSON(let['Url'],function(data){
$('#'+let['Target']).append(let['Template']
.replace('${name}',data['name'])
.replace('${description}',data['description']));
});
}
}
window.client=newbigpipe();
})(jQuery);
调用add的时候将pagelet加入客户端缓存,同时执行ajax请求数据并和html模板装配后呈现到指定位置
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
本文实现了两种呈现方式的pagelet:服务器端并行push和客户端pull方式
下图为使用bigpipe.js客户端进行ajaxpull方式拉取数据并呈现pagelet
生成的pagelet内容如下:
下图为使用服务器端并行push多个pagelet内容并呈现,可以看到模块并不会按顺序加载,而是根据各自加载情况决定顺序,这样可以使得更快被处理完的模块立刻被呈现给用户:
原理就是对respone并行写入内容并立刻flush到客户端:
context.Response.Write(string.Format(
"<scripttype=\"text/javascript\">client.add({0});</script>"
,newJavaScriptSerializer().Serialize(let)));
context.Response.Flush();
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
本文只简易实现了pagelet的处理模型,描述一下思路,相信有思路之后针对各自的应用或项目情况编写一套合适模块化框架会有些益处的
在完成bigpipe加载后,pageCache以及记录回放等在浏览器中的优化技巧也是很有意思的,之后会尝试做一些实现
DEMO源码可以在这里下载:
DEMO中用到简单并行实现:
相关文章推荐
- 快速实现一个简单的bigpipe模型
- 快速实现一个简单的bigpipe模型
- Servlet 3.0笔记之异步请求Facebook BigPipe简单模型实现
- 基于tcp的c/s模型的一个简单的socket实现
- 实现一个快速简单的SimpleListDialog<T>
- 实现一个简单的网页(缩略词表、文献来源链接、快速访问键列表)
- 一个简单的MVC模型实现
- 快速选择算法的一个简单实现
- Objective-C ,ios,iphone开发基础:快速实现一个简单的图片查看器
- Java回顾:用一个Demo来说明继承抽象类和实现接口的简单框架模型
- 用BlockingQueue实现一个简单的生产者-消费者模型
- Objective-C ,ios,iphone开发基础:快速实现一个简单的图片查看器
- 用BlockingQueue实现一个简单的生产者-消费者模型
- UI基础第十四弹:实现UItableview使用嵌套模型完成的一个简单汽车图标展示程序
- 用Java socket (TCP通信模型)实现一个简单的web 服务器
- medrank算法配合B+树实现一个简单预测模型
- Servlet 3.0笔记之异步请求Facebook BigPipe简单模型实现
- Objective-C ,ios,iphone开发基础:快速实现一个简单的图片查看器
- [置顶] 【python keras实战】快速开始:训练一个简单的Keras 模型
- 怎样借助Spring boot快速实现一个简单的http服务器