前言

参考

具体分类

  • 网络层面的优化
  • DOM操作与渲染层面的优化
  • 数据层面的优化

前端优化的需求

  • 用户角度:网页快速流畅
  • 开发人员角度:快速,整洁,规范

网络方面

一,减少http请求

主要是优化js,css和图片资源三个方面

  • 合并js文件
  • 合并css文件
  • 雪碧图的使用(css sprite)
  • 使用base64表示简单的图片

合并js文件和css文件可以使用webpack等打包工具。

雪碧图有专门的制作工具。

图片编码使用base64,对于一些简单的图片可以使用base直接写入html。

二,减少资源体积

  • gzip压缩 参考
  • js混淆
  • css压缩
  • 图片压缩

gzip压缩: gzip主要是针对html文件而言,可以将html中重复的部分进行一个打包,多次复用。

js混淆: 可以有简单的压缩(将空白字符删除)、丑化(丑化的方法,就是将一些变量缩小)

css压缩:就是进行简单的压缩

图片压缩:主要也是减小体积,在不影响观感的前提下,尽量压缩图片,使用png等图片格式,减少矢量图、高清图等的使用。

三,缓存

  • DNS缓存
  • CDN部署与缓存
  • http缓存

DOM操作与渲染层面的优化

浏览器是如何渲染网页的

参考

  1. 使用HTML创建文档对象模板(DOM)
  2. 使用CSS创建CSS对象模板(CSSOM)
  3. 基于DOM和CSSOM执行脚本(Scripts)
  4. 合并DOM和CSSOM形成渲染树(Render Tree)
  5. 使用渲染树布局(Layout)所有元素
  6. 渲染(Paint)所有元素

一,优化网页渲染

  • css样式放在头部,js文件放在尾部或者设置异步
  • 尽量避免内联内联样式

二,DOM操作优化

  • 减少回流和重绘
    • 避免在doucument上直接进行频繁的DOM操作
    • 使用Classname代替大量的内联样式修改
    • 对于复杂的UI元素,设置position为absolute或fixed
  • 尽量使用CSS动画而非js动画
  • 使用requestAnimationFrame代替setInterval
  • 适当使用canvas
  • 尽量减少css表达式
  • 使用事件代理

四,移动端优化

  • 长列表滚动优化
    • IOS尽量使用局部滚动
    • android尽量使用全局滚动
  • 函数防抖和函数节流
  • 使用touchstart,touchend代替click
  • HTML的viewport设置
  • 开启GPU渲染加速

函数防抖和函数节流:设计滚动等会被频繁触发的DOM事件,需要做好防抖和节流的工作。他们都是为了限制函数的执行频次,以优化函数触发频率过高导致响应的速度跟不上触发频率,出现延迟,假死或卡顿的现象。

函数防抖:当调用动作经过n毫秒后,才会执行该函数,若在这n毫秒内又调用此函数将会重新计算执行时间。
函数节流:预先设定一个执行周期,按照固定的周期执行一次函数,然后进入下一个新周期。

数据方面的优化

一,图片加载处理

  • 图片预加载
  • 图片懒加载
  • 首屏加载时进度条的显示

预加载:提前加载内容

图片懒加载:在最初给图片的src设置一个比较简单的图片,然后将图片的真实地址设置给自定义属性,做一个占位。然后给图片设置监听事件,一旦图片到达视口范围,从图片的自定义属性中获取真地址,然后赋值给src,让其加载。

首屏进度条的显示:往往对于首屏优化后的数据量并不满意的话,同时也不能进一步缩短首屏包的长度了,就可以使用进度条的方式,来提醒用户进行等待

二,异步请求优化

  • 使用正常的json数据格式进行交互
  • 部分常用的数据缓存
  • 数据埋点的统计

可以将一些用户的基本信息等常用的信息做一个缓存,这样可以保证ajax请求的减少。

webWorker: 为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。