今天刚好看到bigpipe的文章,写个demo试一下:

nodejs的实现:

var fs = require('fs');
module.exports = function(req , res){
//bigpipe测试
res.writeHead(200 , {'Content-Type': 'text/html;charset=utf-8'}); var html = fs.readFileSync(__dirname + "/head.html").toString(); var i = 0;
res.write(html); setTimeout(function(){
//先加载js文件
res.write(fs.readFileSync(__dirname + "/script.html").toString()); //然后开始加载各个page的内容
flush();
},200); function flush(){
if(i >= 4){
res.end("</body></html>");
return;
} setTimeout(function(){
res.write("<script class='element' data-id='dom"+i+"' type='text/template'>" + fs.readFileSync(__dirname + "/manyValue.html").toString()+"</script>");
i++;
flush();
},1000)
}
}

上面的代码中,首次先输出head.html(第一次发送的html头,为了尽快加载完,所以里面只有一个样式表):

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="/public/bigpipe/bigpipe-test.css"/>
</head>
<body>
<div class="view">
<div class="page" id="dom0"><div class="value">Loading...</div></div>
<div class="page" id="dom1"><div class="value">Loading...</div></div>
<div class="page" id="dom2"><div class="value">Loading...</div></div>
<div class="page" id="dom3"><div class="value">Loading...</div></div>
</div>

head.html的内容很少,所以很快就可以展示在用户面前,给人一种好像加载很快的感觉。然后再输出js逻辑:

<script src="/public/jquery-2.1.1.min.js"></script>
<script src="/public/bigpipe/bigpipe-test.js"></script>

而bigpipe-test.js对每个page的数据处理为:

var now = 0;
var loop = setInterval(function(){
var $els = $(".element");
$els.each(function(){
if($(this).html()){
var $eim = $("#" + $(this).attr("data-id"));
$eim.find(".value").html($(this).html());
document.body.removeChild(this);
now++;
}
}) if(now == $(".page").length){
clearInterval(loop);
}
},200);

因为后面传过来的真正数据格式为:<script class='element' data-id='dom"+i+"' type='text/template'> XXX </script>

所以bigpipe-test.js里仅需判断页面上的script标签有无改变即可,如有改变,则获取内容并且将内容放置该放置的地方。

Test : http://node-tester-171479.nitrousapp.com:9030/bigpipe   页面和样式很快就加载出来了。

为了展示效果,所以上面的demo中特意做了延时,不过在平时项目中如果内容特别多,刚开始就一股脑把所有内容放在一个页面加载,用户打开网页的时候则可能会盯着白屏看一会才会load出来。bigpipe的好处就在于此,可以将大概模子先加载出来,然后更多的内容再慢慢一点load出来,而且又不需要另开http请求,一个请求就可以完成分段加载。

该方法对于移动端的单页多屏应用的用户体验提升益处很大,用户打开页面的时候可以先将首屏加载出来,然后再load其他屏。

  新技能 get√

nodejs简易实现一下bigpipe的更多相关文章

  1. nodejs入门篇之linux版的nodejs简易环境安装部署

    第一步:下载二进制安装包 根据linux的不同版本选择32位或64位,因为我的linux的虚拟机是64位的,所以我选择的是64位二进制安装文件(Linux Binariesx64),可以右键选择在新窗 ...

  2. nodejs简易代理服务器

    直接代码: var http = require('http') var proxy = http.createServer(function (request, response) { var op ...

  3. 简易漫画网站搭建-漫画喵Server版

    小喵的唠叨话:寒假的时候写了一个漫画爬虫,爬取了好几个漫画,不过一直没有找到合适的漫画阅读的工具.因此最近就试着自己写一个漫画的网站,放在公网上或者局域网里,这样就能随时随地用手机.Pad看漫画了. ...

  4. Nodejs进阶:express+session实现简易身份认证

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 文档概览 本文基于express.express-session ...

  5. 从无到有,用Nodejs+express+mongodb搭建简易登陆系统

    前端处理server表示很蛋疼,初学Node,虽然感觉异常强大,但是学起来还是有些吃力的,Node是工具,它不是万能的,搭建一个系统还是需要借助其他一些工具,对于我这个没怎么接触server的前端来说 ...

  6. Nodejs+MongoDB+Bootstrap+esj搭建的个人简易博客

    github:https://github.com/yehuimmd/myNodeBloy Nodejs+MongoDB+jQuery+Bootstrap-esj搭建的个人简易博客 主要功能 前台 : ...

  7. nodeJS实现简易爬虫

    nodeJS实现简易爬虫 需求:使用nodeJS爬取昵图网某个分类下的图片并存入本地 运用nodeJS自带系统模块http.fs 示例代码: var http =require('http'); va ...

  8. nodejs学习之实现简易路由

    此前实现了个数据转发功能,但是要建本地服务器,还需要一个简易的路由功能.因为只是用于本地服务器用于自己测试用,所以不需要太完善的路由功能,所以也就不去使用express框架,而是自己实现一个简易路由, ...

  9. NodeJS用递归实现异步操作的链式调用,完成一个简易的命令行输入输出REPL交互接口

    REPL —— Read-Eval-Print-Loop. 00.一门好的编程语言的必要条件 REPL并不是什么高大上的东西,简单的说就是一个从命令行程序,读取终端输入,处理,打印结果,如此循环.这是 ...

随机推荐

  1. PHP验证码

    设计一个验证码类,在需要的时候可以随时调用 验证码类,保存为ValidateCode.class.php <?php //验证码类 session_start(); class Validate ...

  2. django模型

    用django时,只要用到数据库就得用到模型. 一.数据库的MTV开发模式 从MVC到MTV 所谓软件架构的MVC模式将数据的存取逻辑(Module),表现逻辑(View)和业务逻辑(Controll ...

  3. JVM 垃圾回收算法

    在说垃圾回收算法之前,先谈谈JVM怎样确定哪些对象是“垃圾”. 1.引用计数器算法: 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当 ...

  4. uva 1605 building for UN ——yhx

    The United Nations has decided to build a new headquarters in Saint Petersburg, Russia. It will have ...

  5. ios开发之CoreData使用

    1.在工程中添加build Phases的Link Binary with Libraries下添加CoreData的库. 2.在当前工程中新建文件选择CoreData——>DataModel, ...

  6. HDU 4121 Xiangqi --模拟

    题意: 给一个象棋局势,问黑棋是否死棋了,黑棋只有一个将,红棋可能有2~7个棋,分别可能是车,马,炮以及帅. 解法: 开始写法是对每个棋子,都处理处他能吃的地方,赋为-1,然后判断将能不能走到非-1的 ...

  7. window7 右键菜单显示-》在此处打开命令窗口

    window7 右键菜单显示->在此处打开命令窗口: 注册表中: HKEY_CLASSES_ROOT\Directory\Background\shell\cmd下将[Extended]重命名或 ...

  8. java中的单引号和双引号

    1.单引号引的数据 是char类型的,双引号引的数据 是String类型的:单引号只能引一个字符,而双引号可以引0个及其以上.char只是一个基本类型,而String 可以是一个类,可以直接引用.比如 ...

  9. 09Spring_AOP介绍和java本身的动态代理以及cglib代理

    Aspect Oriented Programming 面向切面编程 1. 业界 AOP 实际上 OOP (面向对象编程 ) 延伸 ----  OOP编程语言. AOP设计思想,下面给出一张AOP的设 ...

  10. SQL 常见函数使用

    1.字符串转化为整型 CONVERT(INT,'字符串') 2.结果集 输出为一段字符串 SELECT STUFF((SELECT ','+A FROM tableFOR XML PATH('')), ...