用于 axios 的缓存适配器。将请求结果存储在可配置的存储中,以防止不必要的网络请求。
Caching adapter for axios. Store request results in a configurable store to prevent unneeded network requests.
Adapted from superapi-cache by @stephanebachelier
Using npm
npm install --save axios-cache-adapterOr bower
bower install --save axios-cache-adapterOr from a CDN like unpkg.com
Important note: Only GET request results are cached by default. Executing a request using any method listed in exclude.methods will invalidate the cache for the given URL.
You can instantiate the axios-cache-adapter on its own using the setupCache() method and then attach the adapter manually to an instance of axios.
…You can use the setup() method to get an instance of axios pre-configured with the axios-cache-adapter. This will remove axios as a direct dependency in your code.
…After setting up axios-cache-adapter with a specific cache configuration you can override parts of that configuration on individual requests.
import { setup } from 'axios-cache-adapter'
const api = setup({
baseURL: 'https://httpbin.org',
cache: {
maxAge: 15 * 60 * 1000
}
})
// Use global instance config
api.get('/get').then((response) => {
// Do something awesome with response
})
// Override `maxAge` and cache URLs with query parameters
api.get('/get?with=query', {
cache: {
maxAge: 2 * 60 * 1000, // 2 min instead of 15 min
exclude: { query: false }
}
})
.then((response) => {
// Do something beautiful ;)
})Note: Not all instance options can be overridden per request, see the API documentation at the end of this readme
You can allow axios-cache-adapter to cache the results of a request using (almost) any HTTP method by modifying the exclude.methods list.
import { setup } from 'axios-cache-adapter
const api = setup({
baseURL: 'https://httpbin.org',
cache: {
exclude: {
// Only exclude PUT, PATCH and DELETE methods from cache
methods: ['put', 'patch', 'delete']
}
}
})
api.post('/post').then((response) => {
// POST request has been cached \o/
})Note: the request method is not used in the cache store key by default, therefore with the above setup, making a GET or POST request will respond with the same cache.
You can give a localforage instance to axios-cache-adapter which will be used to store cache data instead of the default in memory store.
Note: This only works client-side because localforage does not work in Node.js
…You can give a RedisStore instance to axios-cache-adapter which will be used to store cache data instead of the default in memory store.
Note: This only works server-side
const { setup, RedisStore } = require('axios-cache-adapter')
const redis = require('redis')
const client = redis.createClient({
url: 'REDIS_URL',
})
const store = new RedisStore(client)
const api = setup({
// `axios` options
baseURL: 'http://some-rest.api',
// `axios-cache-adapter` options
cache: {
maxAge: 15 * 60 * 1000,
store // Pass `RedisStore` store to `axios-cache-adapter`
}
})
const response = await api.get('/url')You can give a RedisDefaultStore instance to axios-cache-adapter which will be used to store cache data in Redis using the default commands instead of hash commands.
Note: This only works server-side
const { setup, RedisDefaultStore } = require('axios-cache-adapter')
const redis = require('redis')
const client = redis.createClient({
url: 'REDIS_URL',
})
const store = new RedisDefaultStore(client, {
prefix: 'namespace_as_prefix' // optional
})
const api = setup({
// `axios` options
baseURL: 'http://some-rest.api',
// `axios-cache-adapter` options
cache: {
maxAge: 15 * 60 * 1000,
store // Pass `RedisDefaultStore` store to `axios-cache-adapter`
}
})
const response = await api.get('/url')When a response is served from cache a custom response.request object is created with a fromCache boolean.
…You can tell axios-cache-adapter to read stale cache data when a network error occurs using the readOnError option.
readOnError can either be a Boolean telling cache adapter to attempt reading stale cache when any network error happens or a Function which receives the error and request objects and then returns a Boolean.
By default axios-cache-adapter clears stale cache data automatically, this would conflict with activating the readOnError option, so the clearOnStale option should be set to false.
…Note: Passing a function to readOnError is a smarter thing to do as you get to choose when a stale cache read should be attempted instead of doing it on all kind of errors
Using the default invalidation method, a cache entry will be invalidated if a request is made using one of the methods listed in exclude.methods.
async function defaultInvalidate (config, request) {
const method = request.method.toLowerCase()
if (config.exclude.methods.includes(method)) {
await config.store.removeItem(config.uuid)
}
}You can customize how axios-cache-adapter invalidates stored cache entries by providing a custom invalidate function.
…maxAgeWhen you set the readHeaders option to true, the adapter will try to read cache-control or expires headers to automatically set the maxAge option for the given request.
…Note: For the cache-control header, only the max-age, no-cache and no-store values are interpreted.
Create a cache adapter instance. Takes an options object to configure how the cached requests will be handled,
where they will be stored, etc.
…setupCache() returns an object containing the configured adapter, the cache store and the config that is applied to this instance.
Create an axios instance pre-configured with the cache adapter. Takes an options object to configure the cache and
axios at the same time.
{
cache: {
// Options passed to the `setupCache()` method
}
// Options passed to `axios.create()` method
}All the other parameters will be passed directly to the axios.create method.
setup() returns an instance of axios pre-configured with the cache adapter.
The cache store is conveniently attached to the axios instance as instance.cache for easy access.
RedisStore allow you to cache requests on server using redis.
Create a RedisStore instance. Takes client (RedisClient) and optional hashKey (name of hashSet to be used in redis).
// Using redis client https://github.com/NodeRedis/node_redis
// We have tested it with node_redis v.2.8.0 but it's supposed to work smoothly with the comming releases.
const redis = require("redis")
const client = redis.createClient()new RedisStore() returns an instance of RedisStore to be passed to setupCache() as store in config object.
Using the same object definition as the setup method you can override cache options for individual requests.
api.get('https://httpbin.org/get', {
cache: {
// Options override
}
})All options except limit and store can be overridden per request.
Also the following keys are used internally and therefore should not be set in the options: adapter, uuid, acceptStale.
npm run buildWebpack is used to build umd versions of the library that are placed in the dist folder.
cache.jscache.min.jscache.node.jscache.node.min.jsA different version of axios-cache-adapter is generated for node and the browser due to how Webpack 4 uses a target to change how the UMD wrapper is generated using global or window. If you are using the library in node or in your front-end code while using a module bundler (Webpack, rollup, etc) the correct version will be picked up automatically thanks to the "main" and "browser" fields in the package.json.
axios-cache-adapter is developped in ES6+ and uses async/await syntax. It is transpiled to ES5 using babel with preset-env.
Tests are executed using karma.
To launch a single run tests using ChromeHeadless:
npm testTo launch tests in watch mode in Chrome for easier debugging with devtools:
npm run watchaxios-cache-adapter was designed to run in the browser. It does work in nodejs using the in memory store. But storing data in memory is not the greatests idea ever.
You can give a store to override the in memory store but it has to comply with the localForage API and localForage does not work in nodejs for very good reasons that are better explained in this issue.
The better choice if you want to use axios-cache-adapter server-side is to use a redis server with a RedisStore instance as explained above in the API section.
MIT © Carl Ogren
暂无开放 Issues,或尚未同步最近议题。