如何动态加载js 并保证加载顺序

1,081 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

如何动态加载js 并保证加载顺序

1.普通版本


//普通版本  无法保证顺序
function loadScript1(url, doc = document) {
      let script_ = doc.createElement("script");
     script_.type = "text/javascript";
     script_.src = url;
     script_.onload = function () {
            console.log(url);
     };
     doc.body.appendChild(script_);
}

//调用方法,下载时无法保证顺序

loadScript1('//unpkg.com/vue@latest/dist/vue.min.js');
loadScript1('//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.min.js');
loadScript1('//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue-icons.min.js')


2.回调版本


//带回调的版本
function loadScript2(url, loadCallback, doc = document) {
    let script_ = doc.createElement("script");
    script_.type = "text/javascript";
    script_.src = url;
    script_.onload = function () {
        console.log(url);
        loadCallback();
    };
    doc.body.appendChild(script_);
}


//调用方法,为了保证顺序需要回调嵌套
loadScript2('//unpkg.com/vue@latest/dist/vue.min.js',()=>{

    loadScript2('//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.min.js',()=>{

        loadScript2('//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue-icons.min.js');
    })

});

3.promise版本


//promise版本
function loadScript3(url, doc = document) {
    return new Promise(function (resolve) {
        let script_ = doc.createElement("script");
        script_.type = "text/javascript";
        script_.src = url;
        script_.onload = function () {
              console.log(url);
            resolve();
        };
        doc.body.appendChild(script_);
    });
}

// Promise 链式调用 保证顺序

loadScript3('//unpkg.com/vue@latest/dist/vue.min.js').then(()=>{
    loadScript3('//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.min.js')
}).then(()=>{
    loadScript3('//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue-icons.min.js')
})