Require/定义缺失参数的结果
Require.js Require/Define consequences of missing parameters
我遇到了各种各样的竞争条件和范围问题与我的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.jsrequirejs.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
"是什么。由于您没有包括这些信息,我将尝试涵盖所有组合:
- 您需要
jquery.chosen
,您将其绑定到工厂功能参数(例如:Chosen
"),你使用它。这是正常使用模式。 - 您需要
jquery.chosen
,您将其绑定到工厂函数参数(例如:Chosen
"),但你没有在函数内使用它。把它从依赖列表中删除——不需要把模块签名弄乱。 - 你需要
jquery.chosen
,你没有将它绑定到工厂函数参数,但你不使用这个依赖。类似于2。:删除所有不需要的依赖,以保持你的代码干净。 - 你需要
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.
}
};
- jquery jqgrid 不显示结果,具体取决于 JSON 对象中的参数
- 使用Javascript从DB中筛选结果,这将使DIV重新加载它'基于新参数的内容
- JS:通过键访问参数时出现奇怪的结果
- 如何从批处理文件调用一个带有2个参数的java脚本函数,并将结果返回到环境变量
- 如何使用URL参数筛选表中的结果
- 具有意外结果的 Javascript 函数参数
- JavaScript unshift 参数返回意外结果
- 文件读取器加载与结果和参数
- 将参数传递给 javascript 中的结果处理程序函数
- 传递g:remoteLink中的参数作为javascript函数的结果
- 如何在函数参数中使用循环并将结果记录到控制台
- Javascript在评估所有参数之前返回结果
- 如果使用参数数组调用,则日期会更改结果
- 如何通过参数获取Chrome本地存储结果的值映射
- 当使用类似的参数调用日期构造函数时,会提供意外的结果
- Angular JS发送参数并返回结果
- 如何在每个表行上放置click事件,并将结果作为参数传递,以将新数据绑定到另一个源
- Mongo:使用$in数组参数对结果进行排序
- .call()函数将函数作为参数而不是结果传递
- jQuery:如何在事件发生之前执行代码,并在事件时将结果作为参数