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之请求路由概述
Jul 05 NodeJs
在windows上用nodejs搭建静态文件服务器的简单方法
Aug 11 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
Nodejs调用WebService的示例代码
Sep 29 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
nodejs前端模板引擎swig入门详解
May 15 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 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 遍历XP文件夹下所有文件
2008/11/27 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
深入分析PHP设计模式
2020/06/15 PHP
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
JS+JSP checkBox 全选具体实现
2014/01/02 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
JavaScript里四舍五入函数round用法实例
2015/04/06 Javascript
Jquery简单实现GridView行高亮的方法
2015/06/15 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
js排序与重组的实例讲解
2017/08/28 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
利用Python优雅的登录校园网
2020/10/21 Python
大专生的学习自我评价
2013/12/04 职场文书
物流专员岗位职责
2014/02/17 职场文书
初一学生期末评语
2014/04/24 职场文书
艾滋病宣传标语
2014/06/25 职场文书
医药销售自我评价200字
2014/09/11 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
redis 存储对象的方法对比分析
2021/08/02 Redis