前端性能优化

117 阅读4分钟

涉及的功能

  • 资源的合并与压缩
  • 图片编解码原理
  • 浏览器渲染机制

一、资源的合并与压缩

  • 减少http请求
  • 减少请求资源的大小
1. 谷歌案例学习
  • html压缩
    • 压缩空格、回车、制表符之类的,一般用不上。
  • css压缩
    • 无效代码删除
    • css语义合并
    • 在线网站或者其他工具
  • js的压缩与混乱
    • 删除回车等,剔除注释
    • 代码语义缩短,变量名缩短,无用代码删除(代码保护)
  • 文件合并
  • 开启gzip
2. 图片相关的优化
  • png8/png24/png32的区别
    • png8:2^8(256)色+支持透明
    • png24:2^24色+不支持透明
    • png32 2^32色+支持透明
  • 不同格式图片常见的业务场景
    • jpg有损压缩,压缩率高,不支持透明
    • png支持透明,浏览器兼容性好
    • webp压缩率程度更好,在ios webview上有兼容性问题
    • svg矢量图,代码内嵌,相对较小,图片样式相对简单的场景
  • 进行图片压缩
    • 针对真是图片情况,舍弃掉一些相对无关紧要的色彩信息
  • css雪碧图
    • 图片整合到一个图片中,减少http请求(用的少)

二、一个网站在浏览器是如何渲染的?

html渲染过程中的一些特点
  • 顺序执行,并发加载
    • 语法分析
    • 并发加载
    • 并发上限
  • 是否阻塞
    • css head中阻塞页面的渲染
    • css 阻塞js的执行
    • css 不阻塞外部脚本的加载
  • 依赖关系
  • 引入方式

三、懒加载和预加载

  • 懒加载
    • 图片进入可视区域之后请求图片资源
    • 需要监听scroll事件,在scroll事件回调中,去判断懒加载图片是否进入到可视区域中。
    • 对于电商等图片很多,业务很长的场景适用
    • 减少无效资源的加载
    • 并发加载资源过多会阻塞js的加载,影响网站的正常使用。
  • 预加载
    • 图片等静态资源在使用之前提前请求
    • 资源使用时能从缓存中加载,提升用户体验
    • 页面展示的依赖关系维护

四、重绘和回流

  • 重绘
    • 当render tree中的一些元素需要更新属性,而这些元素的属性只是会影响元素的外观、风格,而不影响布局的,比如background-color,则就叫做重绘。
  • 回流
    • 当render tree中的一部分(或者全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(reflow)。
    • 当页面布局和几何属性改变时就需要回流。
触发页面重布局的属性
  • 盒子模型相关属性会触发重布局
  • 定位属性及浮动会触发重布局
  • 改变节点内部文字结构也会触发重布局
    • width、heigth、top、bottom、left、rigth
    • padding、margin、text-align、overflow-y
    • overflow、font-weiweight
    • dispaly、position、font-family
    • border-width、float、line-height
    • border、clear、vertail-align
    • min-height、white-space、font-size
根据这些特效对页面进行优化
  • 用translate代替top改变
  • 用opacity代替visibility
  • 不要一条一条的修改DOM的样式,预先定义好class、然后修改DOM的className
  • 把DOM离线后修改,比如先把DOM给display:none(有一次reflow),然后你修改100次,再给它显示出来。
  • 不要把DOM节点的属性值放在一个循环里当做这个循环的变量
  • 不要使用table布局,可能一个很小的改动会造成整个table的重新布局
  • 动画实现的速度的选择
  • 对于动画新建图层
  • 启用CPU硬件加速

五、浏览器储存:localstorage、sessionstorage、cookie、indexdb的概念和使用

  • cookie
    • 因为http请求无状态,所以需要cookie去维护浏览器状态
    • 过期时间expire
    • cookie的生成方式
      1. http response header中的 set-cookie
      2. js中可以通过document.cookie可以读写cookie
    • 仅仅作为浏览器储存(大小4kb,能力被localstorage代替)
    • cookie在相关域名下面-cdn流量损耗
    • httponly
  • localstorage
    • HTML5专门设计出来用于浏览器储存的
    • 大小为5M左右
    • 仅在客户端使用,不参与服务端通信
    • 接口封装较好
    • 浏览器本地储存方案
    • 需要主动去清除
  • sessionStorage
    • 同localStorage
    • 窗口关闭时就自动清空
  • indexdb(用的少)
    • indexdb是一种低级API,用于客户端储存大量机构化数据。该API使用检索来实现对该数据的高性能搜索。
    • 虽然webStorage对于储存少量的数据很有用,但对于储存更大量的机构化数据来说,这种方法不太有用。indexDB提供了一种解决方案。
    • 为应用创建离线版本

六、缓存

七、服务端优化

  • 构件层模板编译
  • 数据无关的prerender的方式
  • 服务端渲染

其他......