33

在 RequireJS 中,使用 require() 与 define() 的基本区别是什么?

require(['a'], function(a) {
    // some code
});

// A.js
define(['b','c','d','e'], function() {
    //some code
});

任何用例都会非常有帮助..

4

5 回答 5

52

在早期使用时让我烦恼的一个核心区别是弄清楚 adefine 可能永远不会被调用

只要define每个文件只有一个,它就会将该模块注册为该文件名下的可用模块。但是,只有在函数要求每个define模块时才加载模块。require

定义:如果你需要一个XXX,那么先加载这些其他的东西,然后返回这个函数的结果。

要求:加载这些其他的东西,然后运行这个函数。(没有“如果”)

示例:假设您在页面中包含此 JS 文件:

// this is in company/welcomepage.js
define(['company/ui_library'],
    function(uiLib) {
        console.log('Welcome to {company}!');
    }
);

如果这是唯一的 Javascript 文件,您可以打开您的页面,并且控制台日志中将没有任何内容,尽管脚本告诉它欢迎用户。但是,如果在页面的某个位置或在另一个脚本中插入以下内容,情况就会发生变化:

require(['company/welcomepage'], function() {
    // optionally insert some other page-initialization logic here
});

现在,页面将在加载时在控制台中显示欢迎消息。

事实上,有了第二个,就不需要手动包含welcomepage.js 作为<script>标签了;一旦它看到需求,它就会从它的位置加载它,并意识到它需要它。

于 2013-08-30T14:17:36.267 回答
21

require并且requirejs是相同的。

require === requirejs // true

require是一种加载已定义模块的方法。例如加载logger我可以做的模块:

require(["logger"], function(logger){
  logger.bla("S");
});

我在这里调用require,指定一个已定义的模块调用logger并通过调用它的bla方法来使用它。

define是一种定义模块的方法。例如,要定义一个logger模块,我可以这样做:

// logger.js
define(function(){
  return {
    bla: function(x){
      alert(x);
    }
  }
});

在这里,我调用define并定义了logger模块。在这个模块中,我返回了bla我想要公开的函数。

有时define 看起来与exports 非常相似,因为define 也可以依赖和使用其他模块,就像require 可以使用其他模块一样。让我向您展示相同的logger模块,这次使用模块

// logger.js
define(["popup"], function(popup){
  return {
    bla: function(x){
      popup.show(x);
    }
  }
});

这里的记录器模块 Idefined也有一个名为的依赖项popup,因此它看起来像require

于 2015-07-03T03:45:42.983 回答
1

我相信您总是将 define 用于您的模块定义。您有多种方式可以这样做,您可以在数组中定义一个模块及其依赖项作为第一个参数来定义(如您发布的示例中所示)。

或者您可以使用简化的 CommonJS 包装器,如下所示:

define(function (require) {
    var otherModule = require('otherModule');
    return function () {
        return otherModule.operation();
    };
});

也许你混淆了JSONP 服务依赖格式,它使用 require() 来加载服务,然后将 define() 指定为 JSONP 回调,一旦服务响应,它将最终定义模块。

所以最后,你使用 define() 来定义模块,并使用 require() 来加载它们。

于 2013-08-30T14:18:09.450 回答
-1

define是我们如何声明一个模块,根据AMD模块格式(还有其他可用的模块格式,如CommonJSES2015System.registerUMD

然而 ..

require是一个模块加载结构,可用于RequireJsSystemJSNode 的内置模块加载器等模块加载器。当您想要使用以上述模块格式之一定义的模块时使用它。

于 2017-09-03T14:43:14.793 回答
-4

require()define()都是用来加载依赖的。这两种方法有一个主要的区别。

非常简单的家伙

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

于 2016-10-09T13:46:43.257 回答