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(一)--- Node.js简介及安装开发环境
May 20 NodeJs
async/await与promise(nodejs中的异步操作问题)
Mar 03 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
nodejs实现解析xml字符串为对象的方法示例
Mar 14 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
基于nodejs的微信JS-SDK简单应用实现
May 21 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 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
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
php ci框架验证码实例分析
2013/06/26 PHP
Yii学习总结之安装配置
2015/02/22 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
利用bootstrapValidator验证UEditor
2016/09/14 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
原生js生成图片验证码
2020/10/11 Javascript
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
python追加元素到列表的方法
2015/07/28 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
浅谈Python 递归算法指归
2019/08/22 Python
zooplus意大利:在线宠物商店
2019/08/07 全球购物
学校大课间活动方案
2014/01/30 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
支行行长竞聘报告
2014/11/06 职场文书
高中教师个人总结
2015/02/10 职场文书
数学备课组工作总结
2015/08/12 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
银行工作心得体会范文
2016/01/23 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
z-index不起作用
2021/03/31 HTML / CSS
教你使用TensorFlow2识别验证码
2021/06/11 Python