在Require.js中使用module.exports模块化模块吗?

时间:2013-02-28 11:05:04

标签: javascript requirejs amd

我有一个我想要包含在Require.js链中的模块。 (更具体地说:https://github.com/component/emitter

在我得到的浏览器上: uncaught reference error: module is not defined

对于模块导出,它定义: module.exports = Emitter;

我猜这叫做AMD / Node方式。如果错误,请更正。

在任何情况下我都希望require.js能够以某种方式在浏览器中进行模块化。 我认为Require.js的声明性填充选项可以帮助我,但我仍然看到上面的错误。

如果不手动修补模块,如何解决这个问题? (因为我想保持我设置的自动构建过程)

1 个答案:

答案 0 :(得分:5)

组件是CommonJS模块

组件框架是以CommonJS模块格式编写的组件集合。模块的预期值简单地分配给名为module.export的“魔术属性”,旨在由JS运行时提供。

这不是Web JS运行时的工作方式,因为CommonJS模块对特定工作流做出假设。如果没有同步保证文件已加载的能力(或者在没有加载时发生灾难性故障),浏览器就无法支持与独立环境相同的工作流程。因此,必须包含以CommonJS格式编写的任何内容以将其考虑在内。

为了将CommonJS模块与像RequireJS这样的AMD样式模块加载器一起使用,您可以自己包装所需的模块,也可以使用r.js构建工具。

手动包装CommonJS模块

define(function(require, exports, module) {
  //Put traditional CommonJS module content here
});

来自CommonJS Notes

使用r.js

自动换行
r.js -convert path/to/commonjs/modules path/to/converted/modules

鉴于您已使用r.js安装了npm -g i requirejs

解决具体问题

然而,所有这些只是解决“如何在异步工作流程中使用CommonJS模块?”这一更普遍的问题。你实际上想要实现的目的只是为了能够在没有自己编写的情况下获得事件系统。

由于您在客户端加载了这个,因此有很多客户端库已经提供此功能。提供此功能的最受欢迎的库可能是Backbone.js's Events。使用Backbone事件的好处是Backbone得到了很好的支持,并且有很好的文档记录。缺点是Backbone是您必须加载的另一个依赖项(包括它自己的依赖项,Underscore)。另外,Backbone导出到一个全局变量,所以你需要声明一个RequireJS shim配置才能require()它。

真正的AMD

圣杯将是一个小型和AMD兼容的EventEmitter类型库。为此,您可以尝试使用像pubsub.jsnbd.js这样的微型库(披露:我是nbd.js的作者)。

如果您使用nbd.js,它提供的不仅仅是pubsub功能。但你可以专门require()只是pubsub模块。

如果您使用git进行源代码管理,最简单的方法是将其用作子模块。

git submodule add git@github.com:behance/nbd.js.git path/to/nbd

然后,require pubsub模块,做你想做的事!

require(['nbd/trait/pubsub'], function(pubsub) { /* do whatever */ });