我是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?
答案 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;
});
这是新的工作小提琴: