摘要:由于報(bào)表只有部分模塊用到,所以想使用動(dòng)態(tài)加載方式。常用的動(dòng)態(tài)加載有兩種。這里介紹動(dòng)態(tài)創(chuàng)建標(biāo)簽的方法。不說(shuō)了,直接上代碼上面是動(dòng)態(tài)加載的方法。當(dāng)同時(shí)打開這些模塊時(shí),有可能會(huì)導(dǎo)致多次加載。所以可以把加載后的模塊根據(jù)路徑緩存起來(lái)。
前端項(xiàng)目中使用到了一個(gè)報(bào)表庫(kù) Plotly.js, 這個(gè)庫(kù)有 600多k。由于報(bào)表只有部分模塊用到,所以想使用動(dòng)態(tài)加載方式。
首先想到使用 webpack 的懶加載,但是打包時(shí)間太長(zhǎng)。加這個(gè)庫(kù)之前 30秒,加之后 6 分鐘。使用 noParse 也沒有效果。
所以決定用到時(shí),手動(dòng)加載。
js 常用的動(dòng)態(tài)加載有兩種。ajax 加載后使用 eval 執(zhí)行?;蛘?b>使用 script 標(biāo)簽加載。
這里介紹動(dòng)態(tài)創(chuàng)建標(biāo)簽的方法。不說(shuō)了,直接上代碼:
// Attach handlers for all browsers var loadScript = function (path, callback) { const me = this; const script = document.createElement("script"); script.type = "text/javascript"; let done = false; const head = document.head; const error = () => { if (!done) { done = true; script.onload = script.onreadystatechange = script.onerror = null; head.removeChild(script); callback(false); } } const success = () => { if (!done) { done = true; script.onload = script.onreadystatechange = script.onerror = null; head.removeChild(script); callback(true); } } script.onreadystatechange = function () { if (this.readyState == "loaded" || this.readyState == "complete") { success(); } }; script.onload = success; script.onerror = error; script.src = path; head.appendChild(script); }
上面是動(dòng)態(tài)加載 js 的方法。但是可能多個(gè)模塊會(huì)用到這個(gè) js 庫(kù)。當(dāng)同時(shí)打開這些模塊時(shí),有可能會(huì)導(dǎo)致多次加載。所以可以把加載后的模塊根據(jù)路徑緩存起來(lái)。
下面代碼是使用 TypeScript 寫的, 根據(jù)路徑記錄 js 文件加載信息,避免重復(fù):
export default class LoadJs { public static loadSync(path: string): Promise{ const me = this; return new Promise((resolve, reject) => { me.load(path, (bSuc) => { if (bSuc) { resolve(); } else { reject(); } }); }); } public static load(path: string, callback: (bSuc: boolean) => void): void { let lib = this.pathLoaded[path]; // 沒有記錄,添加記錄 if (!lib) { lib = { isLoaded: false, callback: [callback], }; this.pathLoaded[path] = lib; } // 已加載直接返回 if (lib.isLoaded) { callback(true); } else { // 添加回調(diào) lib.callback.push(callback); // 加載 const me = this; this.loadScript(path, suc => { if (suc) { me.onLoad(lib, true); } else { me.onLoad(lib, false); } }) } } private static loadScript(path, callback) { const me = this; const script = document.createElement("script") as any; script.type = "text/javascript"; let done = false; const head = document.head; const error = () => { if (!done) { done = true; script.onload = script.onreadystatechange = script.onerror = null; head.removeChild(script); callback(false); } } const success = () => { if (!done) { done = true; script.onload = script.onreadystatechange = script.onerror = null; head.removeChild(script); callback(true); } } script.onreadystatechange = function () { if (this.readyState == "loaded" || this.readyState == "complete") { success(); } }; script.onload = success; script.onerror = error; script.src = path; head.appendChild(script); } private static pathLoaded: { [key: string]: PathLoading } = {}; private static onLoad(p: PathLoading, isSuc: boolean): void { p.isLoaded = true; for (const fun of p.callback) { fun(isSuc); } p.callback = []; } } interface PathLoading { isLoaded: boolean; callback: Array<(f: boolean) => void>; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89636.html
摘要:測(cè)試動(dòng)態(tài)加載到標(biāo)簽并執(zhí)行回調(diào)方法調(diào)用加載成功動(dòng)態(tài)加載腳本地址回調(diào)函數(shù)加載樣式站中下載打開方法測(cè)試頁(yè)面跳轉(zhuǎn)到微信中不能打開其他安卓手機(jī)嘗試調(diào)用未指定需要打開的可參考自定義協(xié)議參數(shù)轉(zhuǎn)換參考參數(shù)轉(zhuǎn)對(duì)象使用對(duì)象轉(zhuǎn)參數(shù) js實(shí)用方法記錄-動(dòng)態(tài)加載css/js 1.動(dòng)態(tài)加載js文件到head標(biāo)簽并執(zhí)行回調(diào)方法調(diào)用:dynamicLoadJs(http://www.yimo.link/static/...
摘要:測(cè)試動(dòng)態(tài)加載到標(biāo)簽并執(zhí)行回調(diào)方法調(diào)用加載成功動(dòng)態(tài)加載腳本地址回調(diào)函數(shù)加載樣式站中下載打開方法測(cè)試頁(yè)面跳轉(zhuǎn)到微信中不能打開其他安卓手機(jī)嘗試調(diào)用未指定需要打開的可參考自定義協(xié)議參數(shù)轉(zhuǎn)換參考參數(shù)轉(zhuǎn)對(duì)象使用對(duì)象轉(zhuǎn)參數(shù) js實(shí)用方法記錄-動(dòng)態(tài)加載css/js 1.動(dòng)態(tài)加載js文件到head標(biāo)簽并執(zhí)行回調(diào)方法調(diào)用:dynamicLoadJs(http://www.yimo.link/static/...
摘要:測(cè)試動(dòng)態(tài)加載到標(biāo)簽并執(zhí)行回調(diào)方法調(diào)用加載成功動(dòng)態(tài)加載腳本地址回調(diào)函數(shù)加載樣式站中下載打開方法測(cè)試頁(yè)面跳轉(zhuǎn)到微信中不能打開其他安卓手機(jī)嘗試調(diào)用未指定需要打開的可參考自定義協(xié)議參數(shù)轉(zhuǎn)換參考參數(shù)轉(zhuǎn)對(duì)象使用對(duì)象轉(zhuǎn)參數(shù) js實(shí)用方法記錄-動(dòng)態(tài)加載css/js 1.動(dòng)態(tài)加載js文件到head標(biāo)簽并執(zhí)行回調(diào)方法調(diào)用:dynamicLoadJs(http://www.yimo.link/static/...
摘要:屬性共中狀態(tài)初始狀態(tài)加載中加載完成已加載并可與用戶交互,但還需要加載圖片等其他資源全部資源加載完成文檔加載順序解析結(jié)構(gòu)加載外部腳本和樣式表文件解析并執(zhí)行腳本樹構(gòu)建完成加載外部資源文件圖片等頁(yè)面加載完成動(dòng)態(tài)加載公共方法動(dòng)態(tài)加載外部文件,并執(zhí)行 DOM readyState屬性共5中狀態(tài) uninitialized:初始狀態(tài) loading:document加載中 loaded: ...
摘要:屬性共中狀態(tài)初始狀態(tài)加載中加載完成已加載并可與用戶交互,但還需要加載圖片等其他資源全部資源加載完成文檔加載順序解析結(jié)構(gòu)加載外部腳本和樣式表文件解析并執(zhí)行腳本樹構(gòu)建完成加載外部資源文件圖片等頁(yè)面加載完成動(dòng)態(tài)加載公共方法動(dòng)態(tài)加載外部文件,并執(zhí)行 DOM readyState屬性共5中狀態(tài) uninitialized:初始狀態(tài) loading:document加載中 loaded: ...
閱讀 3567·2021-11-22 15:11
閱讀 4655·2021-11-18 13:15
閱讀 2714·2019-08-29 14:08
閱讀 3588·2019-08-26 13:49
閱讀 3105·2019-08-26 12:17
閱讀 3298·2019-08-26 11:54
閱讀 3122·2019-08-26 10:58
閱讀 2041·2019-08-26 10:21