这是什么“;要求“;事情
what is this "require" thing?
我在很多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()
)暴露您的模块。
- 要求输入在数据列表中
- 要求未定义JS回调参数
- 当脚本由system.js加载时,如何要求('electron')
- 要求定义另一个文件中的对象
- 这是什么“;要求“;事情
- window.onpopstate不工作;当我导航回页面时,不会发生任何事情
- 为什么spyOn"停止函数“”的所有执行;Jasmine(要求澄清Jasmine 2.2间谍文件)
- AMD格式是否要求模块为单件
- 如何在nodejs中要求类
- 当浏览器控制台未打开时,为什么要求会导致Internet Explorer 9超时
- 保持节点服务器运行”;观看“;让事情发生
- 要求的事情.主体在20个条目后自动将数组转换为对象
- 要求的事情.当试图从API方法获取用户时,用户是未定义的
- 要求的事情.体返回未定义,响应为200
- 要求的事情.参数在服务器端未定义:nodejs
- 要求的事情.在angular文件上传节点js中,body为空
- 要求的事情.使用multer上传文件时未定义文件
- 要求的事情.文件是未定义的
- 要求的事情.express.js中未定义的文件
- 要求的事情.使用google-passport-oauth登录后,用户未定义