RequireJs - 定义与要求

Posted

技术标签:

【中文标题】RequireJs - 定义与要求【英文标题】:RequireJs - Define vs Require 【发布时间】:2013-06-26 07:23:00 【问题描述】:

对于模块,我不返回我一直使用 require 而不是 define 的对象。例如说我有以下 jQuery 插件(jquery.my-plugin.js):

require(['jquery'], function($) 
    $.fn.myPlugin = function(options) 
        ...
    ;
);

现在,如果我在另一个模块中说以下内容:

require(['jquery', 'jquery.my-plugin'], function($) 
    $('#element').myPlugin();
);

我发现这不起作用,因为 myPlugin 尚未注册。但是,如果我将 require 更改为我的 jquery.my-plugin 模块中的定义,那么它可以正常工作。

如果有人能澄清我为什么要这样做,我将不胜感激。在我继续使用它之前,我喜欢完全理解一些东西。谢谢

【问题讨论】:

when to use require and when to use define的可能重复 【参考方案1】:

本质上,当您使用require 时,您是在说“我想要这个,但我也想要它的所有依赖项”。因此,在下面的示例中,我们需要 A,但 require 会搜索所有依赖项并确保在继续之前加载它们。

require(['a'], function(a) 
    // b, c, d, e will be loaded
);

// File A
define(['b','c','d','e'], function() 
    return this;
);

一般的经验法则是,当您想要定义将被您的应用程序重用的模块时,您使用 define,而您使用 require 来简单地加载依赖项。

【讨论】:

谢谢,但为什么我不能使用 require 而不是为文件 A 定义?从本质上讲,文件 A 需要 b、c、d 和 e 才能执行。 感谢您的澄清。非常感谢。 @PaulOsborne:听起来类似于:“如果您有层次结构的东西,请使用类定义 (module.exports),如果您有通用的可重用工具,请使用通用模块对象 (exports)”。也就是说,我们是否总是将define 和通用模块对象一起使用,require 和类定义一起使用? 在这种情况下,OP 中的第二个 'require' 语句应该是 'define' 并且不需要列出 'jquery' 依赖项,因为 'jquery' 已经是 'jquery.我的插件' @NikoBellic 没有我原始问题中的第一个“要求”语句应该使用“定义”,因为它是一个依赖项(这个答案有依赖项“文件 A”)。您是正确的,但是您不需要重复对“jquery”的依赖。【参考方案2】:

下面是应该在 jquery.my-plugin.js 中的代码,它定义一个名为“jquery.my-plugin”的模块,可以用作其他地方的依赖。

define(['jquery'], function($)  //jquery is a dependency to the jquery.my-plugin module
    $.fn.myPlugin = function(options)  //adds a function to the *global* jQuery object, $ (global since jQuery does not follow AMD)
        ...
    ;
);

下面是一段代码,您希望将插件函数附加到全局 jQuery 对象,然后使用它...

require(['jquery.my-plugin'], function()  // jquery.my-plugin is loaded which attaches the plugin to the global JQuery object as shown above, then this function fires

    //the only reason $ is visible here is because it's global. If it was a module, you would need to include it as a dependency in the above require statement
    $('#element').myPlugin(); //the $ refers to the global object that has the plugin attached
);

【讨论】:

对我来说一切都很好。是的 $ 对象是全局定义的,所以我想是否将它包含在 require 语句中是可选的。通过这样做,您确实避免了与库冲突的潜在问题,并且与上面的定义语句一致。

以上是关于RequireJs - 定义与要求的主要内容,如果未能解决你的问题,请参考以下文章

收藏文章 写的很好 可惜有些还是看看不懂额。。。RequireJS进阶:模块的定义与加载

Requirejs:当我尝试通过requirejs获取它时,函数未定义

Rails的,RequireJS,C3.js:C3是未定义

requirejs 定义模块中含有prototype

requirejs下载与配置

Requirejs定义模块