node.js - 使用 RequireJS 加载 Socket.io 时出错

标签 node.js requirejs socket.io

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

使用的版本:

  • NodeJS: 0.10.17
  • Socket.io: 0.9.16
  • Socket.io 客户端: 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
});

文件.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 文件的修改副本,第 107 行根据解决方案 2 进行了更改(参见链接),虽然这有效,但它不是真正的解决方案。所以我会保留这个问题。

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

最佳答案

/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
    };
});

关于node.js - 使用 RequireJS 加载 Socket.io 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19334224/

相关文章:

node.js - 如何监视文件的更改并仅在更改完成后查看它们?

node.js - 如何设置 cookies express, react.js

node.js - Elastic Search中unicode(emoji)字符的字符串查询

node.js - 在 Require.js 优化器中打包 *.html 模板?

javascript - 使用 'app' 作为请求处理程序创建服务器?

http - Node.js - 控制 POST 请求的大小

javascript - Phonegap + 需要 Js

ember.js - EmberJs路由

javascript - Socket.io/ARI 错误 : Emit Alert

node.js - PhoneGap 中的 Websocket 以及使用 socket.io 的应用程序