Require/定义缺失参数的结果

Require.js Require/Define consequences of missing parameters

本文关键字:参数 结果 定义 Require      更新时间:2023-09-26

我遇到了各种各样的竞争条件和范围问题与我的web应用程序,使用require.js管理依赖关系。

我一直在尝试清理和优化代码库,并引入rjs作为控制页面加载(加载依赖)时生成的大量请求的机制。

:

没有像这样在模块定义中显式声明参数的后果是什么:

define([
    "jquery",
    "app/modules/validation",
    "jquery.chosen"
], function(
    $,
    Validation,
    // note missing parameter
) { //stuff here });

或者像这样的require语句:

require([
    "jquery",
    "app/modules/validation",
    "jquery.chosen"
], function(
    $,
    Validation,
    Chosen
) {
    // the 'chosen' object here is actually referencing the object defined in the other module
});

我在我的应用程序中发现了许多问题,我想知道上面是否可能是罪魁祸首?似乎不包含参数允许它泄漏作用域?这可能吗?

编辑我试图避免这变成"调试我的require.js"配置,但我们开始了:

我config.js

requirejs.config({
    paths: {
        jquery: 'jquery-shim',
        'jquery.chosen':'chosen/chosen.jquery',
        'jquery.validity': 'lib/jquery.validity'
    },
    shim: {
        'jquery.chosen': ["jquery"],
        'jquery.validity': {
            deps: ["jquery"],
            exports: "jQuery.fn.validity"
        }
    }
});

你可以看到jQuery目前的别名如下-我认为这可能是问题所在:

//jquery-shim.js     
 define([], function() {
    return window.jQuery;
 });

当我在我的html中加载require.js时,它看起来像这样:正如你所看到的,jquery正在加载require.js——原因是当加载require.js时,它不会绑定到DOMContentLoaded事件,因此所有其他绑定到jQ的代码也不会绑定到DOMContentLoaded事件。就绪,永不执行:

<script src="{{ asset('assets/js/jquery/dist/jquery.min.js') }}"></script>
<script src="{{ asset('assets/js/requirejs/require.js') }}"></script>
<script>
require(['app/site_core'], function (common) {
    require(['app/default']);        
});
</script>

这很大程度上取决于你的" stuff here "是什么。由于您没有包括这些信息,我将尝试涵盖所有组合:

  1. 您需要jquery.chosen,您将其绑定到工厂功能参数(例如:Chosen"),你使用它。这是正常使用模式。
  2. 您需要jquery.chosen,您将其绑定到工厂函数参数(例如:Chosen "),但你没有在函数内使用它。把它从依赖列表中删除——不需要把模块签名弄乱。
  3. 你需要jquery.chosen,你没有将它绑定到工厂函数参数,但你不使用这个依赖。类似于2。:删除所有不需要的依赖,以保持你的代码干净。
  4. 你需要jquery.chosen,你没有将它绑定到工厂函数参数,但是你正在使用它。这是一个潜在的致命的场景,这取决于插件是如何编写的,它可能在某些时候工作,因为JavaScript引擎将尝试在所有已知的作用域中找到指定的变量,从本地开始,到window作用域结束。你很幸运,它会立即失败,但如果你选择了一个存在于全局作用域中的变量名,你将使用它跳过AMD机制,导致意想不到的奇怪和时间敏感问题。

最后两个变体也很危险,因为您可能在以后添加新依赖项时没有注意到不匹配,从而导致令人困惑的错误,例如:

define([
  "jquery",
  "app/modules/validation",
  "jquery.chosen",
  "underscore",
], function($, Validation, _) {
  //_ variable refers to jQuery.chosen due to the mismatch
});

不确定你在上一个注释中所说的"其他模块"是什么意思:"这里的'选定'对象实际上引用了中定义的对象"

未显式声明参数的后果是什么

什么都没有,直到你想在你的函数中使用它,但是因为你没有引用它而不能。RequireJS不会反对,也不会因为你缺少一个参数而被置于一些有问题的状态。没有返回值的AMD模块有合法的用例,其效果是某种副作用,例如装饰不同的AMD模块。

在没有看到任何代码的情况下,我可以大胆猜测,你的问题很可能是由于你的jquery插件没有正确加载jquery在AMD -最有可能有一个坏的使用noconflict,失败指定加载顺序通过垫片,或全局问题。查看RequireJS的jQuery说明了解更多细节。

编辑:你的配置似乎没有什么明显的错误,除了我没有看到rjs生成的层的引用,除非app/site_core是你的层。您应该确保在需要层中包含的模块之前需要该层。RequireJS配置可以很好地做到这一点。

以下是对RequireJS文档的修改。注意,层被指定为依赖项。

var require = {
    deps: ["my/layer"],
    callback: function(module1, module2) {
        //This function will be called when all the dependencies
        //listed above in deps are loaded. Note that this
        //function could be called before the page is loaded.
        //This callback is optional.
    }
};