require.js 迴圈依賴介紹

admin發表於2017-07-15

所謂迴圈依賴就是a依賴b,b也同時依賴a。

在a執行到require('b')的地方時會停下來去呼叫b,當去執行b,執行到一半發現require('a'),就停下來去呼叫a。

解決方案:

當出現迴圈依賴時,就不要依賴前置載入了,在b需要呼叫a的某個方法的那個地方先就近載入:var a = require('a'),然後再去呼叫b中的方法,程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼
//b.js:
define(["require", "a"],
  function(require, a) {
    return function(title) {
      return require("a").doSomething();
    }
  }
);

雖然迴圈依賴是比較少見的,但是有時候還是會遇到的,下面再介紹一種解決方案:

如果熟悉CommonJS,可以使用exports為模組建立一個空object,該object可以立即被其他模組引用。在迴圈依賴的兩頭都如此操作之後,就可以安全地持有其他模組了。這種方法僅在每個模組都是輸出object作為模組值的時候有效,換成函式無效。

[JavaScript] 純文字檢視 複製程式碼
// b.js:
define(function(require, exports, module) {
  var a = require("a");
  exports.foo = function () {
    return a.bar();
  };
});

或者,如果你使用依賴注入陣列的步驟,則可用注入特殊的"exports"來解決:

[JavaScript] 純文字檢視 複製程式碼
// b.js:
define(['a', 'exports'], function(a, exports) {
  exports.foo = function () {
    return a.bar();
  };
});

相關文章