webapp 不像传统页面,它生命周期更长,在手机端上,硬件环境并没有pc上那么好。所以性能的优化尤为重要。 webapp的性能优化主要分为两个方面 网络请求优化 和 页面渲染优化 , 我们对于性能优化主要通过这连个方面来处理。

压缩资源文件

我们在使用某些框架的时候(例如:JQuery), 会发现有两个文件 jquery.js 和 jquery.min.js, jquery.min.js 的体积会小很多,这样在请求的时候会比较快。

所以在项目中使用到的资源文件(js、css、image)在发布之前需要进行压缩处理, 这里有些在线的压缩的工具 在线压缩, 如果使用写项目管理工具, 可以考虑用 gulp 请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var gulp = require('gulp'),
uglify = require('gulp-uglify'),
rename = require('gulp-rename'),
sourcemaps = require('gulp-sourcemaps'),
minifycss = require('gulp-minify-css'); gulp.task('js', function(){
return gulp.src('./test.js')
.pipe(sourcemaps.init())
.pipe(rename({suffix: '.min'}))
.pipe(uglify())
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest('./'));
}); gulp.task('css', function(){
return gulp.src('./test.css')
.pipe(rename({suffix: '.min'}))
.pipe(minifycss())
.pipe(gulp.dest('/'));;
});

合并请求

开发过程中,维护一个很长的js或是css文件是一个很困难的事情,常常会吧它分为很多的小得js和css文件,但是如果按照传统的方式写script/link 标签加载,会多很多请求,有http 1请求的原因,每个请求都会有一个rtt(请求回路)时间,一旦请求数量增多,那么请求的时间也会变长。 在发布之前我们可以使用一些工具将这些资源文件合并为一个, 我们常使用gulp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var gulp = require('gulp'),
uglify = require('gulp-uglify'),
rename = require('gulp-rename'),
concat = require('gulp-concat'),
sourcemaps = require('gulp-sourcemaps'),
minifycss = require('gulp-minify-css'); gulp.task('js', function(){
return gulp.src('./app/**/**.js') //app 下所有的js 文件
.pipe(sourcemaps.init())
.pipe(concat('./app.js')) //合并所有文件
.pipe(gulp.dest('./'))
.pipe(rename({suffix: '.min'}))
.pipe(uglify())
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest('./'));
}); gulp.task('css', function(){
return gulp.src('./app/**/*.css')
.pipe(concat('./app.css')) //app 下所有的 css文件
.pipe(gule.dest('./'))
.pipe(rename({suffix: '.min'}))
.pipe(minifycss())
.pipe(gulp.dest('/'));;
});

cdn 和 gzip

CDN 的全称是 Content Delivery Network ,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

GZIP 最早由 Jean-loup Gailly 和 Mark Adler 创建,用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。
HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的。

我们可以将静态的资源发布到cdn上,并开启 gzip 会大大的提高页面加载数据

lazyLoad

webapp 首屏加载速度是一个重要的指标,那么怎么让我们首页最快速度加载出来呢?首页中我们能直接看到的只有一屏,那么剩下的我们可以做 lazyload, 先加加载能直接看到,让后异步延迟加载剩下的内容。

数据缓存

webapp 中有很多和后台的交互,首页加载的时候可以先使用上次的缓存数据,等请求成功后再刷新这部分的显示, 在一些短暂时间的重复请求,可以使用 sessionStorage 缓存这些数据, 使用 一些手段 设置缓存时间,短暂时间的内的重复请求就可以直接从缓存中获取数据了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//封装请求方法
function getData(url, params, onloadSuccess){
var key = url; //使用 url + params 做key
for(var str in params){
key += str += params[str];
}
if(sessionStorage.getItem(key)){
//如果有缓存直接从缓存中取
onloadSuccess(JSON.stringify(sessionStorage.getItem(key)));
reutrn ;
}
$.ajax({
url: url,
data: data,
dataType: 'json',
type: 'post',
success: function(data){
sessionStorage.setItem(key, data); //缓存数据
onloadSuccess(data);
}
});
}

css动画GPU加速消除闪屏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.animate{
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
backface-visibility: hidden; -webkit-perspective: 1000;
-moz-perspective: 1000;
-ms-perspective: 1000;
perspective: 1000;
}

js动画

有些动画需要一些js控制无法使用css动画的情况,我们可以考虑使用js动画来做。可以使用window.requestAnimationFrame.

window.requestAnimationFrame() 这个方法是用来在页面重绘之前,通知浏览器调用一个指定的函数,以满足开发者操作动画的需求。这个方法接收一个函数作为参数,改函数在重绘前调用。

它稳定性比 setTimeout 要好,但是并不是所有的浏览器都支持这个api, 我们需要一个兼容性代码处理。

1
2
3
4
5
6
7
8
9
10
window.requestAnimationFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback) {
return window.setTimeout(callback, 1000 / 60);
};
})();

布局优化

