前端性能优化及技巧


Posted in Javascript onMay 06, 2016

    前言        为什么要优化性能对于前端工程师如此重要

          在行业内有句话不知道大家有没有听说过,‘懂得性能优化并且研究过jquery源代码的人和不懂得性能优化写出来的代码对于性能的消耗会相差上百倍甚至上千倍',现在的javascript属于从ECMAscript3到ECMAscript5以及ECMAscript6的一个过渡的过程。在javascript的编写不健全的时候编写代码方法不得当,引起的问题也是不容忽视的。

    性能优化

    下面将自己对于性能优化的一些见解与大家分享;

    1.精灵图

      最基本的是尽可能的将背景图片做成精灵图,减少图片的请求,所以一般web工程师的另一项基础本能就是精灵图的制作。

    2.css选择器优化

        在css中要尽量的使用子代选择器>,少使用后代选择器,使用后代选择器时,搜素引擎会将所有的后代元素都进行搜索,如果我们使用子代选择器时,可以将搜索的范围缩小,从而减少搜索引擎的性能消耗。

    3.js改变样式直接操作类名

       js操作元素样式时,不要用style去直接添加样式,一般属性少时不会影响多少性能,其实则不然,在每次添加样式时,页面都会重绘一次,重绘是不得不重视的,操作样式时,直接操作类名,只引起一次重绘,用style直接添加样式会引起多次的重绘。

    4.js直接操作dom节点

      当操作节点时尽量将节点添加在元素的后面,如果插入到节点的前面时,会使插入节点之后的节点都引起回流,而插入到后面时只需要被插入的节点回流一次就可以了。

    可能有人不理解重绘与回流的概念

    5.正则匹配选择器

       在css3以及jQuery中的属性选择器,这些选择器中有的是用正则进行匹配的尽量不要去使用,当然如果对于性能优化不进行考虑的话,这些方法还是比较好用的,正则匹配选择器会使搜索引擎搜索所有的标签,很大的影响性能

    6.js获取元素优化

      在js中获得元素时,正常是使用document.getElementsById,搜索引擎会从Dom树的最底端,进行搜索,直到搜索到window中的document再进行返回搜索,所以在获得元素时最好是将document.body进行储存,当再次使用时,只需将这个变量取出使用,可以节省搜索引擎的性能

    7.内存溢出

     一般在递归运行时,会产生内存溢出,造成在运行递归时性能大幅度下降,在运行结束后内存会被系统回收,所以在运行递归时需要用对象将值保存,在每次递归运算时检测,如果存在则直接返回,不存在则添加,这样就可以解决递归的很大性能。

    8.对Ajax用GET请求

    POST请求是通过先发送HTTP请求头,再发送数据来实现的,GET而是没有请求头的,但是需要注意:GET大小限制约4K,POST则没有限制。

    9.延迟加载图片

        在页面发起请求时,请求量过大,可以使图片进行懒加载,当页面滚到到图片的位置时,再进行加载图片。

        下面给大家推荐一个图片懒加载的插件

jquery.lazyload.js

   10.避免图片src属性为空

    src 属性是空字符串的图片很常见,主要以两种形式出现:

    <img src=””>

    var img = new Image();img.src = “”;

    这两种形式都会引起相同的问题:浏览器会向服务器发送另一个请求。

    技巧
        1.排他思想

    先排除当前所有的,再进行下一次操作;一般在进行动画、添加样式等时,在二次操作时先清楚前面的样式再从新添加新的样式,避免同时进行动画的冲突。

        2.短路运算(||)

    一般在一个值需要判断是否存在时,尽量不要使用if语句,可以使用短路运算符,可以省去代码占用的内存。比如:

a=a||b;

a存在则使用a,a不存在则使用b。

        3.运算(&&)

    可以运用在条件匹配时,以便条件的多余查询,比如判断一个对象是否为数组时,

a && a.length&& a.length>=0

        4.伪数组以及数组

        当需要封装一个非数组元素变为一个数组时,最简单的办法就是给其添加一个[],如果需要是一个伪数组时,可以给其设置一个length属性。

        5.节流阀

    一般运用在动画中,设定一个值,开始时设置为true,判断其值,在进入动画时给这个值赋值为false,在动画结束时使用回调函数再重新赋值为true。

        6.解除文本的被动选中状态(纯干货)

    当在点击一些按钮时,有时会出现文本被选中的情况,让客户看见就犹如bug一般,以下是解除这一状态的代码,粘贴即可。

if(document.all){
    document.onselectstart= function(){return false}; //for ie
  }else{
    document.onmousedown= function(){return false};
    document.onmouseup= function(){return true};
  }
  document.onselectstart = new Function('event.returnValue=false');

        7.巧妙使用三元运算符

        当需要判断一个值是否存在,也可以使用三元运算符使代码更加优化。比如

obj=obj===undefined?Object:obj;

        补充:

        上述是自己在工作中,总结的前端优化以及一些技巧与大家分享,如果大家有什么好的优化以及技巧希望可以多多评论,个人认为技术是需要多沟通才可以更好的进步。

Javascript 相关文章推荐
如何快速的呈现我们的网页的技巧整理
Jul 01 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
Feb 10 Javascript
基于jquery的图片幻灯展示源码
Jul 15 Javascript
JQuery操作单选按钮以及复选按钮示例
Sep 23 Javascript
在Ubuntu上安装最新版本的Node.js
Jul 14 Javascript
jQuery元素的隐藏与显示实例
Jan 20 Javascript
基于javascript实现彩票随机数生成(升级版)
Apr 17 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
Jul 24 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
Jan 05 Javascript
微信小程序 五星评价功能的实现
Mar 09 Javascript
详解angular ui-grid之过滤器设置
Jun 07 Javascript
详解阿里Node.js技术文档之process模块学习指南
Jan 04 Javascript
jquery自定义插件开发之window的实现过程
May 06 #Javascript
快速使用Bootstrap搭建传送带
May 06 #Javascript
BootStrap响应式导航条实例介绍
May 06 #Javascript
jQuery侧边栏实现代码
May 06 #Javascript
BootStrap制作导航条实例代码
May 06 #Javascript
jQuery实现下拉框功能实例代码
May 06 #Javascript
jQuery 实现评论等级好评差评特效
May 06 #Javascript
You might like
浅谈php和.net的区别
2014/09/28 PHP
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
微信小程序实现下载进度条的方法
2017/12/08 Javascript
常用的9个JavaScript图表库详解
2017/12/19 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
一篇文章搞懂Python的类与对象名称空间
2018/12/10 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
《梅兰芳学艺》教学反思
2014/02/24 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
订货会主持词
2015/07/01 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
详解Python requests模块
2021/06/21 Python
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL