前端页面优化之bigpipe

简介:

bigpipefacebook提出的一种优化页面加载速度的解决方案,原理大概是先加载页面的整个框架,不需要数据的一部分,然后把需要数据的部分分成多个pagelet,后台不断的传递数据到前端来,一步步的render页面.

下面我们来说说怎么来实现这种方案,后端以nodejs来实现


因为nodejs是异步非阻塞的,实现这种方案非常有优势.假如是php的话则有难度,因为它是同步阻塞的,一次请求内不允许异步出现,除非自定义扩展.

利用Nodejs来实现bigpipe

首先nodejs需要express,async第三方模块,我们先来初始化package.json文件,然后安装依赖

  • npm init
  • npm install express --save
  • npm install async --save

然后我们来实现这些东西

  • 1.建立一个web服务器
  • 2.创建用于前端bigpipe效果的静态页
  • 3.定义两个静态文件用于数据源
  • 4.定义前端模拟的一个bigpipe请求

首先建立一个web服务器名为app.js

var express = require('express'),
    fs      = require('fs'),
    async   = require('async');

var server = express();

server.use('/bigpipe', express.static(__dirname + '/static'));
server.use('/lib', express.static(__dirname + '/bower_components'));

server.listen(4000, function(){
    console.log('server is listen on port 4000......');
})

上面的/bigpipe目录是用来前端页面内资源加载的路径,/lig是用来加载第三方前端库,这个下面会说到

最后打开监听4000端口

建立一个前端请求的页面为bigpipe.html

<!doctype html>
<html>
<head>
    <title>bigpipe</title>
    <meta charset="utf8">
    <link rel="stylesheet" href="/bigpipe/css/base.css">
</head>
<body>
    <div class="container">
        <h1>this is bigpipe demo</h1>
        <div class="content" id="body1">
            <!-- 此处数据异步加载 -->
        </div>
        <div class="content" id="body2">
            <!-- 此处数据异步加载 -->
        </div>
        <footer>
            by feenan
        </footer>
    </div>

    <!-- 模板1 -->
    <script type="text/template" id="fileinfo1">
        <p>
            <%= info%>
        </p>
    </script>
    <!-- 模板2 -->
    <script type="text/template" id="fileinfo2">
        <p>
            <%= info%>
        </p>
    </script>

    <script src="/lib/jquery/dist/jquery.min.js"></script>
    <script src="/lib/underscore/underscore.js"></script>
    <script src="/bigpipe/js/bigpipe.js"></script>

</body>
</html>

<script>
    var bigpipe = new Bigpipe();
    bigpipe.ready('users', function(data){
        // console.log(data);
        var template = _.template($('#fileinfo1').html());
        $('#body1').html(template({info: data}));   
    });
    bigpipe.ready('info', function(data){
        console.log(data);
        var template = _.template($('#fileinfo2').html());
        $('#body2').html(template({info: data}));   
    });
</script>

上面的第三方前端库,可以利用bower来安装

  • bower init
  • bower install jquery --save
  • bower install underscore --save

在根目录下建立static目录,然后分别建立js,css文件夹,这个static为前端资源文件夹

然后在js文件夹里建立bigpipe.js文件,这个主要是用来在前端定义事件,有两方法ready,set,ready主要是前端用来注册事件,set是用来后端触发事件

var Bigpipe = function(){
    this.callbacks = {};
}

Bigpipe.prototype.ready = function(key, callback){
    this.callbacks[key] = this.callbacks[key] || [];
    this.callbacks[key].push(callback);
}

Bigpipe.prototype.set = function(key, data){
    console.log(key, data);
    var callbacks = this.callbacks[key] || [];
    for (var i = callbacks.length - 1; i >= 0; i--) {
        callbacks[i].call(this, data);
    };
}

建立一个请求来模拟bigpipe,代码写在app.js

server.get('/info', function(req, res, next){

    var content = fs.readFileSync(__dirname + '/bigpipe.html', 'utf8');

    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(content);

    // 下面开始加载文件内容
    // 开始并行加载多个文件
    async.parallel([function(callback){
        fs.readFile(__dirname + '/data/users.txt', 'utf8', function(err, data){
            data = data.replace(/\n/g, '\\n');
            res.write('<script>bigpipe.set("users","'+ data +'");</script>');
            callback(err, data);
        });
    },function(callback){
        fs.readFile(__dirname + '/data/info.txt', 'utf8', function(err, data){
            data = data.replace(/\n/g, '\\n');
            console.log(data);
            res.write('<script>bigpipe.set("info","' + data + '");</script>');
            callback(err, data);
        })
    }],function(err, result){
        // if(err) res.end();
        res.end();
    });

});

上面的/info代表客户端的一个请求,里面先读取bigpipe.html文件就是上面定义的,然后先输出到浏览器,但是此时这个连接没有关闭,后面接着异步请求两个文件分别来用render页面内的两个需要数据填充的部分

