性能优化

3/30/2022 render

# 1. 什么是防抖和节流有什么区别?如何实现?

查看答案
  • 防抖 —— 触发高频事件后 n 秒后函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间。
  • 节流 —— 高频事件触发,但在 n 秒内只会执行一次,所以节流会稀释函数的执行频率。

debounce的实现
throttle的实现

# 2. 优化方法有哪些?

查看答案

# 通络通信优化

  1. 使用CDN服务
    • 全局负载均衡,用户可以选择最佳接入点
    • 还有缓存系统,有命中率和回源率两个指标
  2. 请求消耗
    • 资源合并,限制请求次数(雪碧图)
    • 域名分片:多域名
  3. HTTP优化
    • 头部压缩:HTTP2
  4. DNS缓存
    • 原因:减少DNS查询,DNS查询完成之前浏览器不能从这个主机下载任何文件。
    • 将资源分布到恰当数量的主机名,平衡并行下载和DNS查询。
  5. 避免重定向:避免多余的中间访问
  6. Cookie
    • 减少Cookie的大小
    • 对组件使用无Cookie的域名:对静态组件的Cookie读取是一种浪费
  7. 不要出现404页面:无意义的404页面会影响用户体验并且会消耗服务器资源。

# 数据传输优化

  1. 使用缓存(强缓存和协商缓存)
  2. 数据压缩
    • 数据压缩:gzip
    • 代码文件压缩:html/js/css、webpack框架
    • 静态资源 + 字体图片换成字体图标 + 去除图片元数据exif + 缩小图片尺寸和分辨率 + 使用jpg和webP格式
  3. Flush Buffer Early(服务端先将数据放入缓冲区,再一次性返回浏览器,Flush会提前清空缓冲区流式输出)
  4. Ajax使用GET进行请求,AJAX可缓存

# js代码优化

  1. 慎用全局变量:查找时间长,内存空间占用率高,污染全局
  2. 缓存全局变量:无法避免要用全局变量时,可以提前缓存到变量中
  3. 通过原型新增方法:避免直接在Vue构造函数内部添加方法
  4. 避开闭包陷阱:防止使用不当造成的内存泄露
  5. 避免属性访问方法使用:在构造函数里面尽量不要额外添加访问某个属性的方法,在外部可以直接访问
  6. 声明变量的时候,如果可以直接用字面量,不要用new函数
  7. 多使用块级作用域,减少作用域查找
  8. 避免使用==,会有类型转换的额外开销
  9. 将脚本放到页面底部
  10. 将javascript和css从外部引入
  11. 合理设计事件监听器

# css优化

  1. 将样式表放到页面顶部
  2. 不使用CSS表达式
  3. 尽量不使用@import
  4. 不使用IE的Filter:它效率低下而且只对IE6及以下的版本适用

# 节点优化

  1. 节点操作要避免重绘和回流
  2. document.createdocumentfragment()方法创建了一虚拟的节点对象,可以合并DOM操作
  3. 相同的节点用cloneNode方法直接操作会比重新创建要性能好
  4. html要语义化,加强DOM解析
  5. 多使用伪元素,减少js多DOM的查找遍历
  6. 减少DOM元素数量
  7. 减少iframe数量
  8. 避免空src的img标签(空src的img标签依旧会发送HTTP请求)
  9. 不要在HTML中缩放图片,大图片要缩小使用,本身的KB大小不会改变
  10. 缩小favicon.ico的大小并缓存它,不大于1kB

# 框架语言优化

  1. 能用computed尽量不要用watch
  2. 可以使用keep-alive组件控制缓存组件的显示隐藏
  3. 非必须组件延迟加载
  4. 未来所需组件预加载

# 框架方案优化

  1. 服务端渲染方案可以解决首次白屏时间长,SEO不好的问题
  2. 静态网站可以使用静态站点生成方法:SSG、Gatsby、Gridsome
  3. 保证组件在25K以下,iPhone不能缓存25K以上的组件,并且这还是要在被压缩前
  4. 将组件打包进一个多部分的文档中,就好像在邮件中加入附件一样,一个HTTP请求就够了,但是这一技术需要确保你的代理支持,iPhone就不支持。
更新时间: 2022-05-13 10:02