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