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中操作mysql数据库示例
Dec 20 NodeJs
NodeJS中Buffer模块详解
Jan 07 NodeJs
nodejs爬虫抓取数据乱码问题总结
Jul 03 NodeJs
Nodejs express框架一个工程中同时使用ejs模版和jade模版
Dec 28 NodeJs
nodejs redis 发布订阅机制封装实现方法及实例代码
Dec 15 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 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
第十三节--对象串行化
2006/11/16 PHP
用PHP实现多服务器共享SESSION数据的方法
2007/03/16 PHP
php的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
使用python检查yaml配置文件是否符合要求
2020/04/09 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
网络工程师职业规划
2014/02/10 职场文书
小学生元旦广播稿
2014/02/21 职场文书
学习决心书范文
2014/03/11 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
党委书记个人对照检查材料
2014/09/15 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
英文慰问信
2015/02/14 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android
Pandas自定义选项option设置
2021/07/25 Python
vue elementUI表格控制对应列
2022/04/13 Vue.js