PC 上有很多用float来做的布局,float的布局在需要更大的计算量,在页面渲染的时候严重影响到了加载速度,尽量考虑用 inline 和 inline-block 替代, flex box 是专为响应式设计布局方式,在移动端兼容性良好,可以考虑大范围使用,这里推荐下阮一峰大大的教程 Flex 布局教程:语法篇

优化页面上的dom数量

在mobile端,如果页面中的dom数量过多,在页面滚动的时候会出现卡顿,闪烁等等不良的情况,所以我们要删除一些页面上不必要的dom元素或者将一些dom元素作为延迟加载。

优化dom查询性能

先看一下这个部分的代码

1
2
3
for(var i = 0; i< 100; i++){
var a = $('.test');
}

上面的代码每次循环的时候都会去进行一次dom查询,显然是不必要的消耗,我们需要在dom查询之前缓存,避免不必要的dom操作。

1
2
3
4
var a = $('.test');
for(var i = 0; i< 100; i++){
// do somethings
}

webapp 性能优化的更多相关文章

  1. cordova/phonegap/webapp性能优化方法

    1.有条件可以自己做UI,不要用框架.用框架的话不要用jquery mobile,用sencha touch或者jqmobi(app framework) 2.不要在服务器生成UI,在本地生成. 3. ...

  2. 移动H5前端性能优化指南

    移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网 ...

  3. H5 缓存机制浅析 移动端 Web 加载性能优化

    腾讯Bugly特约作者:贺辉超 1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性.离线存储(也可称为缓存机制)是其中一个非常重要的特性.H5 引入的离线存储, ...

  4. javascript基础-性能优化

    优化点 性能检测 基调网络 http://www.cesule.com/cesule/status/show/3496d91653a14743af2bd2e261aee204 阿里测 http://a ...

  5. tomcat之性能优化

    tomcat是我们常用的web容器,它的性能高低直接影响到应用对外提供服务的能力和用户的体验,所以tomcat的优化至关重要.对于单台tomcat服务器而言,优化主要是两方面:内存优化和配置优化(例如 ...

  6. cordova性能优化方法

    做了几个cordova的项目,觉得webapp性能的确是比不上原生,在IOS上还好,安卓上特别的明显.技术群里面很多人都在说cordova是个渣,没用之类的.其实只是很多人没有深入去了解,做点小优化, ...

  7. 移动H5前端性能优化指南[转]

    移动H5前端性能优化指南 米随随2015.01.23 移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首 ...

  8. 移动 H5(PC Web)前端性能优化指南

    原文地址https://zhuanlan.zhihu.com/p/25176904?utm_source=wechat_session&utm_medium=social&utm_me ...

  9. [转]移动H5前端性能优化指南

    移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网 ...

随机推荐

  1. [HeadFist-HTMLCSS学习笔记][第七章CSS入门:加一点样式]

    CSS入门 style元素设置CSS 基本格式 <style type="text/css"> body { background-color: #eaf3da; } ...

  2. T-SQL和PL/SQL 区别

    结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统:同时也是数据库 ...

  3. easyui-window

    <div id="win" class="easyui-window" title="My Window" style="w ...

  4. (原+转)pycharm中传入命令行参数

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5670821.html 参考网址: http://zhidao.baidu.com/question/5 ...

  5. alloc & init & dealloc

    在Objective-C中,alloc,init和dealloc是经常使用的函数,那么它们内部到底是如何实现的呢?通过查看libobjc运行时库,可以发现他们的工作原理. 1 alloc alloc的 ...

  6. Myeclipse中如何修改Tomcat的端口号

    一,使用 Myeclipse 中自带的 tomcat 右键 configure 弹出窗口 在 port Number 中修改 端口号即可: 二,配置的 tomcat 如果用上述的方法,只能打开这样的窗 ...

  7. Maven 学习笔记

    1. Maven 工具的意义: 从事软件开发,无论什么样的项目,什么样的技术,都要经历:编码.测试.打包.发布等几个特定过程,而这些过程在软件开发周期中都是重复的.繁琐的.Maven的出现是为了将开发 ...

  8. 子元素用margin-top 为什么反而作用在父元素上?对使用margin-top 的元素本身不起作用?

    在这个说明中,“collapsing margins”(折叠margin)的意思是:2个或以上盒模型之间(关系可以是相邻或嵌套)相邻的margin属性(这之间不能有非空内容.padding区域.bor ...

  9. C语言编译过程简介

    刚开始接触编程的时候,只知道照书敲敲代码,一直都不知道为什么在windows平台下代码经过鼠标那样点击几下,程序的结果就会在那个黑色的屏幕上.现在找了个机会将C语言的编译原理做一下小小的总结,这样也能 ...

  10. ACM题目推荐(刘汝佳书上出现的一些题目)[非原创]

    原地址:http://blog.csdn.net/hncqp/article/details/1758337 推荐一些题目,希望对参与ICPC竞赛的同学有所帮助. POJ上一些题目在http://16 ...