-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
65 lines (61 loc) 路 2.38 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
var TIME_EXPIRATION = 1000 * 30;
var CACHE = {};
var toString = function (arg) {
return typeof arg === 'string' ? arg : JSON.stringify(arg)
};
var keyFromArgs = function (args) {
var id = toString(args[0]);
if (args[1] && args.length >= 3) {
id += '_' + toString(args[1]);
}
return id;
};
var clearCache = function () {
for (var key in CACHE) {
if (CACHE[key]) {
delete CACHE[key];
}
}
};
module.exports = function VuexCachePlugin(configTimeExpiration) {
TIME_EXPIRATION = configTimeExpiration || TIME_EXPIRATION;
return function (store) {
var backupDispatchFn = store.dispatch;
store.dispatch = function () {
// Spread Operator Alternative (...args)
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
// END Spread Operator Alternative
var vuexDispatchCacheConfig = args[args.length - 1];
if (vuexDispatchCacheConfig && vuexDispatchCacheConfig.enableVuexCachePlugin) {
if (vuexDispatchCacheConfig.clearAllCache) {
clearCache();
}
var KEY = keyFromArgs(args);
if (!CACHE[KEY] || vuexDispatchCacheConfig.forceRefreshCache) {
CACHE[KEY] = {
data: backupDispatchFn.apply(store, args),
timestamp: new Date().getTime(),
timeExpiration: vuexDispatchCacheConfig.timeExpiration || TIME_EXPIRATION,
};
return CACHE[KEY].data;
} else {
var dataCache = CACHE[KEY];
if (dataCache && dataCache.timestamp > new Date().getTime() - dataCache.timeExpiration) {
return dataCache.data;
} else {
CACHE[KEY] = {
data: backupDispatchFn.apply(store, args),
timestamp: new Date().getTime(),
timeExpiration: vuexDispatchCacheConfig.timeExpiration || TIME_EXPIRATION,
};
return CACHE[KEY].data;
}
}
} else {
backupDispatchFn.apply(store, args);
}
};
};
}