使用RequireJS加载Socket.io时出错

时间:2013-10-12 12:33:45

标签: node.js requirejs socket.io

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

使用的版本:

  • NodeJS: 0.10.17
  • Socket.io: 0.9.16
  • Socket.io-client: 0.9.16
  • RequireJS: 2.1.8

尝试解决方案:

的index.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
});

file.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 个答案:

答案 0 :(得分: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
    };
});

答案 1 :(得分:0)

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

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

<强>的index.html

  

require.config({

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

<强> file.js

  

定义([ “socket.io”],       功能(IO)   {

    // Socket started here

希望这对你有用

答案 2 :(得分: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
})

我希望它可以帮到你!

答案 3 :(得分:-1)

此问题自版本1.0起已解决,因此更新为1. *应该再次有效。或者,您提出的修复也应该有效。