这是什么"要求"事情?

时间:2015-04-08 03:30:26

标签: javascript

我在许多JS库中看到了这一点,主要通过GitHub查看,目前正在查看PeerJS。我指的是这个:

var util = require('./util');
var EventEmitter = require('eventemitter3');
var Negotiator = require('./negotiator');
var Reliable = require('reliable');
...
window.Socket = require('./socket');
window.MediaConnection = require('./mediaconnection');
window.DataConnection = require('./dataconnection');
window.Peer = require('./peer');
window.RTCPeerConnection = require('./adapter').RTCPeerConnection;
window.RTCSessionDescription = require('./adapter').RTCSessionDescription;
window.RTCIceCandidate = require('./adapter').RTCIceCandidate;
window.Negotiator = require('./negotiator');
window.BinaryPack = require('js-binarypack');
...

仅凭直觉,似乎require()正在导入/包含传入的内容,即EventEmitter。但是,我无法确定require()的来源?

我对NodeJS不太熟悉,这似乎是NodeJS的事情,但我不明白require()如何适应网络浏览器环境,而NodeJS并不是#39; t存在。

我已经看过RequireJSBrowserify,但这些是需要包含在应用程序中以便使用require()函数的库。在PeerJS的例子中,我可以包含它:

<script type="text/javascript" src="/static/js/peerjs.v0.3.13.js"></script>

...它使用require()没问题。但是,看起来没有任何定义require()的第三方库与PeerJS源代码捆绑在一起。

它是如何被包括在内的?它是如何初始化的?如何获取传入的内容,即&#34; EventEmitter&#34;?

1 个答案:

答案 0 :(得分:4)

这是一种通过单一入口点将外部JavaScript(或任何其他文件)包含到脚本中而不引入全局变量的方法。它最常用于异步模块定义(AMD)和CommonJS模块。在它的最高级别,require()是使用JavaScript模块的API。 NodeJS大部分都使用CommonJS语法。

也没有明确的“更好”使用。它几乎成了一个东海岸/西海岸地区的战争,试图讨论一个与另一个。有人说AMD模块过于冗长,因为你必须在闭包中捕获所有导入然后使用它们,这意味着你必须在两个不同的地方查找你定义变量和导入的地方:

来自RequireJS

AMD Dojo

define('myModule', ['dep1', 'dep2'], function (dep1, dep2) {
    return function () {};
});

<强> CommonJS的

var foobar = require('./foobar').foobar,
    test   = new foobar();

test.bar(); // 'Hello bar'

另外,有人说AMD的 A 部分并没有真正让你受益,值得开销。

“require”部分来自哪里?

在浏览器中,require()来自您正在加载的任何库,无论它是AMD还是CommonJS加载器。但是,对于上面的示例,您看起来就像是在NodeJS上下文中使用它。 NodeJS在环境中定义了require(),就像module.exports一样。实际上,module.exports是您使用require(...)分配给的任何变量的内容。

将CommonJS中的module.exports与AMD如何将您的模块放入变量的手中进行对比,这只是您在调用define()时关闭的回报。

这些可以一起使用吗?

要触及的另一件事是它们并非彼此独占。他们可以使用某种包装或使用其他约定来强制相互玩耍: UMD 。 UMD尝试让您创建无论环境如何通过module.exportsdefine()可用的任何约定公开您的模块而工作的模块。