nodejs实现bigpipe异步加载页面方案


Posted in NodeJs onJanuary 26, 2016

Bigpipe介绍

Facebook首创的一种减少HTTP请求的,首屏快速加载的的异步加载页面方案。是前端性能优化的一个方向。

BigPipe与AJAX的比较

AJAX主要是XMLHttpRequest,前端异步的向服务器请求,获取动态数据添加到网页上。这样的往返请求需要耗费时间,而BigPipe技术并不需要发送XMLHttpRequest请求,这样就节省时间损耗。减少请求带来的另一个好处就是直接减少服务器负载。还有一个不同点就是AJAX请求前服务器在等待。请求后页面在等待。BIGPIPE可以前后端并行工作也带来了效率上的提升。

Bigpipe缺点

SEO问题。Facebook的动态展现内容主要是面向客户的个性页面。对于SEO的要求并不高。而如果把BIGPIPE技术用到淘宝上的话SEO的问题就会明显了,现在不确定百度对于这种动态页面的搜索支持度如何,其实在使用ANGULARJS动态绑定数据的时候也会有这方面的问题所以对于SEO有需求的页面需要慎重考虑是否使用BIGPIPE技术。(已知GOOGLE搜索对于ANGULAR的SEO有优化。)至于百度么-。-看下图就知道了

NODEJS实现

bigpipe.js页面引入的js

var Bigpipe=function(){
  this.callbacks={};
}

Bigpipe.prototype.ready=function(key,callback){
  if(!this.callbacks[key]){
    this.callbacks[key]=[];
  }
  this.callbacks[key].push(callback);
}

Bigpipe.prototype.set=function(key,data){
  var callbacks=this.callbacks[key]||[];
  for(var i=0;i<callbacks.length;i++){
    callbacks[i].call(this,data);
  }
}

app.js服务器代码

var express = require('express');
var path = require('path');
var http = require('http');
var ejs = require('ejs');
var app = express();

app.set('port', process.env.PORT || 3000);
app.use(express.static(path.join(__dirname, 'public')));
app.engine('.html', ejs.__express);
app.set('view engine', 'html');
app.get('/index.html', function (req, res) {
  res.render('index', { title: "测试" }, function (err, str) {
    res.write(str)
  })
  var Pagelets_list ={
    pagelet1:false,
    pagelet2:false
  }
  var data = {is: "true"};
  function is_end(Pagelets) {
    Pagelets_list[Pagelets]=true;
    for (x in Pagelets_list) {
      if(!Pagelets_list[x]){
        return;
      }
    }
    res.end();
    return;
  }

  function Pagelets(Pagelets) {
    res.write('<script>bigpipe.set("' + Pagelets + '",' + JSON.stringify(data) + ');</script>');
    is_end(Pagelets)
  }
  setTimeout(function(){Pagelets("pagelet1");},1000);
  setTimeout(function(){Pagelets("pagelet2");},3000);
});

http.createServer(app).listen(3000);

index.html前端代码

<!doctype html>
<html class="no-js">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="description" content="">
  <meta name="keywords" content="">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>zchq88-bigpipe</title>
  <!-- Set render engine for 360 browser -->
  <meta name="renderer" content="webkit">
  <!-- No Baidu Siteapp-->
  <meta http-equiv="Cache-Control" content="no-siteapp"/>
  <link href="//cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div id="test1">loading......</div>
<div id="test2">loading......</div>
<script src="//cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>
<script src="//cdn.bootcss.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script src="//cdn.bootcss.com/angular.js/1.5.0-rc.0/angular.min.js"></script>
<script src="/js/bigpipe.js"></script>
<script>
  var bigpipe=new Bigpipe();
  bigpipe.ready('pagelet1',function(data){
    $("#test1").html("test1 ready");
  })
  bigpipe.ready('pagelet2',function(data){
    $("#test2").html("test2 ready");
  })
</script>
</body>
</html>

总结

Bigpipe技术其实具体实现需要服务器的代码配合,在开发中我感觉功能占20%,优化占80%的工作量,优化的难度很多时候比开发还高。还需可能对全栈的了解。所以现在nodejs作为前后端分离的中间层是一个我个人认为比较合理的一个解决方案。如果前后端完成nodejs的中间层分离,Bigpipe技术的实现将会是前端可以独立完成的一个优化。提高首屏加载时间。并且提高整个网页的加载时间,对于浏览量的提升会带来一定效果的。

NodeJs 相关文章推荐
nodejs批量修改文件编码格式
Jan 22 NodeJs
在windows上用nodejs搭建静态文件服务器的简单方法
Aug 11 NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
Jan 12 NodeJs
nodejs结合Socket.IO实现的即时通讯功能详解
Jan 12 NodeJs
nodejs前端模板引擎swig入门详解
May 15 NodeJs
Nodejs异步回调之异常处理实例分析
Jun 22 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 NodeJs
详解nodejs 配置文件处理方案
Jan 02 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
详解NodeJS模块化
Jun 15 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 #NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 #NodeJs
Nodejs express框架一个工程中同时使用ejs模版和jade模版
Dec 28 #NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 #NodeJs
基于nodejs+express(4.x+)实现文件上传功能
Nov 23 #NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 #NodeJs
Nodejs的express使用教程
Nov 23 #NodeJs
You might like
PHP中的加密功能
2006/10/09 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
php写的AES加密解密类分享
2014/06/20 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
vue如何使用async、await实现同步请求
2019/12/09 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
在Django框架中运行Python应用全攻略
2015/07/17 Python
深入分析python数据挖掘 Json结构分析
2018/04/21 Python
python实现俄罗斯方块
2018/06/26 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
家庭睡衣和家庭用品:Little Blue House
2018/03/18 全球购物
光学与应用专业毕业生求职信
2014/09/01 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
小学生校园广播稿
2014/09/28 职场文书
学前班学生评语
2014/12/29 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
实习感想范文
2015/08/10 职场文书
总经理聘用协议书
2015/09/21 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书