使用Requirejs,是否可以在不尝试加载模块的情况下检查是否定义了该模块? [英] With requirejs is it possible to check if a module is defined without attempting to load it?
本文介绍了使用Requirejs,是否可以在不尝试加载模块的情况下检查是否定义了该模块?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我希望能够选择性地定义一个模块,然后在我的代码中使用或不使用它。我正在考虑的特定情况是在调试/测试环境中加载模拟/存根模块,而不是在我上线时。示例如下:
在html文件中,可以选择加载js文件(伪代码):
//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.js
define('mock_service', [],
function () {
...
});
//real_service.js
define('real_service', [],
function () {
...
});
然后在使用服务时,我想检查是否定义了mock_service:
//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"函数将只检查具有给定名称(或多个名称?)的模块。已经定义好的。然后,在我的代码中,如果定义了它,我就可以要求并使用它。如果没有,那也没问题。
对我来说重要的是没有尝试加载可选模块。我可以尝试/捕获REQUIRED语句,但这会导致尝试从服务器加载它,而我不希望这样。
另一种选择是定义我始终加载的存根,因此总是需要一个模拟,然后我可以询问它是否是真正的存根,但这似乎也很浪费。
有没有人已经深入到Required.js中,发现他们需要此功能,并且已经制定了实现策略?
提前谢谢您,Rob
推荐答案
虽然David Wolf的回答近乎中肯,但不能完全满足我的需求。
问题是,Required异步解析需求,因此在我给出的示例中,使用David的建议require.defined('mock_service')
将返回false
,因为虽然已经指定,但尚未解析。
在研究此问题时,我确实发现了另一个函数specified
。在示例中,require.specified('mock_service')
将返回true
,但随后尝试使用require('mock_service')
获取引用失败,因为它尚未解析。
if (require.specified('mock_service')) {
require( [ 'mock_service' ], function (mock) {
mock.init(real_service);
});
}
@David Wolf-谢谢,如果没有您的帮助,我不会做到这一点。
这篇关于使用Requirejs,是否可以在不尝试加载模块的情况下检查是否定义了该模块?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文