RequireJS:require()和define()之间的区别

tes*_*dtv 29 javascript amd requirejs

在RequireJS中,使用require()Vs define();之间的基本区别是什么?

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

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

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

Kat*_*314 50

在早期使用中让我烦恼的一个核心差异是弄清楚define 可能永远不会被称为.

只要define每个文件只有一个,它就会在该文件名下注册该模块.但是,define只有在require函数询问每个模块时才会加载模块.

定义:如果需要XXX,请先加载其他内容,然后返回此函数的结果.

要求:加载其他内容,然后运行此功能.(没有"如果")

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

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

如果这是唯一的Javascript文件,您可以打开您的页面,并且在控制台日志中没有任何内容,尽管脚本告诉它欢迎用户.但是,如果在页面中的某个位置或其他脚本中更改,则会插入以下内容:

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

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

实际上,在第二个就位的情况下,不需要手动将welcomepage.js作为<script>标记包含在内; 它会在看到需求后立即从其位置加载它,并意识到它需要它.


use*_*245 19

require并且requirejs是一样的.

require === requirejs // true
Run Code Online (Sandbox Code Playgroud)

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

require(["logger"], function(logger){
  logger.bla("S");
});
Run Code Online (Sandbox Code Playgroud)

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

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

// logger.js
define(function(){
  return {
    bla: function(x){
      alert(x);
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

在这里,我打电话define来定义logger模块.在这个模块中,我返回了bla我想要公开的函数.

有时定义看起来非常类似于导出因为define也可以依赖并使用其他模块,就像require可以使用其他模块一样.让我向您展示相同的logger模块,这次使用模块

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

这里记录器模块I defined也有一个被调用的依赖popup,因此它看起来像require.