【问题标题】:With requirejs is it possible to check if a module is defined without attempting to load it?使用 requirejs 是否可以在不尝试加载的情况下检查模块是否已定义?
【发布时间】:2013-02-13 10:35:29
【问题描述】:

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

在 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' 函数只会检查具有给定名称(或名称?)已定义的模块。然后在我的代码中,如果它被定义,我可以要求它并使用它。如果没有,那也没关系。

对我来说重要的是没有尝试加载可选模块。我可以尝试/捕获 require 语句,但这会导致尝试从服务器加载它,我不希望这样。

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

是否有深入研究 require.js 的人发现他们需要此功能并制定了实施策略?

提前谢谢你,罗伯

【问题讨论】:

    标签: requirejs


    【解决方案1】:

    我自己只是在寻找这个,require global 上有一个“已定义”的方法,它接受一个模块名称并返回 true 或 false。

    // returns true
    require.defined("my/awesome/defined/module");
    
    // returns false
    require.defined("not/yet/loaded");
    

    【讨论】:

    • Thx - 这几乎满足了我的需求并帮助我找到了我现在添加并标记为完整解决方案的正确答案。
    • 只是好奇,杏仁版本中是否有其他选择?
    【解决方案2】:

    虽然 David Wolf 的回答接近分数,但它并没有完全满足我的需求。

    问题是 require 异步解决需求,所以在我给出的示例中并使用 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);
        });
    }
    

    @David Wolf - 谢谢,如果没有您的帮助,您将无法到达那里。

    【讨论】:

      猜你喜欢
      • 2011-01-04
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2018-05-30
      • 2020-06-07
      • 1970-01-01
      相关资源
      最近更新 更多