什么时候应该使用require()和什么时候使用define()?


316

最近几天我一直在和requirejs玩。我试图理解定义和需求之间的区别。

定义似乎允许模块分离,并允许遵循依赖性顺序。但它会下载开始所需的所有文件。虽然仅需要时才加载需要的内容。

可以将两者一起使用吗?应将它们分别用于什么目的?

Answers:


331

通过define在require.js中注册模块,您可以在其他模块定义或require语句中依赖该模块。有了require你“只是”负载/使用可以通过require.js加载的模块或JavaScript文件。例如查看文档

我的经验法则:

  • 定义:如果要声明模块,则应用程序的其他部分将依赖于该模块。

  • 要求:如果只想加载和使用东西。


331

从require.js 源代码(1902行)中:

/**
 * The function that handles definitions of modules. Differs from
 * require() in that a string for the module should be the first argument,
 * and the function to execute after dependencies are loaded should
 * return a value to define the module corresponding to the first argument's
 * name.
 */

define()函数接受两个可选参数(代表模块ID的字符串和所需模块的数组)和一个必需参数(工厂方法)。

工厂方法的返回必须返回模块的实现(与模块模式相同)。

require()函数不必返回新模块的实现。

使用define()您正在问类似“运行作为参数传递的函数,并将任何返回值分配给我传递的ID,但在检查这些依赖项是否加载之前”之类的东西

使用require()您的意思是“我传递的函数具有以下依赖关系,请在运行之前检查这些依赖关系是否已加载”

require()函数是您使用已定义模块的地方,以确保已定义模块,但您不在那里定义新模块。


2
是否在require'd模块内部或外部使用require是否有任何区别?如果在模块内部使用它,为什么不只是在模块定义中设置需求,而不是使用require?
Petri 2014年

为什么这个答案与我在这里阅读的requirejs.org/docs/api.html#deffunc如此不同?
James Lin

2
@Petri,听起来好像您正在看到RequireJS的版本2异步加载模块的行为。“ RequireJS 2.0将不会执行模块的工厂函数(该函数传递给define()),直到有一个require([])调用它或依赖它的东西为止。” github.com/jrburke/requirejs/wiki/...
alxndr

2

用于定义模块的“ define”方法和用于处理依赖项加载的“ require”方法

define用于根据提案​​使用以下签名定义已命名或未命名的模块:

define(
module_id /*optional*/, 
[dependencies] /*optional*/, 
definition function /*function for instantiating the module or object*/
);

另一方面,如果您希望动态获取依赖项,则require通常用于在顶级JavaScript文件或模块内加载代码

有关更多信息,请参阅https://addyosmani.com/writing-modular-js/


2

通用规则:

  1. 当您要定义将被重用的模块时,可以使用define

  2. 您可以使用require来简单地加载依赖项

    //sample1.js file : module definition 
    define(function() {
          var sample1 = {};
          //do your stuff
         return sample1;
     });
    
    //sample2.js file : module definition and also has a dependency on jQuery and sample1.js
    define(['jquery', 'sample1'], function($,sample1) {
        var sample2 = {
            getSample1:sample1.getSomeData();
        };
        var selectSomeElement = $('#someElementId');
        //do your stuff....
        return sample2;
    });
    
    //calling in any file (mainly in entry file)
    require(['sample2'], function(sample2) {
        // sample1 will be loaded also
    });
    

希望这对您有所帮助。


1

require()和define()都用于加载依赖项。这两种方法之间的主要区别是。

非常简单的家伙

Require():方法用于运行即时功能。define():方法用于定义要在多个位置使用(重复使用)的模块。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.