我在许多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存在。
我已经看过RequireJS和Browserify,但这些是需要包含在应用程序中以便使用require()
函数的库。在PeerJS的例子中,我可以包含它:
<script type="text/javascript" src="/static/js/peerjs.v0.3.13.js"></script>
...它使用require()
没问题。但是,看起来没有任何定义require()
的第三方库与PeerJS源代码捆绑在一起。
它是如何被包括在内的?它是如何初始化的?如何获取传入的内容,即&#34; EventEmitter&#34;?
答案 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.exports
或define()
可用的任何约定公开您的模块而工作的模块。