Nodejs は bigpipe 非同期読み込みページを実装します solution_node.js

WBOY
リリース: 2016-05-16 15:18:11
オリジナル
1159 人が閲覧しました

ビッグパイプの紹介

Facebook 初の非同期ページ読み込みソリューション。HTTP リクエストを削減し、最初の画面を迅速に読み込みます。これはフロントエンドのパフォーマンス最適化の方向性です。

BigPipe と AJAX の比較

AJAX は主に XMLHttpRequest であり、フロントエンドはサーバーに動的データを取得して Web ページに追加するよう非同期的に要求します。このような往復リクエストには時間がかかりますが、BigPipe テクノロジーでは XMLHttpRequest リクエストを送信する必要がないため、時間を節約できます。リクエストを減らすことのもう 1 つの利点は、サーバーの負荷が直接軽減されることです。もう 1 つの違いは、サーバーが AJAX リクエストの前に待機することです。ページはリクエスト後待機中です。 BIGPIPE はフロントエンドとバックエンドで並行して動作できるため、効率も向上します。

Bigpipe の欠点

SEO の問題。 Facebook の動的表示コンテンツは主に顧客指向のパーソナライズされたページです。 SEOの要件はそれほど高くありません。そして、BIGPIPE テクノロジーが Taobao で使用される場合、Baidu がこの種の動的ページの検索をどの程度サポートしているかはわかりません。したがって、実際には、ANGULARJS を使用してデータを動的にバインドする場合にもこの問題が発生します。 、SEO ニーズのあるページでは、BIGPIPE テクノロジーを使用するかどうかを慎重に検討する必要があります。 (GOOGLE検索はANGULARのSEOに最適化されていることが知られています。) Baiduについては――。 -下の写真を見て確認してください

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テクノロジーの実装はフロントエンドが独立して完了できる最適化になります。最初の画面の読み込み時間を短縮します。そして、Webページ全体の読み込み時間を改善することは、閲覧数の増加に一定の効果をもたらします。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート