当前位置: 首页 > 面试题库 >

RequireJS和CommonJS之间的区别

姚海
2023-03-14
问题内容

我想知道这些摘要之间的区别是什么。

var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');

require(['jquery','underscore','backbone'],function ($, _, BackBone){
    //code goes here
})

两者对我来说都可以正常工作,但不能确定它们背后的目的是什么。


问题答案:

考虑第一个片段,它是CommonJS样式的:

var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');

这些调用是同步调用:require返回时,它将返回您请求的模块。CommonJS
require调用是同步的。有一种支持异步形式的建议,require但据我所知,它尚未超出建议级别。Node.js
require.async曾经被删除过。有一个实现它的包。使用此程序包看起来很像使用AMD样式模块。

现在,考虑第二个片段,它是AMD风格的:

require(['jquery','underscore','backbone'],function ($, _, BackBone){
    //code goes here
})

由于RequireJS实现了AMD类型的模块系统,因此以上代码可与RequireJS一起使用。require正如名称“异步模块定义(AMD)”所建议的那样,此调用是

异步的。您不能依赖的返回值require来获取模块值。您必须改用回调。该define调用以类似的方式工作,但是除了需要模块之外还定义了一个模块。

现在,如果您使用RequireJS,它提供的功能允许您在定义模块时使用任何一种样式,以便您可以定义如下模块:

define(['jquery','underscore','backbone'],function ($, _, BackBone){
    //code goes here
});

或使用看起来更像CommonJS习惯的东西:

define(function (require) {
    var $ = require('jquery');
    var _ = require('underscore');
    var BackBone = require('backbone');
    //code goes here
});

转换CommonJS样式模块以与RequireJS一起使用真的很容易:只需用define上面的调用包装它即可。有一个工具可以帮助您进行转换。

在后台,RequireJS读取第二种形式的回调代码,并创建一个依赖项列表,以便最终将其解释为:

define(['require', 'jquery','underscore','backbone'], function (require) {
    var $ = require('jquery');
    var _ = require('underscore');
    var BackBone = require('backbone');
    //code goes here
})

require回调中的调用是同步的,这可能令人惊讶(假设AMD是异步的)。这是RequireJS对CommonJS样式的支持的一部分。RequireJS支持一种同步require调用,但有以下警告:如果在调用sync
之前 已经 定义了模块require,则sync require返回模块的值,否则 立即 失败。也就是说,它不会 尝试
加载模块。因为RequireJS解释了一个使用CommonJS样式的模块定义,就像我在上面显示的那样-好像依赖项实际上是在define参数中列出的-
那样,保证这些模块在同步调用时已经加载require 被制造。

除了能够在RequireJS中使用CommonJS模块(添加了包装器)之外,还可以在Node.js之类的CommonJS环境中使用为RequireJS设计的模块。例如,我已经使用node-
amd-loader加载了在Node.js中设计为AMD模块的模块。



 类似资料:
  • 问题内容: 即使阅读了很多书,我仍然对 CommonJS,AMD 和 RequireJS 感到非常困惑。 我知道 CommonJS (以前称为 ServerJS )是用于在浏览器之外使用该语言时定义一些 JavaScript 规范(即模块)的组。 CommonJS 模块规范具有一些实现,例如 Node.js 或 RingoJS ,对吗? CommonJS , 异步模块定义 (AMD)和 Requi

  • 问题内容: 声明“如果要将导出对象设置为函数或新对象,则必须使用module.exports对象。” 我的问题是为什么。 我console.logged结果()和第一个是。 问题答案: 是具有属性的普通JavaScript对象。是一个普通的JavaScript变量,碰巧设置为。在文件末尾,node.js基本上将“返回”该函数。在Node中查看JS文件的一种简化方法是: 如果在上设置,如,该属性也会

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

  • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。

  • 首选的方法是什么?使用const和import有什么区别?假设您可能在许多文件/组件中导入相同的库。 常量 进口