• Stars
    star
    828
  • Rank 54,811 (Top 2 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created about 7 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🍱 axios extensions lib, including throttle, cache, retry features etc...

axios-extensions

npm version coverage npm downloads Build Status

A non-invasive, simple, reliable collection of axios extension

Extension List

v3.x has a lot of api changes, if you are looking for v2.x doc, see here

Not working with axios v0.19.0 as its custom config bug, See axios/axios#2207.

Installing

npm i axios-extensions -S

or

yarn add axios-extensions

or

// exposed as window['axios-extensions']
<script src="https://unpkg.com/axios-extensions/dist/axios-extensions.min.js"></script>

Usage

import axios from 'axios';
import { cacheAdapterEnhancer, throttleAdapterEnhancer } from 'axios-extensions';

// enhance the original axios adapter with throttle and cache enhancer 
const http = axios.create({
	baseURL: '/',
	headers: { 'Cache-Control': 'no-cache' },
	adapter: throttleAdapterEnhancer(cacheAdapterEnhancer(axios.defaults.adapter))
});

Enable Logging

It is highly recommended to enable the request logging recorder in development environment(disabled by default).

browser (webpack)

new webpack.DefinePlugin({
  'process.env.LOGGER_LEVEL': JSON.stringify('info')
})

node

// package.json
"scripts": {
	"start": "cross-env LOGGER_LEVEL=info node server.js"
}

API

cacheAdapterEnhancer

Makes axios cacheable

cacheAdapterEnhancer(adapter: AxiosAdapter, options: Options): AxiosAdapter

Where adapter is an axios adapter which following the axios adapter standard, options is an optional that configuring caching:

Param Type Default value Description
enabledByDefault boolean true Enables cache for all requests without explicit definition in request config (e.g. cache: true)
cacheFlag string 'cache' Configures key (flag) for explicit definition of cache usage in axios request
defaultCache CacheLike
new LRUCache({ maxAge: FIVE_MINUTES, max: 100 })
a CacheLike instance that will be used for storing requests by default, except you define a custom Cache with your request config

cacheAdapterEnhancer enhances the given adapter and returns a new cacheable adapter back, so you can compose it with any other enhancers, e.g. throttleAdapterEnhancer.

basic usage

import axios from 'axios';
import { cacheAdapterEnhancer } from 'axios-extensions';

const http = axios.create({
	baseURL: '/',
	headers: { 'Cache-Control': 'no-cache' },
	// cache will be enabled by default
	adapter: cacheAdapterEnhancer(axios.defaults.adapter)
});

http.get('/users'); // make real http request
http.get('/users'); // use the response from the cache of previous request, without real http request made
http.get('/users', { cache: false }); // disable cache manually and the the real http request invoked

custom cache flag

const http = axios.create({
	baseURL: '/',
	headers: { 'Cache-Control': 'no-cache' },
	// disable the default cache and set the cache flag
	adapter: cacheAdapterEnhancer(axios.defaults.adapter, { enabledByDefault: false, cacheFlag: 'useCache'})
});

http.get('/users'); // default cache was disabled and then the real http request invoked 
http.get('/users', { useCache: true }); // make the request cacheable(real http request made due to first request invoke)
http.get('/users', { useCache: true }); // use the response cache from previous request
custom cache typing

Note that if you are using custom cache flag and typescript, you may need to add the typing declaration like below:

import { ICacheLike } from 'axios-extensions';
declare module 'axios' {
  interface AxiosRequestConfig {
    // if your cacheFlag was setting to 'useCache'
    useCache?: boolean | ICacheLike<any>;
  }
}

more advanced

Besides configuring the request through the cacheAdapterEnhancer, we can enjoy more advanced features via configuring every individual request.

import axios from 'axios';
import { cacheAdapterEnhancer, Cache } from 'axios-extensions';

const http = axios.create({
	baseURL: '/',
	headers: { 'Cache-Control': 'no-cache' },
	// disable the default cache
	adapter: cacheAdapterEnhancer(axios.defaults.adapter, { enabledByDefault: false })
});

http.get('/users', { cache: true }); // make the request cacheable(real http request made due to first request invoke)

// define a cache manually
const cacheA = new Cache();
// or a cache-like instance
const cacheB = { get() {/*...*/}, set() {/*...*/}, del() {/*...*/} };

// two actual request will be made due to the different cache 
http.get('/users', { cache: cacheA });
http.get('/users', { cache: cacheB });

// a actual request made and cached due to force update configured
http.get('/users', { cache: cacheA, forceUpdate: true });

Note: If you are using typescript, do not forget to enable "esModuleInterop": true and "allowSyntheticDefaultImports": true for better development experience.

throttleAdapterEnhancer

Throttle GET requests most once per threshold milliseconds

throttleAdapterEnhancer(adapter: AxiosAdapter, options: Options): AxiosAdapter

Where adapter is an axios adapter which following the axios adapter standard, options is an optional object that configuring throttling:

Param Type Default value Description
threshold number 1000 The number of milliseconds to throttle request invocations to
cache CacheLike
new LRUCache({ max: 10 })
CacheLike instance that will be used for storing throttled requests

Basically we recommend using the throttleAdapterEnhancer with cacheAdapterEnhancer together for the maximum caching benefits. Note that POST and other methods besides GET are not affected.

throttleAdapterEnhancer(cacheAdapterEnhancer(axios.defaults.adapter))

Check David Corbacho's article to learn more details about throttle and how it differs from debounce.

basic usage

import axios from 'axios';
import { throttleAdapterEnhancer } from 'axios-extensions';

const http = axios.create({
	baseURL: '/',
	headers: { 'Cache-Control': 'no-cache' },
	adapter: throttleAdapterEnhancer(axios.defaults.adapter, { threshold: 2 * 1000 })
});

http.get('/users'); // make real http request
http.get('/users'); // responsed from the cache
http.get('/users'); // responsed from the cache

setTimeout(() => {
	http.get('/users'); // after 2s, the real request makes again
}, 2 * 1000);

retryAdapterEnhancer

Retry the failed request with special times

retryAdapterEnhancer(adapter: AxiosAdapter, options: Options): AxiosAdapter

Where adapter is an axios adapter which following the axios adapter standard, options is an optional that configuring caching:

Param Type Default value Description
times number 2 Set the retry times for failed request globally.

basic usage

import axios from 'axios';
import { retryAdapterEnhancer } from 'axios-extensions';

const http = axios.create({
	baseURL: '/',
	headers: { 'Cache-Control': 'no-cache' },
	adapter: retryAdapterEnhancer(axios.defaults.adapter)
});

// this request will retry two times if it failed
http.get('/users');

// you could also set the retry times for a special request
http.get('/special', { retryTimes: 3 });

More Repositories

1

kuitos.github.io

📝Kuitos's Blog https://github.com/kuitos/kuitos.github.io/issues
JavaScript
1,126
star
2

import-html-entry

import html and take over the exports from the scripts
HTML
762
star
3

angular-utils

useful angular utils
JavaScript
61
star
4

spring-mvc4-seed

基于springMVC4构建的seed项目,提供统一的rest接口响应、异常处理、参数校验等
Java
28
star
5

json-mock-server

json server base on nodejs and rest api,extension of https://github.com/therebelbeta/json-mock & https://github.com/typicode/json-server
HTML
28
star
6

angular-es-utils

esnext utils for angular1.x which could help you to abandon angular,such as inject decorator
JavaScript
24
star
7

es6-http-utils

provide some common http utils,such as request,cache and so on,written by pure ES6(this repo is no longer maintained, u can use https://github.com/mzabriskie/axios instead)
JavaScript
12
star
8

script-loader

脚本加载器,包括同步、异步、延时等方式,支持promise
JavaScript
12
star
9

angular-best-practice-modules

angular代码最佳实践,提供一些基础模板,包括 service http-handler directive 等
JavaScript
11
star
10

graphql-server-startkit

🚀 graphql server startkit based on apollographql
JavaScript
10
star
11

takahashi-slides

takahashi slides 高桥流幻灯片
JavaScript
10
star
12

angular-seed

angular base introduction
JavaScript
7
star
13

timer-runner

⏲🧝‍♂️a simple, YAML-based configurable timer runner
TypeScript
5
star
14

angular-es6-seed

JavaScript
3
star
15

web-development-enlightenment

web development enlightenment,anyone can improve it
3
star
16

github-actions-test

1
star
17

funds-dm

TypeScript
1
star
18

benchmark-suites

benchmark suites
1
star
19

esnext-utils

js utils written by esnext
TypeScript
1
star