前端通用性能优化总结

一.图片优化

1.使用雪碧图(webpack和gulp都有对应插件自动转换成雪碧图),减少请求。
2.压缩图片质量(打包编译可以找对应的插件,手动版可以看下智图),在不失真和可接受失真条件下可以减少大量数据请求。
3.小图可以考虑base64,最好不要大于5kb,简单图可以考虑用canvas和svg代替。
4.条件允许考虑使用webp,不过要注意兼容问题。具体可以参考这篇文章
5请务必指定img大小来减少图片资源加载完后造成的重排性能损耗

未设置图片大小

图中update layer tree时间就是不指定图片大小造成的损耗。对于页面负责程度较高的这里造成的顺畅会影响用户体验。
6.灵活使用srcset 或picture 让图片响应式加载。
7.首屏多图可以通过图片懒加载去减少请求数,通过占位符显示图片(比如全部请求预览图),到可视区域时再加载实际图片。

二js代码优化

1.减少dom操作,dom树渲染和js代码编译是通过不同的引擎实现的,每次通过js动态操作dom,都会造成2个引擎建立连接额外开销。现在通过框架去开发项目基本不会考虑这个问题了,vue react都引入了vdom。vdom通过diff算法同步到dom tree减少了额外的性能损耗达到提升性能的效果,具体可以看下这篇介绍。
2.减少重绘重排。虽然现代浏览器对重绘重排有做优化,但是代码中引入获取当前布局的api都会造成强制重绘重排。

/**会触发重排的属性。
offsetTop,offsetLeft,offsetWidth,offsetHeight;
scrollTop,scrollLeft,scrollWidth,scrollHeight;
clientTop,clientLeft,clientWidth,clientHeight;
getComputedStyle()/currentStyle**/
//以下代码在本机测试结果0.17ms和0.32ms
 if (document.body.currentStyle) {
            computed = document.body.currentStyle;
        } else {
            computed = document.defaultView.getComputedStyle(document.body, '');
    }
    
        function testOneByOne() {
            for(var i=0;i<10000;i++){
            s.color = 'red';;
            tmp = computed.backgroundColor;
            s.color = 'white';
            tmp = computed.backgroundImage;
            s.color = 'green';
            tmp = computed.backgroundAttachment;
            }
        }

 function testAll() {
            start()
            for(var i=0;i<10000;i++){
            s.color = 'yellow';
            s.color = 'pink';
            s.color = 'blue';
        }
            // tmp = computed.backgroundColor;
            // tmp = computed.backgroundImage;
            // tmp = computed.backgroundAttachment;
            end()
        }

3.使用事件代理代替批量绑定,给每个元素绑定事件会带来额外开销。可以通过事件冒泡通过来源进行不同事件处理。
4.高频事件考虑用防抖和节流,像滚动触发更新,输入框输入联想请求。
5.减少作用域访问层级,一个执行环境中寻找对象是通过作用域连去查值的,如果当前环境没有会随着作用域连一层一层往上直到全局环境。
6.频繁的对象属性访问可以先缓存到内存。
7.字面量的创建执行效率比new 一个对象效率要高

           var str ='str';
            var str2= String('str');//也没人会这么用吧
            var arr=['1'];
            var arr2=Array('1');//也没人会这么用吧

8.闭包有很多好处,主要是利用闭包的特性进行传参和属性的动态初始化。
常见的:利用匿名函数自执行封装自身属性,防止属性外协。
上面提到的防抖节流就可以利用闭包特性。
还有柯里化的使用
但是:闭包本身会带来内存无法被回收的问题。如果在业务逻辑确认是无效代码最好清除闭包引用保证能被回收。

三 css优化

1.head头css后面不要跟script 会阻塞dom往下解析

<script>
        setTimeout(function(){
            var testdom=document.getElementById("test");
        console.log(testdom)
        },10)
       
        </script>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
   <script>
//如果没有这段script,link解析完就会往下解析下面的body。原因在于dom引擎和javscript引擎只占其一。
//如果css文件够大 二网络又很不稳定 这一小段代码就很影响体验了
   </script>
   <title>Document</title>
</head>
<body>
   <div id="test">test</div>  
</body>

2.合理有规范的编写cssname。有关css查找规则可以参考这个

//以业务模块为单位,合理给class命名 
<div class='wrapper'>
  <header class='header'>
      <ul class="header-menu menu">
        <li class="header-menu-item"></li>
      </ul>
 </header>
  <div class="content">
    <ul class="content-menu menu">
          <li class="content-menu-item"></li>
      </ul>
</div>
</div>
<style>
  .content .menu li{
}  
//or
.content-menu-item{
}
</style>

3.简单动画可以使用css3来实现 css动画和js动画对比
四:关于加载优化,(首屏加载优化会再启一篇文章做总结)
利用你手头资源对代码进行压缩和合并,加快首屏代码加载速度。
包括但不限于

  1. js加载编译后置
    2.开启gzip
    3.客户端缓存策略(假设是在webview),cdn缓存,service-work缓存。
    4.首屏加载有效代码率。
    5.使用预加载(preload,如果是客户端,可以考虑变种策略)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 关于前端性能优化问题详解 出处:http://segmentfault.com/blogs 前端性能优化指南 AJ...
    bennnnn阅读 1,580评论 2 4
  • AJax 优化 缓存 Ajax 请求尽量使用GET, 仅取决于cookie数量 Cookie 优化 减少Cooki...
    KeKeMars阅读 9,347评论 5 89
  • 序 曾经看过一篇文章,有一句话这样说: 只有在大学的图书馆里,你才能真正赚回你交的学费。 临近毕业,还想再去图书馆...
    番茄沙司a阅读 2,239评论 2 50
  • 前端性能优化资料整理 页面性能差的直接后果是用户需要等待,而等待,尤其是不确定要多长时间的等待会给用户带来焦虑,为...
    飘零之雪阅读 804评论 2 3
  • 围绕前端的性能多如牛毛,涉及到方方面面,以我我们将围绕PC浏览器和移动端浏览器的优化策略进行罗列注意,是罗列不是展...
    流动码文阅读 675评论 0 0