4

我一直在尝试使用 RequireJS 将 Socket.io 加载到我的应用程序中,但它只是不断给出错误。

使用的版本:

  • 节点JS : 0.10.17
  • Socket.io:0.9.16 _
  • Socket.io 客户端: 0.9.16
  • 要求JS: 2.1.8

尝试的解决方案:

索引.html

require.config({
    shim: {
        'socketio': {
            exports: 'io'
        },
    },
    wrap: false,
    paths: {
        socket: '/socket.io/socket.io',
        jquery: "jquery-2.0.3.min",
        // Other dependencies
    }
});
require(["open_rpg"],function(OpenRPG){
    // App code here
});

文件.js

define(["socket"],
    function(io){
        // Socket started here

在使用 RequireJS 套接字之前工作。Socket JS 文件已正确加载。

输出:

Uncaught TypeError: Cannot call method 'push' of undefined

我尝试将 Socket.io 作为普通 JS 脚本加载,并使用:

paths:
  "socket.io": 'empty:'

但这会返回:

Uncaught Error: Mismatched anonymous define() module: function () { return io; }

更新: 由于 NodeJS 保留模块缓存,我添加了 Socket.io.js 文件的修改副本,根据解决方案 2 更改了第 107 行(请参阅链接),虽然这可行,但它不是真正的解决方案。所以我会保持这个问题的开放性。

我也尝试过将 SocketIO 的源添加为普通的 JS 文件,并在 RequireJS 中删除对它的所有引用,但它似乎仍然不兼容。

4

4 回答 4

1

/socket.io/socket.io由 nodejs 的 socket.io 模块交付,它旨在直接使用。有一个简短的片段理论上应该可以解决问题,但我不确定它是否适用于 RequireJS。

if (typeof define === "function" && define.amd) {
  define([], function () { return io; });
}

您可以下载整个客户端 socket.io js 并将其放在define(...)语句中。

define(function(){

    function add(a, b){
        return a + b;
    }

    return {
        add:add
    };
});
于 2013-10-12T13:32:22.193 回答
0

您的代码是正确的,但是您需要做一件事,即在加载index.html文件之前必须启动套接字服务器

我试过下面的代码,它对我来说很好。

索引.html

需要.config({

paths: {
    "socket.io": '/socket.io/socket.io',
    "jquery": "jquery-2.0.3.min"
} });

文件.js

定义([“socket.io”],函数(io){

    // Socket started here

希望这对你有用

于 2014-02-17T13:24:08.590 回答
0

我的解决方案如下:

require.config({
    baseUrl: "/",
    paths: {
        'jquery': 'path/to/jquery.min',
        'socketio': 'path/to/socket.io'
    },
    shim: {
        'jquery': {
            exports: '$'
        },
        'socketio': {
            exports: 'io'
        }
}
});
require(['jquery', 'socketio'], function($, io){
    // your code
})

我希望它可以帮助你!

于 2018-04-08T11:45:38.937 回答
-1

从 1.0 版开始,此问题已得到解决,因此更新到 1.* 应该会再次起作用。或者,您提出的修复也应该有效。

于 2014-06-09T18:43:44.747 回答