Javascript RequireJS中require()和define()之间的区别?

Javascript RequireJS中require()和define()之间的区别?,javascript,requirejs,amd,Javascript,Requirejs,Amd,在RequireJS中,使用require()和define()的基本区别是什么 任何用例都会非常有用。在早期使用中让我恼火的一个核心区别是,可能永远不会调用定义 只要每个文件只有一个define,它就会将该模块注册为该文件名下的可用模块。但是,define模块仅在require函数要求每个模块时加载 定义:如果您需要一个XXX,那么首先加载这些其他内容,然后返回此函数的结果 Require:加载这些其他内容,然后运行此函数。(无“如果”) 示例:假设您在页面中包含此JS文件: // this

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


任何用例都会非常有用。

在早期使用中让我恼火的一个核心区别是,可能永远不会调用
定义

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

定义:如果您需要一个XXX,那么首先加载这些其他内容,然后返回此函数的结果

Require:加载这些其他内容,然后运行此函数。(无“如果”)

示例:假设您在页面中包含此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包含为
标签;它会在看到需要并意识到需要时立即从其位置加载它。

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

或者你可以使用,类似这样的:

define(function (require) {
    var otherModule = require('otherModule');
    return function () {
        return otherModule.operation();
    };
});
可能您混淆了使用require()加载服务的格式,然后将define()指定为JSONP回调,一旦服务响应,最终将定义模块


最后,您使用define()定义模块,并使用require()加载它们。

require
requirejs
是相同的

require === requirejs // true
require
是加载已定义模块的一种方式。例如,要加载
记录器
模块,我可以执行以下操作:

require(["logger"], function(logger){
  logger.bla("S");
});
// logger.js
define(function(){
  return {
    bla: function(x){
      alert(x);
    }
  }
});
这里我调用
require
,指定一个已定义的名为
logger
的模块,并通过调用其
bla
方法来使用它

define
是定义模块的一种方法。例如,要定义
记录器
模块,我可以执行以下操作:

require(["logger"], function(logger){
  logger.bla("S");
});
// logger.js
define(function(){
  return {
    bla: function(x){
      alert(x);
    }
  }
});
这里我调用了
define
并定义了
logger
模块。在这个模块中,我返回了我想要公开的
bla
函数

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

// logger.js
define(["popup"], function(popup){
  return {
    bla: function(x){
      popup.show(x);
    }
  }
});
这里定义的记录器模块I
也有一个称为
弹出式
的依赖项,因此它看起来像
require

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

很简单的家伙

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

define是我们根据AMD模块格式声明模块的方式(还有其他可用的模块格式,如CommonJS、ES2015、System.register、UMD)

鉴于


require是一种模块加载结构,可用于模块加载程序,如RequireJs、SystemJS、节点的内置模块加载程序。当您想要使用以上述模块格式之一定义的模块时,可使用此选项。

请参阅此选项是重复的,但此处应以示例的形式给出解释。Thx为您的答案…请您详细说明一个基本示例…@Katana314…请详细说明…@testndtv添加了一个示例;希望有帮助。小结:由于/company/welcomepage.js声明了对“company/ui_library”的依赖关系,将加载的文件是/company/company/ui_library.js——这是您想要的吗?@DonHatch第一点:AMD可以配置为始终从某个根路径开始,或者将某个文件夹名识别为具有某个主目录(例如,“jquery”位于“api.google.com/cdn/jquery”)。在第二个示例中:在针对requirejs 2.1.5或Dojo进行测试时,我并没有出现这个错误。如果你是对的,它有可能从那时起改变了行为;也许是为了帮助人们在困惑之前尽早发现这样的问题。在您的第三个示例(
data main
)中,这明确要求使用该文件,因此它决定运行它。除了您的注释外,它在哪里说“logger”-那么是什么将其定义为“logger”模块呢?注释还是文件名?回答得很好。我已经用Javascript编写代码好几年了,总是发现它与面向对象编程的Java相比令人困惑。您的回答很简洁,这正是我需要听到的,以澄清对模块使用requireJS(而不是通常的直接调用函数的原始方式)