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

 更新时间:2016年01月26日 09:21:16   投稿:hebedich   我要评论
本文给大家分享的是使用nodejs结合bigpipe实现异步加载页面的方案,非常的实用,也是以后前端性能优化的一个方向,希望大家能够喜欢。

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技术的实现将会是前端可以独立完成的一个优化。提高首屏加载时间。并且提高整个网页的加载时间,对于浏览量的提升会带来一定效果的。

相关文章

  • Node.js利用Net模块实现多人命令行聊天室的方法

    Node.js利用Net模块实现多人命令行聊天室的方法

    Node.js Net 模块提供了一些用于底层的网络通信的小工具,包含了创建服务器/客户端的方法,下面这篇文章主要给大家介绍了Node.js利用Net模块实现命令行多人聊天室的方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • 详解如何在NodeJS项目中优雅的使用ES6

    详解如何在NodeJS项目中优雅的使用ES6

    本篇文章主要介绍了详解如何在NodeJS项目中优雅的使用ES6,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • Node.js中的child_process模块详解

    Node.js中的child_process模块详解

    这篇文章主要给大家介绍了关于Node.js中child_process模块的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • Node.js Buffer用法解读

    Node.js Buffer用法解读

    这篇文章主要介绍了Node.js Buffer用法解读,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 新手必须知的Node.js 4个JavaScript基本概念

    新手必须知的Node.js 4个JavaScript基本概念

    本文介绍了4个基本JavaScript概念,它是你学习node.js所必需要掌握,下面就让我们来看一下具体是哪4个基本JavaScript概念
    2018-09-09
  • Node.js操作redis实现添加查询功能

    Node.js操作redis实现添加查询功能

    Redis 是一个基于内存的键(key)值(value)类型的数据结构存储容器,它既可以完全工作在内存中,也可以持久化存储。当 Redis 工作于持久化模式时,可以将它当作一个非关系型数据库使用。
    2017-05-05
  • Node.js console控制台简单用法分析

    Node.js console控制台简单用法分析

    这篇文章主要介绍了Node.js console控制台简单用法,结合实例形式分析了nodejs console控制台功能、常见函数与简单使用技巧,需要的朋友可以参考下
    2019-01-01
  • 使用VS开发 Node.js指南

    使用VS开发 Node.js指南

    这篇文章主要介绍了使用VS开发 Node.js的方法,主要是使用NTVS(Node.js Toolsfor Visual Studio)来实现,有需要的小伙伴参考下
    2015-01-01
  • 你应该知道的几类npm依赖包管理详解

    你应该知道的几类npm依赖包管理详解

    npm 是node.js 里的包管理器,是一个命令行工具,下面这篇文章主要给大家介绍了关于你应该知道的几类npm依赖包管理,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-10-10
  • NodeJs入门教程之定时器和队列

    NodeJs入门教程之定时器和队列

    这篇文章主要给大家介绍了关于NodeJs入门教程之定时器和队列的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03

最新评论