Gee*_*Jan 12 javascript amd requirejs
我有一个我想要包含在Require.js链中的模块.(更具体地说:https://github.com/component/emitter)
在浏览器上我得到:
uncaught reference error: module is not defined
对于模块导出,它定义:
module.exports = Emitter;
我猜这叫做AMD/Node方式.如果错误,请更正.
在任何情况下,我都希望require.js能够以某种方式在浏览器中进行模块化.我认为Require.js的声明性填充选项可以帮助我,但我仍然看到上面的错误.
如果不手动修补模块,如何解决这个问题呢?(因为我想保持我设置的自动构建过程)
组件框架是以CommonJS模块格式编写的组件的集合.模块的预期值简单地分配给一个被称为"魔术属性" module.export
,旨在由JS运行时提供.
这不是Web JS运行时的工作方式,因为CommonJS模块对特定工作流做出假设.如果没有能够同步保证文件已加载(或者在没有加载时发生灾难性故障),浏览器就无法支持与独立环境相同的工作流程.因此,必须包装以CommonJS格式编写的任何内容以将其考虑在内.
为了将CommonJS模块与像RequireJS这样的AMD样式模块加载器一起使用,您可以自己包装所需的模块,也可以使用r.js构建工具.
define(function(require, exports, module) {
//Put traditional CommonJS module content here
});
Run Code Online (Sandbox Code Playgroud)
r.js -convert path/to/commonjs/modules path/to/converted/modules
Run Code Online (Sandbox Code Playgroud)
鉴于您已经安装r.js
了npm -g i requirejs
.
然而,所有这些只是解决了"如何在异步工作流程中使用CommonJS模块?"这一更普遍的问题.您实际上想要实现的目的只是为了能够在不自己编写事件的情况下获得事件系统.
由于您是在客户端加载它,因此有许多客户端库已经提供此功能.提供此功能的最受欢迎的库可能是Backbone.js的活动.使用Backbone事件的好处是Backbone得到了很好的支持,并且有很好的文档记录.缺点是Backbone是您必须加载的另一个依赖项(包括它自己的依赖项,Underscore).此外,Backbone导出到全局变量,因此您需要声明RequireJS shim配置才能使用require()
它.
圣杯将是一个小型和AMD兼容的EventEmitter类型库.为此你可以尝试使用像pubsub.js或nbd.js这样的微库(披露:我是nbd.js的作者).
如果您使用nbd.js,它提供的不仅仅是pubsub功能.但你可以特别require()
只是pubsub模块.
如果您使用git进行源代码管理,最简单的方法是将其用作子模块.
git submodule add git@github.com:behance/nbd.js.git path/to/nbd
Run Code Online (Sandbox Code Playgroud)
然后,require
pubsub模块,做你想要的!
require(['nbd/trait/pubsub'], function(pubsub) { /* do whatever */ });
Run Code Online (Sandbox Code Playgroud)