【问题标题】:what is this "require" thing? [duplicate]这是什么“需要”的东西? [复制]
【发布时间】:2015-06-12 20:47:45
【问题描述】:

我在很多 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 的 Web 浏览器上下文。

我见过RequireJSBrowserify,但这些库需要包含在应用程序中才能使用require() 函数。在 PeerJS 的示例中,我可以将其包含在内:

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

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

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

【问题讨论】:

  • requirejs.org 自我解释
  • @PM77-1:PeerJS 不使用 RequireJS 库。
  • 感谢@Qantas94Heavy。这里似乎没有使用 RequireJS
  • PeerJS 使用 Browserify 将脚本捆绑在一起,require 函数在构建代码的第一行中定义为函数参数。 github.com/peers/peerjs/blob/…
  • 您也可以从 Gruntfile.js 中看到这一点,它用于指定文件的构建方式。 github.com/peers/peerjs/blob/…

标签: javascript


【解决方案1】:

这是一种通过单一入口点将外部 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.exportsdefine())暴露您的模块的环境如何工作。

【讨论】:

  • 但它在哪里实现?它似乎不是浏览器 API;在控制台中输入require 没有任何作用...
  • 我没有在 NodeJS 上下文中使用它。我只是在我的网络应用程序中包含 PeerJS 库。从其中一个 cmets 看来,PeerJS 正在使用 browserify...
  • @Hristo 你如何构建你的webapp?如果这是使用browserify,那么它很可能会经历一些仍然使用nodejs 的构建步骤,无论是gulpfilegruntfilenpm build 调用还是其他一些魔法。
  • 这不是关于我如何构建我的 web 应用程序,而是关于 PeerJS 如何打包他们的库。看起来他们使用grunt.jsbrowserify
猜你喜欢
  • 2013-08-12
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 2019-11-24
相关资源
最近更新 更多