async.parallel是用来并行执行方法的,上面的例子里只要有一个方法成功就输出到页面,都成功则结束此次请求调用res.end(),注意这里输出的脚本内容,bigpipe.set,这里就会触发前端页面内注册的相关事件,最后把数据render到页面内.

因为nodejs天生的异步非阻塞的特点,所以利用bigpipe方式可以有效的解决页面初始化空白的问题,而且哪怕页面内有多个数据加载的部分也可以有效的解决.

总结

bigpipe能够有效的解决重数据页面的加载问题,这个比ajax异步加载的好处就是利用一个http连接就能解决多数据加载的问题,相比一个连接一个ajax的方式明显能提高不少服务器端性能.


目录
相关文章
|
19小时前
|
Web App开发 缓存 前端开发
如何优化前端网页加载速度:最佳实践和工具推荐
本文探讨了如何通过采用最佳实践和利用先进的工具来优化前端网页加载速度。从压缩资源到使用CDN,从减少HTTP请求到利用缓存策略,我们将介绍一系列提高网页性能的技术手段。同时,我们还将推荐一些广受好评的工具,帮助开发者更轻松地实施这些优化策略。
|
1天前
|
缓存 前端开发 JavaScript
如何优化前端性能:最佳实践与工具推荐
在当今互联网时代,用户对网页加载速度和性能的要求越来越高。本文将介绍一些优化前端性能的最佳实践,包括代码压缩、资源合并、懒加载等技术,并推荐一些实用的工具,帮助开发者提升网页加载速度和用户体验。
|
4天前
|
前端开发 JavaScript UED
如何优化前端网页加载速度
在当今互联网时代,网页加载速度是用户体验的关键因素之一。本文将探讨如何通过优化前端技术,提升网页加载速度,包括压缩资源、使用CDN加速、减少HTTP请求等方法。
|
5天前
|
缓存 前端开发 JavaScript
优化前端性能的五大技巧
在当今快节奏的网络世界中,优化前端性能是网站开发中至关重要的一环。本文将介绍五种有效的技巧,帮助开发者提升前端性能,提升用户体验和网站效率。
|
11天前
|
缓存 监控 前端开发
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
【4月更文挑战第30天】本文探讨了Flutter应用启动优化策略,包括理解启动过程、资源加载优化、减少初始化工作、界面布局简化、异步初始化、预加载关键数据、性能监控分析以及案例和未来优化方向。通过这些方法,可以缩短启动时间,提升用户体验。使用Flutter DevTools等工具可助于识别和解决性能瓶颈,实现持续优化。
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
|
11天前
|
存储 缓存 前端开发
【Flutter前端技术开发专栏】Flutter中的图片加载与缓存优化
【4月更文挑战第30天】本文探讨了 Flutter 中如何优化图片加载与缓存,以提升移动应用性能。通过使用图片占位符、压缩裁剪、缓存策略(如`cached_network_image`插件)以及异步加载和预加载图片,可以显著加快加载速度。此外,利用`FadeInImage`、`FutureBuilder`和图片库等工具,能进一步改善用户体验。优化图片处理是提升Flutter应用效率的关键,本文为开发者提供了实用指导。
【Flutter前端技术开发专栏】Flutter中的图片加载与缓存优化
|
11天前
|
缓存 前端开发 数据安全/隐私保护
【Flutter 前端技术开发专栏】Flutter 中的键盘处理与输入框优化
【4月更文挑战第30天】本文探讨了Flutter中键盘处理与输入框优化的关键技术,包括监听键盘显示隐藏、焦点管理、键盘类型适配、输入框高度自适应、处理键盘遮挡问题及性能优化。通过使用WidgetsBindingObserver、FocusNode和TextInputType等工具,开发者能提升用户体验,确保输入框在各种场景下的良好表现。实例分析和实践建议有助于开发者将这些方法应用于实际项目。
【Flutter 前端技术开发专栏】Flutter 中的键盘处理与输入框优化
|
11天前
|
前端开发 UED 开发者
【Flutter前端技术开发专栏】Flutter中的列表与滚动视图优化
【4月更文挑战第30天】Flutter开发中,优化列表和滚动视图至关重要。本文介绍了几种优化方法:1) 使用`ListView.builder`和`GridView.builder`实现懒加载;2) 复用子组件以减少实例创建;3) 利用`CustomScrollView`和`Slivers`提升滚动性能;4) 通过`NotificationListener`监听滚动事件;5) 使用`KeepAlive`保持列表项状态。掌握这些技巧能提升应用性能和用户体验。
【Flutter前端技术开发专栏】Flutter中的列表与滚动视图优化
|
11天前
|
缓存 前端开发 JavaScript
如何优化前端性能:关键技巧与最佳实践
在当今数字化时代,前端性能优化是构建高效用户体验的关键。本文探讨了一系列关键技巧和最佳实践,帮助开发人员提升前端应用的性能表现。从资源加载到代码优化,从图片处理到网络请求,我们将深入探讨如何通过各种手段使前端应用更加高效。
|
12天前
|
机器学习/深度学习 前端开发 数据可视化
数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面
数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面