使用Requirejs,是否可以在不尝试加载模块的情况下检查是否定义了该模块? [英] With requirejs is it possible to check if a module is defined without attempting to load it?

查看:10
本文介绍了使用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')获取引用失败,因为它尚未解析。

幸运的是,使用回调版本的Required很容易解决这个问题。把所有这些放在一起,我们有:

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

@David Wolf-谢谢,如果没有您的帮助,我不会做到这一点。

这篇关于使用Requirejs,是否可以在不尝试加载模块的情况下检查是否定义了该模块?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