今天刚好看到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. Android 开发之 Android 开发的起步

    前言  Android 开发的起步 我们可以先来看看百科上面怎么说? 百度百科上 Android的介绍 一.Windows环境下在线搭建Android环境. 1. 下载 Android开发工具. JD ...

  2. CentOS6.3下安装VSFTP服务

    CentOS下安装FTP服务器: 第一步,检查服务器端是否已经安装FTP:[root@localhost centos]# rpm -q vsftpd 如果出现的是:[root@localhost c ...

  3. nyoj 170 网络的可靠性

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=170 思路:统计每个节点的度,将度为1的节点消去所需要的最少的边即为答案. 代码: #in ...

  4. Linux objcopy命令

    一.简介 [功能] 将目标文件的一部分或者全部内容拷贝到另外一个目标文件中,或者实现目标文件的格式转换. [描述] objcopy工具使用BFD库读写目标文件,它可以将一个目标文件的内容拷贝到另外一个 ...

  5. Hbase step by step 完全分布式安装

    Step1: download and extract the packages: http://mirror.bit.edu.cn/apache/hbase/stable/ Step2: set t ...

  6. IOS Orientation, 想怎么转就怎么转~~~

    此博文主要针对IOS应用, 是屏幕旋转相关问题的一个总结. 主要内容有: IOS5,6,7不同版的适配. 强制旋转和自动旋转. 博客: http://www.cnblogs.com/jhzhu 邮箱: ...

  7. Google Map API 使用总结

    Google Map API (一):显示一个最基本的地图 1 实现一个地图:<head>中引用: <script type="text/javascript" ...

  8. UVALive 5962 Strongly Connected Chemicals --最大独立集

    题意:给n个阳离子和m个阴离子,并给出相互的吸引关系,求一个最大的点集,使其中的每个阴阳离子相互吸引. 解法:枚举每条边,使该条边存在,然后建立反图,求一个最大匹配,此时的点数减去最大匹配与ans求一 ...

  9. Windows远程连接MAC桌面

    一.准备软件 VNC Server (MAC OS X已支持) RealVNC/TightVNC 二.MAC OS X设置 注:Mac OS X 10.5 已经支持了VNC Viewer访问的功能,设 ...

  10. Unity3D手势及重力加速度(神庙逃亡操作)

    Unity实现神庙逃亡操作 现在特别火的跑酷游戏<神庙逃亡>是用Unity3D引擎开发的 游戏的操作:用手指拨动(划动)人物就转向,利用手机的重力感应进行人物左右调整. 今天用Unity来 ...