浏览器缓存、渲染原理

2019-12-24  本文已影响0人  行走的蛋白质

特性 cookie localStorage sessionStorage indexDB
数据生命周期 一般由服务器生成,可以设置过期时间 除非被清理,否则一直存在 页面关闭就清理 除非被清理,否则一直存在
数据存储大小 4K 5M 5M 无限
与服务端通信 每次都会携带在 header 中,对于请求性能影响 不参与 不参与 不参与

IndexedDB是为了能够在客户端存储大量的结构化数据,并且使用索引高效检索的API。

实现步骤:

  1. 注册 Service Worker
  2. 监听 install 事件后缓存需要的文件
  3. 下次用户访问的时候通过拦截请求的方式查询是否存在缓存,如果存在直接读取缓存文件,否则去请求数据
// 代码实现如下:
// index.js
if(navigator.serviceWorker) {
    navigator.serviceWorker
        .register('sw.js')
        .then(function(registration) {
            console.log('Service Worker 注册成功')
        })
        .catch(function(error) {
            console.log('Service Worker 注册失败')
        })
}
// sw.js 监听 install 事件,回调中缓存所需文件
self.addEventListener('install', e => {
    e.WaitUtil(
        caches.open('my-cache').then(function(cache) {
            return cache.addAll(['./index.html', './index.js'])
        })
    )
})
// 拦截所有请求事件,如果缓存中有请求的数据直接使用,否则去请求数据
self.addEventListener('fetch', e => {
    e.responseWith(
        caches.match(e.request).then(function(response) {
            if(response) {
                return response
            }
            console.log('fetch source')
        })
    )
})

浏览器缓存
  1. Service Worker
  2. Memory Cache
    内存中的缓存,读取高效、持续时效短,会随着进程释放而释放
  3. Disk Cache
    硬盘中的缓存,对比 Memory Cache 读取速度慢但是容量大存储时效长
  4. Push Cache
    HTTP/2 中的内容,时效短只在会话 Session 中存在,一旦会话结束就会被释放
  5. 网络请求

一般来说现在都会运用工具进行打包,我们可以对文件进行 hash 处理,只有当代吗修改后才会生成新的文件名,文件名改变才会去下载最新的代码文件,否则一直使用缓存。



浏览器渲染原理
  1. 接收 html 文件并解析成 dom 树
  2. 接受 css 文件并解析成 cssom 树
  3. 将 dom 和 cssom 合并生成 Render Tree
  4. Layout 环节,浏览器出计算各个节点的位置
  5. Painting 到屏幕上
减少重绘和回流
  1. 使用 transform 代替定位改变 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>
  1. 使用 visibility 代替 display:none 因为前者只会引发重绘,而后者因为改变了布局而引发回流
  2. 不要把节点的属性放在一个循环里,当成循环的变量
for(let i = 0; i < 1000; i++) {
    // 获取 offsetTop 会导致回流,因为需要去获取正确的值
    console.log(document.querySelector('.test').style.offsetTop)
}
  1. 动画实现速度的选择,动画速度越快回流次数越多,可以选择使用 requestAnimationFrame
  2. css 选择符从左往右查找避免层级过多
  3. 将频繁重绘或者回流的节点设置为图层,图层能够阻止该节点的渲染行为影响别的节点。比如对于 video 标签来说,浏览器会自动将该节点变为图层。
    我们可以通过 will-change 属性 video、iframe 标签生成新图层
上一篇 下一篇

猜你喜欢

热点阅读