socket.io 1.0.x与require.js不兼容?

时间:2014-06-27 01:42:30

标签: node.js socket.io requirejs

任何时候我尝试在require.js之后加载socket.io 1.0.x,它会产生

  

未捕获的ReferenceError:未定义io

<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script>
<script src="https://cdn.socket.io/socket.io-1.0.6.js"></script>
<script type="text/javascript">
    var socket = io('http://localhost');
</script> 

但如果我在require.js之前放置socket.io,它不会产生任何错误:

<script src="https://cdn.socket.io/socket.io-1.0.6.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script>
<script type="text/javascript">
    var socket = io('http://localhost');
</script> 

这当然意味着require.js无法以这种方式加载socket.io:

requirejs.config({
    paths: { 

        'socketio' : ['https://cdn.socket.io/socket.io-1.0.6'],


    },
    shim: {

        'socketio': {
            exports: 'io'
        }
    }
});

require(['socketio'], function(io){

    console.log(window.io); //undefined


})

3 个答案:

答案 0 :(得分:0)

RequireJS创建一组requiredefine方法...... socket.io js文件看到了这一点,并定义了自己。

首先包含socket.io 使用AMD

答案 1 :(得分:0)

我特别希望凉亭包(ng-socket)和socket.io-client通过RequireJS进行合作。首先是ng-socket错误,因为io未定义,即使使用了shimmed deps。

所以,我添加了一个startSocketIo.js文件:

define([
  'socket.io-client'],function(io) {
  window.io = io;
});

并在我的require配置文件的根目录中添加了deps部分:

deps: [
  './startSocketIo'
],

我认为这类似于通过脚本标记添加并且没有更好的性能,但它允许我继续使用未修改的bower包并对我的所有j使用requirejs。

答案 2 :(得分:0)

Socket.io 0.x

使用socket.io 0.x,您需要在require.js配置中导出io:

shim: {   
  'socket.io-client': {    
     exports: 'io'    
   } 
}

和你的js文件:

define(['socket.io-client'], function () {
  // io is exported here    

  var socket = io.connect ...
}

Socket.io 1.x

使用socket.io 1.x,无需在require.js配置文件中导出io

和你的js文件:

define(['socket.io-client'], function (io) {
  // io an argument of the function   

  var socket = io.connect ...
}

但在这两种情况下,你必须在define中使用io对象,以便在需要时由require.js正确加载。

另请注意,您需要 socket.io-client 而不是浏览器中的 socket.io