MJingv / jehol-person-blog

Jehol's Blog 🙋 (hexo+react)
https://mjingv.github.io/JeholBlog/
0 stars 1 forks source link

浏览器(必看) #20

Open MJingv opened 5 years ago

MJingv commented 5 years ago

浏览器存储

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

cookie

属性 作用
value 如果用于保存用户登录态,应该将该值加密,不能使用明文的用户标识
http-only 不能通过 JS 访问 Cookie,减少 XSS 攻击
secure 只能在协议为 HTTPS 的请求中携带
same-site 规定浏览器不能在跨域请求中携带 Cookie,减少 CSRF 攻击

Service Worker

  1. Service Worker 是运行在浏览器背后的独立线程,一般可以用来实现缓存功能
  2. 使用 Service Worker的话,传输协议必须为HTTPS
  3. 实现步骤:
    • 先注册 Service Worker
    • 监听install设置缓存
    • 通过拦截请求的方式查询是否存在缓存
MJingv commented 5 years ago

浏览器缓存机制

1.缓存位置

从缓存位置上来说分为四种,并且各自有优先级,当依次查找缓存且都没有命中的时候,才会去请求网络

  1. Service Worker
  2. Memory Cache
  3. Disk Cache
  4. Push Cache
  5. 网络请求

Service Worker

Memory Cache

Disk Cache

Push Cache

网络请求

2.缓存策略

通常浏览器缓存策略分为两种:强缓存和协商缓存,并且缓存策略都是通过设置 HTTP Header 来实现的。

1.强缓存

  1. Expires

    • Expires 受限于本地时间,如果修改了本地时间,可能会造成缓存失效
  2. Cache-Control

    • 出现于 HTTP/1.1,优先级高于 Expires
    • 可以在请求头或者响应头中设置,并且可以组合使用多种指令
    指令 作用
    public 表示响应可以被客户端&&服务器端缓存
    private 只能被客户端缓存
    max-age=30 缓存30s后过期,需要重新请求
    s-maxage=30 覆盖max-age,作用同上,只在【代理服务器】生效
    no-store 不存
    no-cache 缓存并立即失效,下次验证是否过期
    max-stale=30 30s内即使失效也用
    min-fresh=30 希望在30s内获取最新的响应

2.协商缓存

  1. Last-Modified 和 If-Modified-Since

    • Last-Modified 表示本地文件最后修改日期
    • If-Modified-Since 会将 Last-Modified 的值发送给服务器,
    • Last-Modified 缺点:1.仅打开也会变 2.单位s 改进方案etag
  2. ETag 和 If-None-Match

    • ETag 类似于文件指纹
    • If-None-Match 会将当前 ETag 发送给服务器,询问该资源 ETag 是否变动,有变动的话就将新的资源发送回来
    • ETag 优先级比 Last-Modified 高

没有设置缓存策略:浏览器会采用一个启发式的算法,通常会取响应头中的 Date 减去 Last-Modified 值的 10% 作为缓存时间

3.实际场景应用缓存策略

1.频繁变动的资源

2.代码文件

MJingv commented 5 years ago

浏览器渲染原理

1.浏览器接收html文件并转化为dom树

2.将css文件转换为cssom树

3.生成渲染树

当浏览器生成渲染树以后,就会根据渲染树来进行布局(也可以叫做回流),然后调用 GPU 绘制,合成图层,显示在屏幕上

为什么操作 DOM 慢

当我们通过 JS 操作 DOM 的时候,其实这个操作涉及到了两个线程之间的通信,那么势必会带来一些性能上的损耗。操作 DOM 次数一多,也就等同于一直在进行线程之间的通信,并且操作 DOM 可能还会带来重绘回流的情况,所以也就导致了性能上的问题。

插入几万个 DOM,如何实现页面不卡顿?

重绘(Repaint)和回流(Reflow)

  1. 使用 transform 替代 top
  2. requestAnimationFrame
  3. 使用 visibility 替换 display: none
  4. 新图层:will-change、video、iframe
MJingv commented 5 years ago

垃圾回收机制

新生代算法

老生代算法

MJingv commented 5 years ago

内存泄露

可用 chrome 中的 timeline 进行内存标记,可视化查看内存的变化情况,找出异常点。

MJingv commented 5 years ago

前端路由

from 浅谈前端路由

hash router (location.hash+hashchange事件)

https://segmentfault.com/a/1190000011956628#articleHeader2

h5 history (history.pushState()+popState事件)

MJingv commented 5 years ago

provisional headers are shown出现的情况有这么几种:

MJingv commented 3 years ago

https://www.xiabingbao.com/post/fe/hash-history-router.html

前端路由实现