使用requirejs是否可以在不尝试加载模块的情况下检查模块是否已定义?

使用requirejs是否可以在不尝试加载模块的情况下检查模块是否已定义?,requirejs,Requirejs,我希望能够有选择地定义一个模块,然后在代码中使用或不使用它。我考虑的特殊情况是在调试/测试环境中加载模拟/存根模块,但不是在上线时。以下是一个例子: 在html文件中,可以选择加载js文件(伪代码): 然后,在使用该服务时,我想检查是否定义了mock_服务: //service_user.js define(['require', 'real_service'], function (require, real_service) { if (require.isDefi

我希望能够有选择地定义一个模块,然后在代码中使用或不使用它。我考虑的特殊情况是在调试/测试环境中加载模拟/存根模块,但不是在上线时。以下是一个例子:

在html文件中,可以选择加载js文件(伪代码):

然后,在使用该服务时,我想检查是否定义了mock_服务:

//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语句,但这会导致尝试从服务器加载它,我不希望这样

另一种选择是定义一个存根,我总是加载它,因此总是需要一个mock,然后我可以询问它是否是真实的,但这似乎也是浪费

有没有人深入研究require.js,发现他们需要这个功能,并制定了实现策略


提前谢谢你,Rob

我自己也在找这个,require global有一个“defined”方法,它接受模块名并返回true或false

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

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

虽然大卫·沃尔夫的回答很贴切,但并不能完全满足我的需要

问题是require异步解析需求,因此在我给出的示例中,使用David的建议
require.defined('mock_service')
将返回
false
,因为虽然已指定,但尚未解析

在研究这一点时,我确实找到了另一个指定的函数
。在本例中,
require.specified('mock_service')
将返回
true
,但是使用
require('mock_service')
尝试获取引用失败,因为它尚未被解析

幸运的是,通过使用require的回调版本可以很容易地解决这个问题。综上所述,我们有:

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

@David Wolf-谢谢,如果没有您的帮助,我是不会到达那里的。

Thx-这几乎满足了我的需求,帮助我找到了正确的答案,我现在添加了这个答案,并将其标记为完整的解决方案。只是好奇,是否有杏仁版本的替代方案?
// returns true
require.defined("my/awesome/defined/module");

// returns false
require.defined("not/yet/loaded");
if (require.specified('mock_service')) {
    require( [ 'mock_service' ], function (mock) {
         mock.init(real_service);
    });
}