-
Notifications
You must be signed in to change notification settings - Fork 1
/
seajs-cache.js
74 lines (67 loc) · 2.62 KB
/
seajs-cache.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
66
67
68
69
70
71
72
73
74
;(function() {
var doc = document,
h = doc.head,
store = window.localStorage;
function globalEval(data) {
if (data && /\S/.test(data)) {
var script = doc.createElement('script'),
code = '!function(){' + data + '\n}();';
script.appendChild(doc.createTextNode(code));
h.appendChild(script);
h.removeChild(script);
}
}
function parseUrl(url) {
var urlReg = /^((\w+):\/\/)?((\w+):?(\w+)?@)?([^\/\?:]+):?(\d+)?(\/?[^\?#]+)?\??([^#]+)?#?(\w*)/,
fields = urlReg.exec(url),
version = /v=\d+/.exec(fields[9]);
version = version ? version[0].split('=')[1] : 1;
return [fields[8], version];
}
function cacheJs() {
var exec = seajs.Module.prototype.exec,
slice = Array.prototype.slice;
seajs.Module.prototype.exec = function() {
if (this.uri && this.factory && !/\.css(?:\?|$)/i.test(this.uri)) {
store.setItem('cache~' + parseUrl(this.uri)[0], 'define("' + this.id + '", ["' + this.dependencies.join('","') + '"], ' + this.factory.toString() + ');');
}
return exec.apply(this, slice.call(arguments));
};
seajs.on('request', function(request) {
var url = request.requestUri;
if (/\.css(?:\?|$)/i.test(url)) {
return
}
var pathVersion = parseUrl(url),
versionMap = JSON.parse(store.getItem('cache~version')) || {},
curVersion = pathVersion[1],
cacheKey = pathVersion[0],
jsCode = store.getItem('cache~' + cacheKey);
if (jsCode && jsCode.length && curVersion == versionMap[cacheKey]) {
globalEval(jsCode);
request.requested = true;
request.onRequest();
} else {
versionMap[cacheKey] = curVersion;
store.setItem('cache~version', JSON.stringify(versionMap));
request.requested = false;
}
});
}
function storageHandler(e) {
var e = e || window.event;
store.removeItem(e.key);
}
try {
store.setItem('~', 1);
store.removeItem('~');
if (seajs.data.debug) {
console.log('开启了seajs debug模式,不缓存');
} else {
cacheJs();
window.addEventListener ? window.addEventListener('storage', storageHandler, false) : window.attachEvent('storage', storageHandler);
}
} catch (err) {
console.log('浏览器不支持localStorage');
}
})();