javascript - require.js 中的显式依赖处理与隐式依赖处理

标签 javascript requirejs

我会用我实际做的事情作为例子。我有一个淘汰赛自定义绑定(bind),它依赖于一个 jquery 插件,该插件本身依赖于 jQuery UI,当然也依赖于 jQuery。还有另一个文件依赖于另一个插件,另一个文件依赖于 jQuery UI 等。在 require.config.js 中我有:

shim: {
    "jquery-ui": {exports: "$", deps: ["jquery"]},
    "jquery-plugin1": {exports: "$", deps: ["jquery-ui"]},
    "jquery-plugin2": {exports: "$", deps: ["jquery-ui"]}
}

这是可行的,然后在相应的文件中我可以这样做:

define(["jquery-plugin1"], function ($) {

但是,我也可以这样做:

define(["jquery", "jquery-ui", "jquery-plugin1"], function ($) {

还有一种情况,一个文件可能依赖于两个插件:

// which one?
define(["jquery-plugin1", "jquery-plugin2"], function ($) {
define(["jquery", "jquery-ui", "jquery-plugin1", "jquery-plugin2"], function ($){

还可能存在其他依赖项,例如淘汰自定义绑定(bind)(不需要导出任何内容),因此我最终可能会得到:

define(["jquery-plugin1", "model1", "model2",
"ko-custom1", "ko-custom2", "ko-custom3",
"jquery-plugin2"],
function ($, m1, m2) {

此文件也可能依赖于 jQuery UI(依赖于 jQuery),但它们都是通过插件隐式加载的。

我的问题是,最好明确所有要求(即在 define 中包含 jQuery 和 jQuery-UI)并可能放弃导出,还是首选不太详细的嵌套依赖项处理?

最佳答案

这是一个很好的问题,并且在使用 AngularJS 依赖注入(inject)之类的东西时变得非常相关,因为这些依赖关系需要在模块注册之前存在。所以这行不通:

define(['angular'],function (angular) {
  return angular.module('myModule', ['mySubmodule']);
});

// Error: [$injector:nomod] Module 'mySubmodule' is not available!

您还需要定义 AMD 依赖项:

define(['angular','./mySubmodule'],function (angular) {
  return angular.module('myModule', ['mySubmodule']);
});

这可能是主观的,但我发现通过让每个模块明确地定义自己的依赖项并让 requireJS 解决它们而不是让其取决于信仰 超出范围的模块已经定义了它们,这破坏了模块化。

通过这样做,您还知道您的 AMD 模块可以独立测试,而无需重新连接缺少的依赖项。

关于javascript - require.js 中的显式依赖处理与隐式依赖处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18534859/

相关文章:

javascript - 使用 r.js 来优化 require.js 文件

javascript - 使用 Requirejs 的非 AMD 库

javascript - 将耦合的 HTML/CSS 文件动态加载到 DOM 中

javascript - 在 JavaScriptCore 中加载 AMD 模块

testing - 使用 Angularjs 和 requirejs 时在测试中注入(inject)

javascript - ScrollTop 适用于 Chrome 和 Edge,但不适用于 Firefox

javascript - 无法修改计时器间隔函数以在 JavaScript 中给出总持续时间

javascript - 如何从 JavaScript 打开带有目标的链接

javascript - 跟踪 HTML div 内的滚动位置

javascript - 如何在 Meteor/React 中通过 onClick 将变量传递给函数?