实现强缓存能够经过两种响应头实现:Expires
和 Cache-Control
。强缓存表示在缓存期间不须要请求,state code
为 200html
Expires: Wed, 22 Oct 2018 08:41:00 GMT
Expires
是 HTTP / 1.0 的产物,表示资源会在 Wed, 22 Oct 2018 08:41:00 GMT
后过时,须要再次请求。而且 Expires
受限于本地时间,若是修改了本地时间,可能会形成缓存失效。算法
Cache-control: max-age=30
Cache-Control
出现于 HTTP / 1.1,优先级高于 Expires
。该属性表示资源会在 30 秒后过时,须要再次请求。浏览器
若是缓存过时了,咱们就可使用协商缓存来解决问题。协商缓存须要请求,若是缓存有效会返回 304。缓存
协商缓存须要客户端和服务端共同实现,和强缓存同样,也有两种实现方式。性能优化
Last-Modified
表示本地文件最后修改日期,If-Modified-Since
会将 Last-Modified
的值发送给服务器,询问服务器在该日期后资源是否有更新,有更新的话就会将新的资源发送回来。服务器
可是若是在本地打开缓存文件,就会形成 Last-Modified
被修改,因此在 HTTP / 1.1 出现了 ETag
。网络
ETag
相似于文件指纹,If-None-Match
会将当前 ETag
发送给服务器,询问该资源 ETag
是否变更,有变更的话就将新的资源发送回来。而且 ETag
优先级比 Last-Modified
高。frontend
wepackide
gzip工具
To Learn
通常来讲,能够把普通文档流当作一个图层。特定的属性能够生成一个新的图层。不一样的图层渲染互不影响,因此对于某些频繁须要渲染的建议单独生成一个新图层,提升性能。但也不能生成过多的图层,会引发副作用。
经过如下几个经常使用属性能够生成新图层
translate3d
、translateZ
will-change
video
、iframe
标签opacity
动画转换position: fixed
懒加载就是将不关键的资源延后加载。
懒加载的原理就是只加载自定义区域(一般是可视区域,但也能够是即将进入可视区域)内须要加载的东西。对于图片来讲,先设置图片标签的 src
属性为一张占位图,将真实的图片资源放入一个自定义属性中,当进入自定义区域时,就将自定义属性替换为 src
属性,这样图片就会去下载资源,实现了图片懒加载。
使用 translate
替代 top
<div class="test"></div> <style> .test { position: absolute; top: 10px; width: 100px; height: 100px; background: red; } </style> <script> setTimeout(() => { // 引发回流 document.querySelector('.test').style.top = '100px' }, 1000) </script>
使用 visibility
替换 display: none
,由于前者只会引发重绘,后者会引起回流(改变了布局)
把 DOM 离线后修改,好比:先把 DOM 给 display:none
(有一次 Reflow),而后你修改100次,而后再把它显示出来
不要把 DOM 结点的属性值放在一个循环里当成循环里的变量
for(let i = 0; i < 1000; i++) { // 获取 offsetTop 会致使回流,由于须要去获取正确的值 console.log(document.querySelector('.test').style.offsetTop) }
不要使用 table 布局,可能很小的一个小改动会形成整个 table 的从新布局
动画实现的速度的选择,动画速度越快,回流次数越多,也能够选择使用 requestAnimationFrame
CSS 选择符从右往左匹配查找,避免 DOM 深度过深
将频繁运行的动画变为图层,图层可以阻止该节点回流影响别的元素。好比对于 video
标签,浏览器会自动将该节点变为图层。