前端页面优化之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的方式明显能提高不少服务器端性能.

时间: 2025-01-20 16:45:53

前端页面优化之bigpipe的相关文章

前端页面卡顿?或是DOM操作惹的祸,需优化代码

文档对象模型(DOM)是一个独立 于特定语言的应用程序接口.在浏览器中,DOM接口是以JavaScript语言实现的,通过JavaScript来操作浏览器页面中的元素,这使得 DOM成为了JavaScript中重要的组成部分.在富客户端网页应用中,界面上UI的更改都是通过DOM操作实现的,并不是通过传统的刷新页面实现 的.尽管DOM提供了丰富接口供外部调用,但DOM操作的代价很高,页面前端代码的性能瓶颈也大多集中在DOM操作上,所以前端性能优化的一个主要的关注 点就是DOM操作的优化.DOM操作

CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化

一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运行平台还存在差异.屏幕分辨率不一样,大小不一样,比例不一样.兼容性主要考虑三方面: 1).CSS兼容2).JavaScript兼容3).HTML兼容 这三类也是前端的主要组成部分,都存在一定的兼容性问题,知己知彼,百战百胜,我们先了解浏览器的发动机-内核. 多年前我们一直为IE6兼容烦恼,为它没少加

丰趣海淘:跨境电商平台的前端性能优化实践

原文出自[听云技术博客]:http://blog.tingyun.com/web/article/detail/586 随着互联网的发展,尤其是在2000年之后浏览器技术渐渐成熟,Web产品也越来越丰富,这时我们被浏览器窗口内的丰富"内容"所吸引,关注HTML/CSS,深入研究Dom.Bom和浏览器的渲染机制等,接触JavaScript库,"前端"这个职业,由此而生. 前端技术在这10多年中飞速发展,到了今天,我们可能发现"内容"的美在视觉上是有

前端性能优化:Javascript的加载顺序

文章简介:35条Javascript最佳实践. 相信很多与页面打过交道的同学都对 Yahoo 的 Best Practices for Speeding Up Your Web Site 不陌生.而这 35 条最佳实践中,对 Javascript 的加载顺序的要求是:Put Scripts at the Bottom.因为根据HTTP/1.1 specification 看来,在同一时间加载两个文件是最理想的,而 Javascript 脚本会阻碍平行下载.Steve 说那是 2008 – 200

WEB前端性能优化:HTML,CSS,JS和服务器端优化

文章描述:WEB前端性能优化小结. 对前端开发工程师来说,前端性能优化的重要性是不言而喻的,最为大家所知的是YSLOW的23条优化规则,在我的理解中,性能优化不纯粹是指用户访问网站的速度,也包括开发的效率,这里我总结下我理解中的WEB前端性能优化. HTML部分 语义化HTML:好处在于可以使代码简洁清晰,支持不同设备,利于搜索引擎,便于团队开发: 减少DOM节点:加速页面渲染: 给图片加上正确的宽高值:这可以减少页面重绘,同时防止图片缩放: 防止src属性和link的href属性为空:当值为空

网页前端开发优化的参考List

网页制作Webjx文章简介:一些前端开发优化的经验总结. 发现的一篇关于前端优化的文章,总结的很全面,要做到面面俱到很难,往往是想优化而没有时间去优化,就像我们公司,一个项目连着一个项目~新员工的培训都省了,还想优化前端啊,不过我真的想有机会和老大好好的整合下公司网站的前端代码~不过要把前端优化的工作放在平时的写代码中去,就不需要刻意的后期优化了.在项目开发中,后台需要搭建好框架,前端更是需要搭建好框架,并且在页面实现中得到实现,只有这样才能事半功倍. 前段时间简单的研究了下前端优化相关的知识,

Web前端性能优化全攻略

Web 前端性能优化是个大话题,是个值得运维人员持续跟踪的话题,是被很多网站无情忽视的技术. Web 前端优化最佳实践之 内容篇Web 前端优化最佳实践之 Server 篇Web 前端优化最佳实践之 Cookie 篇Web 前端优化最佳实践之 CSS 篇Web 前端优化最佳实践之 JavaScript 篇Web 前端优化最佳实践之 图象篇Web 前端优化最佳实践之 Mobile(iPhone) 篇 Yahoo! 的 Exceptional Performance team 在 Web 前端方面作

移动HTML 5前端性能优化指南

  前端工程师的菜!最近移动Html 5越来越火,想有一个体验流畅的Html 5 应用,这篇优化指南就别放过咯.腾讯的同学将关键的注意点与优化方法都总结出来,全文高能干货,非常值得深度学习 >>> 概述 PC优化手段在Mobile侧同样适用 在Mobile侧我们提出三秒种渲染完成首屏指标 基于第二点,首屏加载3秒完成或使用Loading 基于联通3G网络平均338KB/s(2.71Mb/s),所以首屏资源不应超过1014KB Mobile侧因手机配置原因,除加载外渲染速度也是优化重点 基

5173首页前端性能优化实践

从制定计划,到前后端的开发,最后到测试以及上线,历时4个月,5173首页前端性能优化项目终于顺利上线,并达到了预期的性能优化目标.这次的项目并不是改版,而是原来首页的设计和功能不变,只做重构和优化.虽然项目名叫前端的性能优化,但也并不仅仅是前端单方面的工作,要想彻底的把优化做好,就需要前后端的通力配合. 历史背景 老首页应该是09年上线的,首页也是各部门争夺资源的地方,大家都想在首页有一席之地,各部门在首页都有各自的小豆腐块,如果有新项目的上线,大多是打补丁的方式,并且唯一的规范就是能保证功能正