zoukankan      html  css  js  c++  java
  • 前端性能优化方案

    一、HTTP层面网络层优化

    • 减少HTTP请求次数
    • 减少DNS解析次数,如果非要多次解析,使用 DNS Prefetch
    • 静态资源文件一定要使用强缓存「Expires / Cache-Control」和 协商缓存「Last-Modified / ETag」
    • 资源文件的压缩「可以基于webpack打包压缩,而且服务器端一定要开启GZIP压缩{这个可以把资源压缩60%左右}」
    • 资源文件的合并「可以基于webpack打包合并,目的是减少页面中的HTTP请求次数」
    • 客户端尽可能减少对cookie的存储,因为每一次向服务器发送请求,都会自动把cookie基于请求头传递给服务器,如果cookie设置过多,每一次和服务器通信都会变慢「使用localStorage代替cookie」
    • 对于一些静态资源,可以使用CDN加速
    • 基于Connection: keep-alive建立TCP的持久链接,实现通道复用
    • 使用HTTP2.0进行数据传输
    • 对于图片使用BASE64
    • 使用CSS Sprit,把多张小图合并为一个大图,只请求一次资源,可以减少HTTP请求次数
    • 客户端和服务器之间的数据通信,尽可能使用JSON格式

    二、渲染页面的时候

    • 坚决不用 @import 导入样式
    • 尽量使用CSS3动画,如果非要使用JS实现动画,最好使用requestAnimationFrame
    • 避免过深的DOM层级嵌套「加快DOM TREE的生成 && 有利于SEO优化」
    • 避免CSS选择器前缀过长「加快CSS TREE的生成」
    • 减少DOM的重排「读写分离、元素批量操作{使用文档碎片等方案}、修改样式使用transform、运动的元素放在单独的文档流中、 尽可能减少直接操作DOM,使用MVVM/MVC数据驱动框架...」
    • link置于页面顶部,提前获取CSS资源;JS处于页面底部,因为它会阻碍GUI的渲染;或者JS导入采用async/defer;
    • 页面样式较少的情况下,尽可能使用内嵌样式,减少HTTP请求,加快渲染「移动端首选方案」
    • 使用字体图标或者SVG矢量图代替位图「位图:jpg/jpeg/png/gif...都是位图 字体图标或者矢量图除了一定程度上减少了HTTP请求、而且对于图片的渲染和自适应尺寸的调整都有很大帮助」
    • 减少页面中iframe的使用
    • 图片使用webp格式
    • 基于IntersectionObserver代替传统的window.onscroll
    • CSS中减少对filter的使用
    • 避免使用TABLE布局

    三、代码运行

    • 尽可能使用事件委托「事件委托性能很高、减少很多内存的消耗、可以给动态渲染的元素做事件绑定...」
    • 合理使用闭包「闭包会引发不释放的栈内存,过多使用内存消耗大,还可能导致内存泄漏或者栈溢出等」
    • 减少对递归的使用「尤其是一定要避免死递归,这样会导致栈溢出」
    • 对于页面交互操作,采用防抖和节流处理
    • 页面中尽可能使用异步编程,对于数据的请求也尽可能分批请求处理「例如:点击加载更多、下拉刷新、上拉加载、分页...」
    • JS代码中不要使用:with,减少对eval的使用
    • 避免出现死循环,嵌套循环会导致算法的时间复杂度过高
    • 低耦合高内聚
    • 手动回收堆栈内存

    四、额外方案

    • 前后端通信,尤其是实时通信{IM即时通信系统,例如:QQ和微信...},可以使用scoket.io等最新的通信技术
    • 采用骨架屏技术「前端骨架屏{升级版的loading,最开始只展示灰色的框框等,也不去加载资源,这样页面渲染出来速度会很快,减少白屏时间...} 和 服务器骨架屏{SSR 首屏信息是服务器渲染的,其余屏幕的信息是客户端渲染的}」
    • 音视频资源一定要延后加载,等到页面其它资源都渲染完了,播放音视频的时候再去加载「对于默认播放的效果,也要延后播放」; 也可以让音视频资源采用直播流的方式播放「直播流的后缀.m3u8」
    • 图片懒加载,加快页面第一次渲染的速度,减少白屏等待时间

    文章转载自:https://juejin.cn/post/7002603443361677343

    虚心学习、丰富自己
  • 相关阅读:
    TestNG入门教程-6-enabled和priority属性
    TestNG入门教程-5-timeOut属性
    TestNG入门教程-4-Testng中注释简介
    Unicode、UTF-8 和 ISO8859-1到底有什么区别
    java数目
    sql必知必会-总结篇
    mysql监控、性能调优及三范式理解
    loadrunner常用函数总结
    loadrunner监控度量项及中文解释
    linux下crontab的使用实现
  • 原文地址:https://www.cnblogs.com/tkqq000/p/15219292.html
Copyright © 2011-2022 走看看