跳转到内容

缓存 & SWR

如果设置了 options.cacheKeyuseRequest 会将当前请求成功的数据缓存起来。下次组件初始化时,如果有缓存数据,我们会优先返回缓存数据,然后在背后发送新请求,也就是 SWR 的能力。

你可以通过 options.staleTime 设置数据保持新鲜时间,在该时间内,我们认为数据是新鲜的,不会重新发起请求。

你也可以通过 options.cacheTime 设置数据缓存时间,超过该时间,我们会清空该条缓存数据。

接下来通过几个例子来体验缓存这些功能。

SWR

数据保持新鲜

通过设置 options.staleTime ,我们可以指定数据新鲜时间,在这个时间内,不会重新发起请求。下面的示例设置了 5s 的新鲜时间,你可以通过点击按钮来体验效果

数据共享

同一个 cacheKey 的内容,在全局是共享的,这会带来以下几个特性:

  • 请求 Promise 共享:相同的 cacheKey 同时只会有一个在发起请求,后发起的会共用同一个请求 Promise
  • 数据同步:当某个 cacheKey 发起请求时,其它相同 cacheKey 的内容均会随之同步

下面的示例中,初始化时,两个组件只会发起一个请求。并且数据 A 和数据 B 的的内容永远是同步的。

自定义缓存

通过配置 setCachegetCache,可以自定义数据缓存,比如可以将数据存储到 localStoragesessionStorage 等。

  • setCachegetCache 需要配套使用。
  • 在自定义缓存模式下,cacheTimeclearCachegetCacheAll 不会生效,请自行实现。

获取全部缓存

通过全局的getCacheAll方法可以获取全部的缓存数据。

typescript
import { getCacheAll } from 'norm-axios'

// 获取全部缓存
getCacheAll()

清除缓存

通过全局的clearCache方法,可以清除cacheKey指定缓存数据或者所有缓存数据。

typescript
import { clearCache } from 'norm-axios'

// 请求一个缓存
clearCache('cacheKey')
// 清楚多个缓存
clearCache([ 'cacheKey1', 'cacheKey2' ])
// 清除所有缓存
clearCache()

API

属性类型默认值描述
cacheKeystring-
  • 请求唯一标识。
  • 如果设置了 cacheKey,我们会启用缓存机制。
  • 同一个 cacheKey 的数据全局同步
cacheTimenumber600000
  • 缓存过期时间(毫秒),超过该时间会自动清除该缓存数据。
  • 设置 Infinity 表示永不过期
staleTimenumber-
  • 设置数据保持新鲜时间,在该时间内,我们认为数据是新鲜的,不会重新发起请求。
  • 设置 Infinity 表示永不过期
setCachesetCache?: (cacheKey: string, cacheData: CachedData<TData, TParams, TFormatData, TRawData>) => void-
  • 自定义设置缓存。
  • setCachegetCache 需要配套使用。
    - 在自定义缓存模式下,cacheTimeclearCache 不会生效,请根据实际情况自行实现。
getCachegetCache?: (cacheKey: string, params: TParams) => CachedData<TData, TParams, TFormatData, TRawData>-自定义获取缓存数据