欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解js異步文件加載器

 更新時間:2016年01月24日 17:25:33   作者:animabear  
這篇文章主要為大家介紹了js異步文件加載器的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

我們經(jīng)常會遇到這種場景,某些頁面依賴第三方的插件,而這些插件比較大,不適合打包到頁面的主js里(假設(shè)我們使用的是cmd的方式,js會打包成一個文件),那么這個時候我們通常會異步獲取這些插件文件,并在下載完成后完成初始化的邏輯。

以圖片上傳為例,我們可能會用到plupload.js這個插件,那么我們會這么寫:

!window.plupload ?
    $.getScript( "/assets/plupload/plupload.full.min.js", function() {
      self._initUploader();
    }) :
    self._initUploader();
    

但是我們的頁面通常由多個獨(dú)立的模塊(組件)構(gòu)成,如果頁面上的A、B兩個模塊都依賴于plupload.js, 那是不是在兩個地方都要把上面的代碼寫一遍。如果這么干,在plupload.js被下載下來之前,可能會發(fā)起兩個請求,由于是并行下載,js文件可能會被重復(fù)下載,而不是第一次下載下來,第二次取緩存的內(nèi)容。

下圖是頁面多個組件依賴vue.js的情況(jquery和vue混用的場景):

所以,在實際使用中需要加鎖,即當(dāng)腳本正在加載時,不應(yīng)該再重復(fù)請求腳本,等待加載完成后,依次執(zhí)行后面的邏輯,有promise這個好工具,實現(xiàn)起來很簡單。

// vue加載器
var promiseStack = [];
function loadvue() {
  var promise = $.Deferred();
  if (loadvue.lock) {
    promiseStack.push(promise);
    
  } else {
    loadvue.lock = true;
    window.Vue ? 
       promise.resolve() : // 這里寫錯了,window.Vue為true的時候lock要置為false,我在后面改過來了
       $.getScript( "/assets/vue/vue.min.js", function() {
        loadvue.lock = false;
        promise.resolve();
        promiseStack.forEach(function(prom) {
          prom.resolve();
        });
      });
    
  }
  return promise;
}
window.loadvue = loadvue;

然后在依賴vue.js地方:

loadvue().then(function() { // do something }); 

再看看請求:

好了,到這里似乎解決問題了,但是假如我的頁面上存在多個插件依賴,比如既依賴plupload.js又依賴vue.js,難道我要把上面的代碼再寫一遍(怎么感覺好像說過這話)?這樣不就冗余了么?所以我們需要一個異步加載器的生成器,能夠幫助我們生成多個異步加載器。

/**
 * @des: js異步加載器生產(chǎn)器
 * @param {string} name  加載器名稱
 * @param {string} global 全局變量
 * @param {string} url  加載地址
 **/

var promiseStack = {};

exports.generate = function(name, global, url) {
  var foo = function() {
    if (!promiseStack[name]) {
      promiseStack[name] = [];
    }
    var promise = $.Deferred();
    if (foo.lock) {
      promiseStack[name].push(promise);
      
    } else {
      foo.lock = true;
      if (window[global]) {
        foo.lock = false;
        promise.resolve();
      } else {
        $.getScript(url, function() {
          foo.lock = false;
          promise.resolve();
          promiseStack[name].forEach(function(prom) {
            prom.resolve();
          });
        });
      }
      
    }
    return promise;
  };
  
  return foo;
};

然后我們可以生成異步加載器并賦給window

// 全局加載器
window.loadvue = loader.generate(
'vue', 
'Vue', 
'/assets/vue/vue.min.js');
window.loadPlupload = loader.generate(
'plupload', 
'plupload', 
'/assets/plupload/plupload.full.min.js');

使用的時候同上,這樣就基本解決了我們的問題。

以上就是關(guān)于js異步文件加載器的詳細(xì)內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • php圖片水印添加、壓縮、剪切的封裝類實現(xiàn)

    php圖片水印添加、壓縮、剪切的封裝類實現(xiàn)

    這篇文章主要介紹了php圖片水印添加,壓縮,剪切的封裝類實現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • php中PHPUnit框架實例用法

    php中PHPUnit框架實例用法

    在本篇文章里小編給大家整理的是一篇關(guān)于php中PHPUnit框架實例用法內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-01-01
  • yii2控制器Controller Ajax操作示例

    yii2控制器Controller Ajax操作示例

    這篇文章主要介紹了yii2控制器Controller Ajax操作方法,結(jié)合實例形式分析了Yii控制器調(diào)用ajax的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • thinkphp5.1 框架導(dǎo)入/導(dǎo)出excel文件操作示例

    thinkphp5.1 框架導(dǎo)入/導(dǎo)出excel文件操作示例

    這篇文章主要介紹了thinkphp5.1 框架導(dǎo)入/導(dǎo)出excel文件操作,結(jié)合實例形式分析了thinkphp5.1 框架導(dǎo)入/導(dǎo)出excel文件具體操作實現(xiàn)技巧與相關(guān)注意事項,需要的朋友可以參考下
    2020-05-05
  • 解析PHP緩存函數(shù)的使用說明

    解析PHP緩存函數(shù)的使用說明

    本篇文章是對PHP緩存函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • laravel 獲取當(dāng)前url的別名方法

    laravel 獲取當(dāng)前url的別名方法

    今天小編就為大家分享一篇laravel 獲取當(dāng)前url的別名方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • ThinkPHP5對接IOS蘋果支付代碼

    ThinkPHP5對接IOS蘋果支付代碼

    前端在調(diào)起蘋果支付前,先請求到服務(wù)端,服務(wù)端先生成一條充值記錄,但是狀態(tài)為:未支付;然后把這個訂單id發(fā)給前端,前端在支付完成的時候,會收到蘋果的支付憑證,將此憑證和訂單id回傳給服務(wù)端,訂單id的作用是用來確定是哪一筆,支付憑證是拿來校驗是否支付成功
    2023-08-08
  • Laravel 5框架學(xué)習(xí)之模型、控制器、視圖基礎(chǔ)流程

    Laravel 5框架學(xué)習(xí)之模型、控制器、視圖基礎(chǔ)流程

    本文給大家介紹的是Laravel5框架中模型、控制器、視圖的基礎(chǔ)流程,其實MVC體系結(jié)構(gòu)模式將一個交互式系統(tǒng)分為三個組件。模型包含核心功能和數(shù)據(jù)。視圖向用戶顯示信息??刂破魈幚碛脩糨斎?。視圖和控制器共同構(gòu)成了用戶接口。
    2015-04-04
  • 一個PHP并發(fā)訪問實例代碼

    一個PHP并發(fā)訪問實例代碼

    php其實也可以執(zhí)行多任務(wù)或并發(fā)訪問,下面就是網(wǎng)上找來的一個關(guān)于PHP并發(fā)訪問的例子
    2012-09-09
  • php按百分比生成縮略圖的代碼分享

    php按百分比生成縮略圖的代碼分享

    最近的一個網(wǎng)站項目中上傳圖片需要生成縮略圖,以減小列表頁的大小,減緩服務(wù)器壓力。一向崇尚簡潔明了和實用的我,看到網(wǎng)上搜到的一個個長長的php縮略圖類的時候,感到非常痛苦。我承認(rèn)他們寫的功能是強(qiáng)大一些,但是我不需要這么復(fù)雜的功能
    2014-05-05

最新評論