istanbul-js
Version:
use localStorage to cache script
76 lines (67 loc) • 2.58 kB
JavaScript
/**
* use localStorage to cache script
* @author: zee
* @date: 2016-12-12
*/
;(function (sources) {
var KEY_CACHE = 'js_script_cache',
KEY_VERSION = 'js_script_version',
KEY_CONTENT = 'js_script_content';
var getScriptInfo = function (src) {
var items = src.split('.');
var currVersion = items[items.length - 2];
var scriptName = items[items.length - 4];
if (currVersion.indexOf('/') !== -1) {
currVersion = scriptName = '';
}
return {
currVersion: currVersion,
scriptName: scriptName,
};
};
var cacheScript = function (script, src, scriptInfo) {
var body = document.getElementsByTagName('body')[0];
var xhr = new XMLHttpRequest();
xhr.open('GET', src);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
try {
script.innerHTML = xhr.responseText;
body.appendChild(script);
if (scriptInfo.scriptName) {
var result = JSON.parse(localStorage.getItem(KEY_CACHE)) || {};
var temp = result[scriptInfo.scriptName] = {};
temp[KEY_VERSION] = scriptInfo.currVersion;
temp[KEY_CONTENT] = xhr.responseText;
localStorage.setItem(KEY_CACHE, JSON.stringify(result));
}
} catch (e) {
}
}
};
xhr.send();
}
var load = function (src) {
var scriptContent,
script = document.createElement('script'),
body = document.getElementsByTagName('body')[0],
scriptInfo = getScriptInfo(src),
oriScript = JSON.parse(localStorage.getItem(KEY_CACHE)),
oriVersion = oriScript && oriScript[scriptInfo.scriptName] && oriScript[scriptInfo.scriptName][KEY_VERSION] || '';
script.type = 'text/javascript';
if (oriVersion && scriptInfo.currVersion === oriVersion) {
try {
scriptContent = oriScript[scriptInfo.scriptName][KEY_CONTENT];
script.innerHTML = scriptContent;
body.appendChild(script);
} catch (e) {
cacheScript(script, src, scriptInfo);
}
} else {
cacheScript(script, src, scriptInfo);
}
};
sources.forEach(function(src) {
load(src);
});
})(["${data.vendor}", "${data.page}"]);