包含JS、CSS、React、浏览器等 前端经典面试题( 五 )


(2). 从设计实现层面简化页面
如果你的页面像百度首页一样简单,那么接下来的规则基本上都用不着了 。保持页面简洁、减少资源的使用时最直接的 。如果不是这样,你的页面需要华丽的皮肤,则继续阅读下面的内容 。
(3). 合理设置HTTP缓存
缓存的力量是强大的,恰当的缓存设置可以大大的减少HTTP请求 。以有啊首页为例,当浏览器没有缓存的时候访问一共会发出78个请求,共600多K 数据(如图1.1),而当第二次访问即浏览器已缓存之后访问则仅有10个请求,共20多K数据(如图1.2) 。(这里需要说明的是,如果直接F5刷新页面 的话效果是不一样的,这种情况下请求数还是一样,不过被缓存资源的请求服务器是304响应,只有Header没有Body,可以节省带宽)
怎样才算合理设置?原则很简单,能缓存越多越好,能缓存越久越好 。例如,很少变化的图片资源可以直接通过HTTP Header中的Expires设置一个很长的过期头;变化不频繁而又可能会变的资源可以使用Last-Modifed来做请求验证 。尽可能的让资源能够 在缓存中待得更久 。
(4). 资源合并与压缩
如果可以的话,尽可能的将外部的脚本、样式进行合并,多个合为一个 。另外,css、Javascript、Image都可以用相应的工具进行压缩,压缩后往往能省下不少空间 。
(5). CSS Sprites
合并CSS图片,减少请求数的又一个好办法 。
(6). Inline Images
使用data: URL scheme的方式将图片嵌入到页面或CSS中,如果不考虑资源管理上的问题的话,不失为一个好办法 。如果是嵌入页面的话换来的是增大了页面的体积,而且无法利用浏览器缓存 。使用在CSS中的图片则更为理想一些 。
(7). Lazy Load Images
这条策略实际上并不一定能减少HTTP请求数,但是却能在某些条件下或者页面刚加载时减少HTTP请求数 。对于图片而言,在页面刚加载的时候可以只 加载第一屏,当用户继续往后滚屏的时候才加载后续的图片 。这样一来,假如用户只对第一屏的内容感兴趣时,那剩余的图片请求就都节省了 。有啊首页曾经的做法 是在加载的时候把第一屏之后的图片地址缓存在Textarea标签中,待用户往下滚屏的时候才“惰性”加载 。
11、你了解的浏览器的重绘和回流导致的性能问题参考答案重绘(Repaint)和回流(Reflow)
重绘和回流是渲染步骤中的一小节,但是这两个步骤对于性能影响很大 。

  • 重绘是当节点需要更改外观而不会影响布局的,比如改变 color就叫称为重绘
  • 回流是布局或者几何属性需要改变就称为回流 。
回流必定会发生重绘,重绘不一定会引发回流 。回流所需的成本比重绘高的多,改变深层次的节点很可能导致父节点的一系列回流 。
所以以下几个动作可能会导致性能问题:
  • 改变 window 大小
  • 改变字体
  • 添加或删除样式
  • 文字改变
  • 定位或者浮动
  • 盒模型
很多人不知道的是,重绘和回流其实和 Event loop 有关 。
  1. 当 Event loop 执行完 Microtasks 后,会判断 document 是否需要更新 。因为浏览器是 60Hz 的刷新率,每 16ms 才会更新一次 。
  2. 然后判断是否有 resize或者 scroll,有的话会去触发事件,所以 resize和 scroll事件也是至少 16ms 才会触发一次,并且自带节流功能 。
  3. 判断是否触发了 media query
  4. 更新动画并且发送事件
  5. 判断是否有全屏操作事件
  6. 执行 requestAnimationFrame回调
  7. 执行 IntersectionObserver回调,该方法用于判断元素是否可见,可以用于懒加载上,但是兼容性不好
  8. 更新界面
  9. 以上就是一帧中可能会做的事情 。如果在一帧中有空闲时间,就会去执行 requestIdleCallback回调 。
减少重绘和回流