UNPKG

istanbul-js

Version:

use localStorage to cache script

76 lines (67 loc) 2.58 kB
/** * 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}"]);