nodejs實現(xiàn)bigpipe異步加載頁面方案
Bigpipe介紹
Facebook首創(chuàng)的一種減少HTTP請求的,首屏快速加載的的異步加載頁面方案。是前端性能優(yōu)化的一個方向。
BigPipe與AJAX的比較
AJAX主要是XMLHttpRequest,前端異步的向服務(wù)器請求,獲取動態(tài)數(shù)據(jù)添加到網(wǎng)頁上。這樣的往返請求需要耗費(fèi)時間,而BigPipe技術(shù)并不需要發(fā)送XMLHttpRequest請求,這樣就節(jié)省時間損耗。減少請求帶來的另一個好處就是直接減少服務(wù)器負(fù)載。還有一個不同點(diǎn)就是AJAX請求前服務(wù)器在等待。請求后頁面在等待。BIGPIPE可以前后端并行工作也帶來了效率上的提升。
Bigpipe缺點(diǎn)
SEO問題。Facebook的動態(tài)展現(xiàn)內(nèi)容主要是面向客戶的個性頁面。對于SEO的要求并不高。而如果把BIGPIPE技術(shù)用到淘寶上的話SEO的問題就會明顯了,現(xiàn)在不確定百度對于這種動態(tài)頁面的搜索支持度如何,其實在使用ANGULARJS動態(tài)綁定數(shù)據(jù)的時候也會有這方面的問題所以對于SEO有需求的頁面需要慎重考慮是否使用BIGPIPE技術(shù)。(已知GOOGLE搜索對于ANGULAR的SEO有優(yōu)化。)至于百度么-。-看下圖就知道了
NODEJS實現(xiàn)
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服務(wù)器代碼
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 rel="stylesheet">
</head>
<body>
<div id="test1">loading......</div>
<div id="test2">loading......</div>
<script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>
<script src="http://cdn.bootcss.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script src="http://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>
總結(jié)
Bigpipe技術(shù)其實具體實現(xiàn)需要服務(wù)器的代碼配合,在開發(fā)中我感覺功能占20%,優(yōu)化占80%的工作量,優(yōu)化的難度很多時候比開發(fā)還高。還需可能對全棧的了解。所以現(xiàn)在nodejs作為前后端分離的中間層是一個我個人認(rèn)為比較合理的一個解決方案。如果前后端完成nodejs的中間層分離,Bigpipe技術(shù)的實現(xiàn)將會是前端可以獨(dú)立完成的一個優(yōu)化。提高首屏加載時間。并且提高整個網(wǎng)頁的加載時間,對于瀏覽量的提升會帶來一定效果的。
相關(guān)文章
輕松創(chuàng)建nodejs服務(wù)器(6):作出響應(yīng)
這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(6):作出響應(yīng),我們接著改造服務(wù)器,讓請求處理程序能夠返回一些有意義的信息,需要的朋友可以參考下2014-12-12
Node.js中Express生成Token的實現(xiàn)方法
本文介紹了在Express中生成和使用Token進(jìn)行用戶認(rèn)證的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
express結(jié)合nodejs開啟服務(wù)示例模版
這篇文章主要為大家展現(xiàn)了express結(jié)合nodejs開啟服務(wù)的代碼示例模版,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Nodejs高擴(kuò)展性的模板引擎 functmpl簡介
本文給大家分享的是一款nodejs高擴(kuò)展性的模板引擎functmpl的簡單介紹以及用法詳解,有需要的小伙伴可以參考下2017-02-02
使用 NodeJS+Express 開發(fā)服務(wù)端的簡單介紹
這篇文章主要介紹了使用 NodeJS+Express 開發(fā)服務(wù)端的簡單介紹,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04
使用?Node-RED對?MQTT?數(shù)據(jù)流處理
本文將介紹使用 Node-RED 連接到 MQTT 服務(wù)器,并對 MQTT 數(shù)據(jù)進(jìn)行過濾和處理后再將其發(fā)送至 MQTT 服務(wù)器的完整操作流程。讀者可以快速了解如何使用 Node-RED 對 MQTT 數(shù)據(jù)進(jìn)行簡單的流處理2022-05-05

