h5性能优化,细节决定结果。
介绍一些最近整理的优化细节。图片压缩什么的就不说了,这是优化必须做的。今天就说一下大家写代码时可以培养的优化的细节点。
- 不滥用float。不滥用web字体。
Float在渲染时计算量比较大,并且会脱标、塌陷。我们可以用flex布局来代替。web字体引入需要不小的消耗,最好跟设计提一下不要太多。
- css中避免多余的样式设置。
color、font、line-height等都是可以继承的,所以他们的子元素如果属性一样就要重复写了,特别是font-family。
- 复杂的一个方法,可以缓存函数的返回值。
function cached (fn) {
var cache = Object.create(null);
return (function cachedFn (str) {
var hit = cache[str];
return hit || (cache[str] = fn(str))
})
};
var fk = function (str) {
return str.charAt(0).toUpperCase() + str.slice(1)
}
var cacheFk = cached(fk)
// 1 step
cacheFk('ui')
//2 step
cacheFk('ui')
这是我看vue源码时发现的一段代码,作用就是可以缓存一个复杂函数的值,如果参数一样就不重复计算。但这里要注意的是,这个缓存函数是通过闭包来做的,所以要做一些权衡。
- 尽量减少layout。
// 触发两次 layout
var newWidth = Div.offsetWidth + 50;
Div.style.width = newWidth + 'px';
var newHeight = Div.offsetHeight + 50;
Div.style.height = newHeight + 'px';
// 只触发一次 layout
var newWidth = Div.offsetWidth + 50;
var newHeight = Div.offsetHeight + 50;
Div.style.width = newWidth + 'px';
Div.style.height = newHeight + 'px';
所有可触发layout的操作都会被暂时放入 layout-queue 中,等到必须更新的时候,再计算整个队列中所有操作影响的结果,如此就可只进行一次的layout,从而提升性能。
动画元素最好脱标,不影响其他模块。这样也是为了不影响其他元素。
- transform代替position。
做一些css位移效果,最好用transform而不要用定位。我刚入门的时候用position做动画卡的一匹~~~
- 选择dom元素使用id,但不要为设置css而定义id。
如果用id选择器,就不要加其他class约束。定义过多id会使重用性降低,维护更困难,所以css中不建议多用id。
- 多次使用length的时候,要用变量保存。
var len = dom.length;
for(var i = 0;i < len;i++){};
这样好处就是每次循环,不用都计算dom的长度了。
- requestAnimationFrame代替setTimeout
var start = null;
var element = document.getElementById('SomeElementYouWantToAnimate');
element.style.position = 'absolute';
function step(timestamp) {
if (!start) start = timestamp;
var progress = timestamp - start;
element.style.left = Math.min(progress / 10, 200) + 'px';
if (progress < 2000) {
window.requestAnimationFrame(step);
}
}
window.requestAnimationFrame(step);
//window.requestAnimationFrame(callback);
返回值是一个 long 整数,请求 ID ,是回调列表中唯一的标识。是个非零值,没别的意义。你可以传这个值给 window.cancelAnimationFrame() 以取消回调函数。
requestAnimationFrame就是不用设置时间的定时器,每1/60s运行一次,这是根据浏览器刷新帧数来定的。但兼容是个问题,用的话需要写好兼容。
- 如果可以,尽量避免全局查找。
//dom = document.querySelector("#id");
function test() {
dom = document.querySelector("#id");
}
比如上面的,如果只做test内使用dom 就不要在全局定义,因为执行的时候会现在test函数内部作用域查找,速度会快。
- 除非不知道遍历的长度或者遍历对象 不要用for in
function t1(){ //20ms
var i = 0;
for(item in anObj) {
i++
}
if( i === 100000){
console.log('for in ok')
}
}
function t2(){ //4ms
var len = anObj.length;
var i = 0;
for(var i = 0 ;i < len;i++){
i++
}
if( i === 100000){
console.log('for ok')
}
}
这是我自己试验循环100000个元素的数组,得出的执行时间(看代码)。所以最好别用,一般实际也不会用到遍历对象。如果真有特殊情况遍历对象,也要注意 !!!遍历出来的东西是不是自己。以为for in是会遍历其原型链的。
- 骨架屏
这个是增强用户体验,类似增强版loading。有自动化生成方案。感兴趣可以看看。
- ios禁止页面识别手机号。Android禁止识别邮箱。
<meta name="format-detection" content="telephone=no" />
<meta name="format-detection" content="email=no" />
- 头部css 底部js。
这个大家都知道,js将阻塞解析dom,增加白屏时间。所以一定要注意啊。
其实优化的细节很多,所以要好好培养自己的编码习惯,积少成多,慢慢的不断积累,代码的质量肯定就不同了。 最后祝大家身体健康。
原文地址:https://segmentfault.com/a/1190000016829127
h5性能优化,细节决定结果。的更多相关文章
- [转] 钉钉的H5性能优化方案
对于一个H5的产品,功能无疑很重要,但是性能同样是用户体验中不可或缺的一环.原本H5的渲染性能就不及native的app,如果不把性能优化做起来,将极大地影响用户使用产品的积极性. 用户感受 当用户能 ...
- H5性能优化报告以及方案模板
H5性能优化方案: 链接:https://pan.baidu.com/s/1LCT83dJMmkvXabne3aWnzw 提取码:dc5z H5性能优化报告: 链接:https://pan.baidu ...
- Java高级开发必会的50个性能优化细节
在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时 ...
- 必会的 55 个 Java 性能优化细节!一网打尽!
阅读本文大概需要 10 分钟. 来源:https://yq.aliyun.com/articles/662001 在 Java 程序中,性能问题的大部分原因并不在于 Java 语言,而是程序本身.养成 ...
- 关于java性能优化细节方面的建议
在Javva程序中,性能问题的大部分原因并不在于Java语言,而是程序本身,养成一个良好的编码习惯非常重要,能够显著地提升程序性能.下面来聊聊该方面的建议: 1.尽量在合适的场合使用单例: 所谓单例, ...
- java开发代码中的50个性能优化细节
在java程序中,性能的大部分原因并不在java与语言,而是程序本身.养成好的编码习惯非常重要,能够显著地提升程序性能. 1:尽量在合适的场合使用单例 使用单利可以减轻加载的负担,缩短加载时间,提高加 ...
- MySQL 性能优化细节
服务器层面优化(了解) 将数据保存在内存中,保证从内存读取数据 设置足够大的innodb_buffer_pool_size,将数据读取到内存中. 建议innodb_buffer_pool_size设置 ...
- [原创]浅谈H5页面性能优化方法
[原创]浅谈H5页面性能优化方法 前阶段公司H5页面性能测试,其中测试时也发现了一些性能瓶颈问题,接下来我们在来谈谈H5页面性能优化,仅仅是一些常用H5页面性能优化措施,其实和Web页面性能优化思路大 ...
- Java 性能优化的55个细节(珍藏版)
在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间 ...
随机推荐
- select Option(增加,删除,清空)
jQuery获取Select选择的Text和Value: $("#select_id").change(function(){//code...}); //为Select添加事件, ...
- HDU2161 Primes
/* HDU2161 Primes http://acm.hdu.edu.cn/showproblem.php?pid=2161 数论 水题 注意输入截止条件是n<=0 */ #include ...
- HDU5979 Convex
/* HDU5979 Convex http://acm.hdu.edu.cn/showproblem.php?pid=5979 计算几何 三角形面积公式 * * */ #include <cs ...
- Python Study(02)之 Context Manager
上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围.一旦对象进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它 ...
- webRequest
chrome.webRequest 描述: 使用 chrome.webRequest API 监控与分析流量,还可以实时地拦截.阻止或修改请求. 可用版本: 从 Chrome 17 开始支持. 权 ...
- 使用GitHub来托管Larval框架
每个新框架都有自己的安装方法laravel 的安装方法有一下几种: (一) 通过下载 Laravel 包安装 (1) 安装Composer (2) 下载最新Larvel框架 https://g ...
- MySQL具体解释(8)----------MySQL线程池总结(二)
这篇文章是对上篇文章的一个补充,主要环绕下面两点展开.one-connection-per-thread的实现方式以及线程池中epoll的使用. one-connection-per-thread 依 ...
- 一个登录页面的spring 逻辑过程
1.首先用户访问login.jsp 2.用户在登录页面输入用户名/密码,提交表单到服务器,Spring根据配置调用LoginController控制器响应登录请求(关键) 3.LoginControl ...
- getElementsByClassName 方法兼容性封装方法二
var getElmsByClsName = function(className, results) { results = results || []; // 判断浏览器是否支持 getEleme ...
- 分享一个正则对html标签的替换
replace_html(parm){ let self = this; return self.trim(parm.replace(new RegExp("<[^<]*> ...