Open MJingv opened 5 years ago
从缓存位置上来说分为四种,并且各自有优先级,当依次查找缓存且都没有命中的时候,才会去请求网络
通常浏览器缓存策略分为两种:强缓存和协商缓存,并且缓存策略都是通过设置 HTTP Header 来实现的。
强缓存可以通过设置两种 HTTP Header 实现:Expires 和 Cache-Control
强缓存表示在缓存期间不需要请求,state code 为 200
Expires
Cache-Control
指令 | 作用 |
---|---|
public | 表示响应可以被客户端&&服务器端缓存 |
private | 只能被客户端缓存 |
max-age=30 | 缓存30s后过期,需要重新请求 |
s-maxage=30 | 覆盖max-age,作用同上,只在【代理服务器】生效 |
no-store | 不存 |
no-cache | 缓存并立即失效,下次验证是否过期 |
max-stale=30 | 30s内即使失效也用 |
min-fresh=30 | 希望在30s内获取最新的响应 |
Last-Modified 和 If-Modified-Since
ETag 和 If-None-Match
没有设置缓存策略:浏览器会采用一个启发式的算法,通常会取响应头中的 Date 减去 Last-Modified 值的 10% 作为缓存时间
1.频繁变动的资源
2.代码文件
字节数据(0/1)=> 字符串(代码) => token(词法分析) => node => cssom
尽可能的避免写过于具体的 CSS 选择器(少嵌套)
尽量少的添加无意义标签,保证层级扁平
当浏览器生成渲染树以后,就会根据渲染树来进行布局(也可以叫做回流),然后调用 GPU 绘制,合成图层,显示在屏幕上
当我们通过 JS 操作 DOM 的时候,其实这个操作涉及到了两个线程之间的通信,那么势必会带来一些性能上的损耗。操作 DOM 次数一多,也就等同于一直在进行线程之间的通信,并且操作 DOM 可能还会带来重绘回流的情况,所以也就导致了性能上的问题。
重绘和回流其实也和 Eventloop
减少重绘和回流
- 新生代中的对象是否已经经历过一次 Scavenge 算法,如果经历过的话,会将对象从新生代空间移到老生代空间中。
- To 空间的对象占比大小超过 25 %。在这种情况下,为了不影响到内存分配,会将对象从新生代空间移到老生代空间中
- 增量标记: 小模块标记,在代码执行间隙执,GC 会影响性能
- 并发标记(最新技术): 不阻塞 js 执行
可用 chrome 中的 timeline 进行内存标记,可视化查看内存的变化情况,找出异常点。
from 浅谈前端路由
https://segmentfault.com/a/1190000011956628#articleHeader2
#
。后面 hash 值的变化,并不会导致浏览器向服务器发出请求,浏览器不发出请求,也就不会刷新页面。hashchange
这个事件,通过这个事件我们就可以知道 hash 值发生了哪些变化
pushState
和 replaceState
,通过这两个 API 可以改变 url 地址且不会发送请求
pushState会增加一条新的历史记录,而replaceState则会替换当前的历史记录
#
,变得更加美观。#
号,所以当用户刷新页面之类的操作时,浏览器还是会给服务器发送请求。为了避免出现这种情况,所以这个实现需要服务器的支持,需要把所有路由都重定向到根页面
浏览器存储
cookie
Service Worker