Home > Web Front-end > JS Tutorial > How nodejs implements bigpipe asynchronously loading pages

How nodejs implements bigpipe asynchronously loading pages

不言
Release: 2018-06-30 14:17:22
Original
1607 people have browsed it

This article shares with you the solution of using nodejs combined with bigpipe to implement asynchronous loading of pages. It is very practical and is also a direction for future front-end performance optimization. I hope you will like it.

Bigpipe introduces

Facebook's first asynchronous loading page solution that reduces HTTP requests and quickly loads the first screen. It is a direction for front-end performance optimization.

Comparison between BigPipe and AJAX

AJAX is mainly XMLHttpRequest. The front end asynchronously requests the server to obtain dynamic data and add it to the web page. Such round-trip requests take time, and BigPipe technology does not need to send XMLHttpRequest requests, thus saving time. Another benefit of reducing requests is a direct reduction in server load. Another difference is that the server waits before the AJAX request. Page is waiting after request. BIGPIPE can work in parallel on the front and back ends, which also brings efficiency improvements.

Bigpipe Disadvantages

SEO issues. Facebook's dynamic display content is mainly customer-oriented personalized pages. The requirements for SEO are not high. And if BIGPIPE technology is used on Taobao, SEO problems will be obvious. I am not sure how well Baidu supports the search for this kind of dynamic page. In fact, there will also be problems in this regard when using ANGULARJS to dynamically bind data. Therefore, pages with SEO needs need to carefully consider whether to use BIGPIPE technology. (It is known that GOOGLE search is optimized for ANGULAR's SEO.) As for Baidu -. -Look at the picture below to know

NODEJS implementation

js introduced by bigpipe.js page

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);
  }
}
Copy after login

app.js server code

var express = require(&#39;express&#39;);
var path = require(&#39;path&#39;);
var http = require(&#39;http&#39;);
var ejs = require(&#39;ejs&#39;);
var app = express();

app.set(&#39;port&#39;, process.env.PORT || 3000);
app.use(express.static(path.join(__dirname, &#39;public&#39;)));
app.engine(&#39;.html&#39;, ejs.__express);
app.set(&#39;view engine&#39;, &#39;html&#39;);
app.get(&#39;/index.html&#39;, function (req, res) {
  res.render(&#39;index&#39;, { 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(&#39;<script>bigpipe.set("&#39; + Pagelets + &#39;",&#39; + JSON.stringify(data) + &#39;);</script>&#39;);
    is_end(Pagelets)
  }
  setTimeout(function(){Pagelets("pagelet1");},1000);
  setTimeout(function(){Pagelets("pagelet2");},3000);
});

http.createServer(app).listen(3000);
Copy after login

index.html front-end code

<!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>
<p id="test1">loading......</p>
<p id="test2">loading......</p>
<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(&#39;pagelet1&#39;,function(data){
    $("#test1").html("test1 ready");
  })
  bigpipe.ready(&#39;pagelet2&#39;,function(data){
    $("#test2").html("test2 ready");
  })
</script>
</body>
</html>
Copy after login

Summary

In fact, the specific implementation of Bigpipe technology requires the cooperation of server code. During development, I feel that functions account for 20% and optimization accounts for 80% of the workload. Optimization is often more difficult than development. Still high. A possible understanding of the full stack is also required. So now nodejs as the middle layer that separates the front and back ends is a solution that I personally think is more reasonable. If the front-end and back-end complete the middle layer separation of nodejs, the implementation of Bigpipe technology will be an optimization that the front-end can complete independently. Improve first screen loading time. And improving the loading time of the entire web page will have a certain effect on increasing the number of views.

The above is the entire content of this article. I hope it will be helpful to everyone's study. For more related content, please pay attention to the PHP Chinese website!

Related recommendations:

About node.js method of reading and writing system files and directories based on the fs module

Introduction to Node.js connecting to postgreSQL and performing data operations

nodejs uses ztree to move between two divs

The above is the detailed content of How nodejs implements bigpipe asynchronously loading pages. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template