针对EventEmitter2的require.js shim配置

时间:2013-10-14 14:47:53

标签: javascript requirejs eventemitter

我是require.js的新手,并尝试在我的页面上使用RosLib.js加载require.js。 RosLib.js依赖于EventEmitter2

所以这是我的代码:

require.config({
    shim: {
        eventemitter: {
            exports: 'EventEmitter2'
        },
        roslib: {
            deps: ["eventemitter"],
            exports: "ROSLIB"
        }
    },
    paths: {
        roslib: "https://raw.github.com/RobotWebTools/roslibjs/devel/build/roslib",
        eventemitter: "https://raw.github.com/hij1nx/EventEmitter2/master/lib/eventemitter2"
    }
});

require(["roslib"], function (ROSLIB) {
    var urlname = "ws://" + location.hostname + ":9090";
    ros = new ROSLIB.Ros({
        url : urlname
    });
});

如果函数执行了somhow,则eventemitter2.js出错并且未定义EventEmitter2

Uncaught ReferenceError: module is not defined (eventemitter2.js:561)

Uncaught ReferenceError: EventEmitter2 is not defined (roslib.js:121)

以下是相应的JsFiddle示例:http://jsfiddle.net/mKyEA/1/

如何配置require.js以正确初始化EventEmitter2?

2 个答案:

答案 0 :(得分:3)

看起来你正确地做了requirejs。

您指定的EventEmitter2.js似乎是问题... 单独的脚本会引发错误。 “模块未定义”。该变量显然没有在其脚本的底部定义。

我从网上抓取了一个不同版本的EventEmitter2并对其进行了自定义以暴露全局变量EventEmitter2,以便ROSlib可以看到它。

我对ROSlib不熟悉,但它似乎缺少一个函数setMaxListeners。 因为在放入新的EventEmitter2之后我收到以下错误。 “TypeError:this.setMaxListeners不是函数”

Jsfiddle给了我一些奇怪的错误。这段代码应该是你想要的。为方便起见,我附上了一个pastebin。 pastebin example 它显示固定事件发射器。 http://jsfiddle.net/mKyEA/6/

    require.config({
    shim: {
        eventemitter: {
            exports: 'EventEmitter2'
        },
        roslib: {
            deps: ["eventemitter"],
            exports: "ROSLIB"
        }
    },
    paths: {
        roslib: "https://raw.github.com/RobotWebTools/roslibjs/devel/build/roslib",
        eventemitter: "http://yourjavascript.com/15010010093/eventemitter2"
    }
});

答案 1 :(得分:1)

有两个问题:

第一个问题发生在EventEmitter2库中。 我得到了Uncaught ReferenceError: module is not defined (eventemitter2.js:561)例外。

此提交应修复此异常:https://github.com/Pro/EventEmitter2/commit/f829a2571b4adc66d304cb9fd5a2a5698d41c107

下一个问题是RosLib找不到EventEmitter: Uncaught ReferenceError: EventEmitter2 is not defined (roslib.js:121)

我通过添加额外的require来设置全局EventEmitter2来修复此问题。因为RosLib期望EventEmitter2是全局的,但由于使用了require.js,因此它未在windows.EventEmitter2上设置:

require(["eventemitter", ], function (EventEmitter2) {
    window.EventEmitter2 = EventEmitter2;
});

这是新的工作小提琴:

http://jsfiddle.net/43dCV/1/