0

我是 require.js 的新手,并尝试通过使用require.js加载它来在我的页面上使用 RosLib.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?

4

2 回答 2

3

看起来您正在正确地执行 requirejs。

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

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

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

Jsfiddle 给了我一些奇怪的错误。这段代码应该是你要找的。为方便起见,我附上了一个粘贴箱。pastebin 示例 它显示了固定的事件发射器。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"
    }
});
于 2013-10-14T18:48:14.127 回答
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)

我通过添加额外的设置全局 EventEmitter2 来解决此问题。因为 RosLib 期望 EventEmitter2 是全局的,但是由于使用了 require.js,所以它没有设置为windows.EventEmitter2

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

这是新的工作小提琴:

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

于 2013-10-15T19:35:26.983 回答