2013-02-13 47 views
27

我希望能夠有選擇地定義一個模塊,然後在我的代碼中使用它。我正在考慮的特定情況是在調試/測試環境中加載模擬/存根模塊,但不是在我上線時加載。下面是例如:使用requirejs是否可以檢查一個模塊是否被定義而不嘗試加載它?

在JS文件將被任選加載(僞碼)的HTML文件:

//index.cshtml 
... 
<script src="/Scripts/lib/require.js"></script> 
<script src="/Scripts/app/service_user.js"></script> 
<script src="/Scripts/app/real_service.js"></script> 
#if DEBUG 
<script src="/Scripts/app/mock_service.js"></script> 
#endif 

在兩者real_service和mock_service以上必須在調試版本被加載。

每個模塊將使用requirejs,如定義:如果mock_service已被定義

//mock_service.js 
define('mock_service', [], 
    function() { 
     ... 
    }); 

//real_service.js 
define('real_service', [], 
    function() { 
     ... 
    }); 

然後使用該服務時,我想檢查:

//service_user.js 
define(['require', 'real_service'], 
    function (require, real_service) { 
     if (require.isDefined('mock_service')) { // 'isDefined' is what I wish was available 
      var mock = require('mock_service'); 
      mock.init(real_service); 
     } 

     ... 
    }); 

所以我的名義' isDefined'函數只會檢查已定義的給定名稱(或名稱)的模塊。然後在我的代碼中,如果它被定義,我可以要求它並使用它。如果沒有,那也沒關係。

對我而言,重要的是不要嘗試加載可選模塊。我可以嘗試/趕上require語句,但這會導致嘗試從服務器加載它,我不想那樣做。

另一種方法是創建一個我總是加載的存根定義,所以總是有一個模擬需求,然後我可以詢問它是否是真實存在的,但這也看起來很浪費。

有沒有人深入require.js,他們發現他們需要這個功能並制定了實施策略?

謝謝你在前進,羅布

回答

41

儘管大衛·沃爾夫的答案已接近標準,但並未完全滿足我的需求。

問題是需要異步解決要求,所以在我給出的示例中,使用David的建議require.defined('mock_service')將返回false,因爲雖然已經指定它尚未解決。

當調查這個時,我確實找到了另一個功能specified。在示例require.specified('mock_service')將返回true,但隨後嘗試使用require('mock_service')獲取引用失敗,因爲它尚未解決。

幸運的是,通過使用require的回調版本很容易修復。把它放在一起,我們有:

if (require.specified('mock_service')) { 
    require([ 'mock_service' ], function (mock) { 
     mock.init(real_service); 
    }); 
} 

@大衛狼 - 謝謝,不會沒有你的幫助到那裏。

56

我只是在尋找這個自己的需要全球上有一個「定義」的方法,這需要模塊名稱和返回true或false。

// returns true 
require.defined("my/awesome/defined/module"); 

// returns false 
require.defined("not/yet/loaded"); 
+0

Thx - 這幾乎滿足了我的需求,幫助我找到了正確答案,現在我已添加並標記爲完整解決方案。 – WooWaaBob 2013-02-22 16:43:37

+0

+1很好的答案和一個不錯的功能,不知道這一個! – thomaux 2013-06-11 13:29:42

+0

只是好奇,如果在杏仁版本的任何替代? – 2016-04-07 03:48:47

相關問題