2015-04-24 228 views
0

我有一個內部使用AMD模塊(requirejs)的庫。我想從這些模塊中返回一些方法作爲公共API。目前我正在使用一個同步請求調用來做到這一點。requirejs模塊包含模塊

如:

// library 
define("a", function(){ 
    define("b", ['somedep','anotherdep'], function(dep, dep2){ 
     return { something: "x"}; 
    }); 

    return { 
     b: require('b').something 
    }; 
}); 



// then to use it. 
require(['a'], function(a){ 
}); 

然而,這提供了錯誤。 錯誤:模塊名稱「b」尚未加載上下文:_。使用require([])

我不想公開內部定義調用外部(通過展開所有定義),因爲我不希望庫消費者能夠使用這些內部模塊。

+0

爲什麼你需要在模塊內部定義一個模塊?你可以分開這些嗎?我認爲'requirejs'並不意味着要這樣做 –

+0

這個庫很大,將它分成模塊意味着它更容易處理。 –

+0

你可以用不同的方式做到這一點。檢查我的答案:) –

回答

-1

我們最終改變項目使用ES6模塊,巴布爾和browserify。這使得一切都是同步的,而不是異步。

0

您不能嵌套您的模塊定義。試試這個:

define("b", ['somedep','anotherdep'], function(dep, dep2){ 
    return { something: "x"}; 
}); 

define("a", ['b'], function(b){ 
    return { 
     b: b.something 
    }; 
}); 

// then to use it. 
require(['a'], function(a){ 
}); 
+0

我不想暴露每個模塊到外部的範圍。在這種情況下,模塊b將包含自己沒有任何意義的方法,並且我可能希望在內部修改而不用擔心人們會使用它們 –

0
// Defined module "b" 
define("b", ['somedep','anotherdep'], function(dep, dep2){ 
    return { something: "x"}; 
}); 

// Defined module "a" 
define("a", ["b"], function(b){ 

    return { 
     b: b.something 
    }; 
}); 



// then to use it. 
require(['a'], function(a){ 
}); 

你可以做這樣的事情

0

I don't want to expose the internal define calls externally (by flattening out all the defines) since i don't want library consumers to be able to use those internal modules.

我不知道一個簡單的方法來申報RequireJS一個模塊,並在同一時間阻止模塊從能夠被任何可以調用RequireJS的require的代碼使用。假設您顯示的代碼會起作用。然後,只要模塊a已被加載,模塊b就可以被任何代碼訪問。 (這裏的「加載」意味着工廠功能已經執行。)因此,在訪問b時首先依賴於加載ab不會被隱藏。

您的代碼不工作的原因是,「同步」 RequireJS的require是僞同步......或許更好的說法是,它是一個僞require確實同步運行,但將保釋權如果你想要的模塊沒有加載,請離開。再次,「裝」在這裏是指不僅一個define呼籲模塊已經執行,但該模塊本身的依賴性已經加載和模塊的工廠函數已經執行。在您的代碼中,模塊b的依賴關係尚未加載,並且b的工廠功能尚未執行,因此您的require調用失敗。

您將能夠加載brequire(['b'])但您必須從a返回某種承諾。

你基本上可以隱藏使用範圍界定,但不做b模塊是什麼模塊b

define("a", ['somedep', 'anotherdep'], function(dep, dep2){ 
    var b = (function (foo, bar) { 
     return { something: "x" }; 
    })(dep, dep2); 

    return { 
     b: b.something 
    }; 
});