这是什么“;要求“;事情

what is this "require" thing?

本文关键字:事情 要求 是什么      更新时间:2023-09-26

我在很多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并不存在。

我看过RequireJS和Browserify,但这些库需要包含在应用程序中才能使用require()函数。在PeerJS的例子中,我可以将其包括在内:

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

并且它使用CCD_ 6没有问题。然而,似乎没有任何第三方库在定义与PeerJS源代码捆绑在一起的require()

它是如何包含的?它是如何初始化的?它是如何获取传入的内容的,即"EventEmitter"?

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

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

AMD来自RequireJS,也是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()来自您正在加载的任何库,无论是AMD还是CommonJS加载程序。然而,对于上面的示例,您看起来像是在NodeJS上下文中使用它。NodeJS在环境中定义了require(),就像module.exports一样。事实上,module.exports是给require(...)分配的任何变量的值。

将CommonJS中的module.exports与AMD如何将模块交到变量手中进行比较,后者只是您在调用define()时所做的闭包的返回。

这些可以一起使用吗

另一件需要注意的事情是,它们并不是彼此独有的。他们可以使用某种包装器或使用另一种约定:UMD来强迫彼此玩游戏。UMD试图让您创建可以工作的模块,无论环境如何,通过任何可用的约定(无论是module.exports还是define())暴露您的模块。