任何时候我尝试在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
})
答案 0 :(得分:0)
RequireJS创建一组require
和define
方法...... 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,您需要在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,无需在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