/** ! * Created by EYHN on 2017/4/17. https://github.com/EYHN * 修改自 sexdevil/LSLoader https://github.com/sexdevil/LSLoader */ (function () { window.lsloader = { jsRunSequence: [], //js 运行队列 {name:代码name,code:代码,status:状态 failed/loading/comboJS,path:线上路径} jsnamemap: {}, //js name map 防fallback 重复请求资源 cssnamemap: {} //css name map 防fallback 重复请求资源 }; /* * 封装localStorage get set remove 方法 * try catch保证ls写满或者不支持本地缓存环境能继续运行js * */ lsloader.removeLS = function (key) { try { localStorage.removeItem(key) } catch (e) { } }; lsloader.setLS = function (key, val) { try { localStorage.setItem(key, val); } catch (e) { } } lsloader.getLS = function (key) { var val = '' try { val = localStorage.getItem(key); } catch (e) { val = ''; } return val } versionString = "/*" + (window.materialVersion || 'unknownVersion') + "*/"; lsloader.clean = function () { try { var keys = []; for (var i = 0; i < localStorage.length; i++) { keys.push(localStorage.key(i)) } keys.forEach(function (key) { var data = lsloader.getLS(key); if (window.oldVersion) { var remove = window.oldVersion.reduce(function(p,c) { return p || data.indexOf('/*' + c + '*/') !== -1 }, false) if (remove) { lsloader.removeLS(key); } } }) } catch (e) { } } lsloader.clean(); /* * load资源 * name 作为key path/分割符/代码值 作为value ,存储资源 * 如果value值中取出的版本号和线上模版的一致,命中缓存用本地, * 否则 调用requestResource 请求资源 * jsname 文件name值,取相对路径,对应存在localStroage里的key * jspath 文件线上路径,带md5版本号,用于加载资源,区分资源版本 * cssonload css加载成功时候调用,用于配合页面展现 * */ lsloader.load = function (jsname, jspath, cssonload, isJs) { if (typeof cssonload === 'boolean') { isJs = cssonload; cssonload = undefined; } isJs = isJs || false; cssonload = cssonload || function () { }; var code; code = this.getLS(jsname); if (code && code.indexOf(versionString) === -1) { //ls 版本 codestartv* 每次换这个版本 所有ls作废 this.removeLS(jsname); this.requestResource(jsname, jspath, cssonload, isJs); return } //取出对应文件名下的code if (code) { var versionNumber = code.split(versionString)[0]; //取出路径版本号 如果要加载的和ls里的不同,清理,重写 if (versionNumber != jspath) { console.log("reload:" + jspath) this.removeLS(jsname); this.requestResource(jsname, jspath, cssonload, isJs); return } code = code.split(versionString)[1]; if (isJs) { this.jsRunSequence.push({ name: jsname, code: code }) this.runjs(jspath, jsname, code); } else { document.getElementById(jsname).appendChild(document.createTextNode(code)); cssonload(); } } else { //null xhr获取资源 this.requestResource(jsname, jspath, cssonload, isJs); } }; /* * load请求资源 * 根据文件名尾部不同加载,js走runjs方法,加入运行队列中 * css 直接加载并且写入对应的