Nodejs实现bigpipe

facebook为了提高用户体验,专门做了bigpipe这个前台渲染页面的框架。

开始以为就是通过将页面分成很多小块,然后发多个请求来进行渲染。

后来读了bigpipe-on-node这个nodejs插件介绍,才知道原来仅仅是在一个请求里面将各个模块进行分发。并且输出一部分就会发送一部分给浏览器,不会等待输出完毕之后发送给浏览器。

看了  Meteoric_cry 兄的文章之后,在他的基础上改了代码:

 1 var http = require('http');
 2 var sys = require('sys');
 3 var url = require("url");
 4 var down = 6;
 5 http.createServer(function(request, response) {
 6  
 7     response.writeHead(200, {"Content-Type" : "text/html"});
 8     response.write("<!Doctype html><html><head>");
 9     response.write("<style type='text/css'>div{border:2px solid #4F81BD; margin:30px; padding: 10px;}</style>");
10     response.write("<script type=\"text/javascript\">function arrived(id,text) { var b=document.getElementById(id); b.innerHTML = text; }</script>");
11     response.write("</head><body><div>Progressive Loading");
12     for(var i = 0; i < 6; i++) {
13         response.write("<div id='" + i + "'>Loading...</div>");
14     }
15     response.write("</div>");
16  
17     for (i = 0; i < 6; i++)
18         output(i, response, function (){ if(--down === 0) response.end();})
19     response.write("</body></html>");
20  
21 }).listen(8080);
22  
23 var output = function(id, response, callback)
24 {
25     var delay = Math.round(Math.random() * 8000);
26     setTimeout(function() {
27         var content = "<span>Content of Module " + id + "</span>";
28         response.write("<script>" +
29             "arrived('" + id + "', '" + content + "');" +
30             "</script>");
31         callback && callback();
32     }, delay);
33 }
View Code

 

posted @ 2013-08-06 16:46  lloydzhou  阅读(571)  评论(0)    收藏  举报