【问题标题】:Error loading Socket.io with RequireJS使用 RequireJS 加载 Socket.io 时出错
【发布时间】:2013-10-20 11:35:50
【问题描述】:

我一直在尝试使用 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 工作正常。 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中删除对它的所有引用,但它似乎仍然不兼容。

【问题讨论】:

    标签: node.js requirejs socket.io


    【解决方案1】:

    我的解决方案如下:

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

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      此问题已在 1.0 版中得到解决,因此更新到 1.* 应该会再次起作用。或者,您建议的修复也应该有效。

      【讨论】:

      【解决方案3】:

      您的代码是正确的,但您需要做一件事,即在加载 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
      

      希望这对你有用

      【讨论】:

      • 你用什么版本的 Socket.io 测试了这个?现在可能已经修复了
      • @Chevi... 我使用了 0.9.16 版本的 socket.io。您使用的相同版本。但我没有在我的代码中编写垫片配置。
      【解决方案4】:

      /socket.io/socket.io 由 nodejs 的 socket.io 模块提供,旨在直接使用。有一个简短的 sn-p 理论上应该可以解决问题,但我不确定它是否适用于 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
          };
      });
      

      【讨论】:

      • 我应该用提供的sn-p做什么?将socket.io脚本添加为普通的JS脚本,然后添加这个?
      • 不,我的意思是这个sn-p被添加到socket.io代码中。它的作用是检查是否定义了 define 方法并注册 socket.io 以供 amd 使用。但是,它看起来不起作用,因此您应该获取代码并将其包装在定义语句中。 (再次检查我的答案)
      • 我明白你的意思,它可能会工作,但我似乎无法刷新 Node.js 模块缓存,所以新版本的 socket.io 没有更新。
      • 由于无法重新加载缓存,所以我在public文件夹中添加了另一个Socket.io.js文件的副本,并使用了更改第107行的解决方案。我仍然没有认为这是一个真正的解决方案,所以我只会更新我的问题以反映我已经做到了,同时等待有人提出不涉及修改源的解决方案。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      相关资源
      最近更新 更多