成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

動(dòng)態(tài)加載 js

jubincn / 3021人閱讀

摘要:由于報(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

相關(guān)文章

  • js實(shí)用方法記錄-js動(dòng)態(tài)加載css、js腳本文件

    摘要:測(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/...

    shusen 評(píng)論0 收藏0
  • js實(shí)用方法記錄-js動(dòng)態(tài)加載css、js腳本文件

    摘要:測(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/...

    Dogee 評(píng)論0 收藏0
  • js實(shí)用方法記錄-js動(dòng)態(tài)加載css、js腳本文件

    摘要:測(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/...

    sanyang 評(píng)論0 收藏0
  • 原生JS動(dòng)態(tài)加載JS、CSS文件及代碼腳本

    摘要:屬性共中狀態(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: ...

    you_De 評(píng)論0 收藏0
  • 原生JS動(dòng)態(tài)加載JS、CSS文件及代碼腳本

    摘要:屬性共中狀態(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: ...

    yagami 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<