Javascript 在我的命名空间中使用socket.io
我将socket.io作为代码的一部分提供给第三方网站使用。我不希望它污染全局名称空间(例如,不同版本的io会发生冲突),而是希望它仅作为我的库的一部分工作,因此它将被命名并仅从Javascript 在我的命名空间中使用socket.io,javascript,jquery,ruby-on-rails,socket.io,Javascript,Jquery,Ruby On Rails,Socket.io,我将socket.io作为代码的一部分提供给第三方网站使用。我不希望它污染全局名称空间(例如,不同版本的io会发生冲突),而是希望它仅作为我的库的一部分工作,因此它将被命名并仅从 MyLibrary.io 如何进行此操作?建议的方法()是按照正常方式加载,然后运行以下两行: MyLibrary.io = window.io; // Assign it to your desired namespace delete window.io; // Remove it from the window
MyLibrary.io
如何进行此操作?建议的方法()是按照正常方式加载,然后运行以下两行:
MyLibrary.io = window.io; // Assign it to your desired namespace
delete window.io; // Remove it from the window namespace
socket.io.js
中的代码只将io
变量添加到窗口中
您可以在socket.io.js
中修改代码,但这可能会使以后的维护变得困难,因为您必须跟踪对该文件所做的更改,并将其传播到较新版本的socket.io.js
起初,我认为您可以使用module.exports
,因为它有格式,但是,在阅读代码后,我意识到这只是构建socket.io.js
文件之前的组织方式。请参阅以了解我所指的内容。由于您对该文件拥有完全的控制权,因此最简单的方法是修改该文件以在新位置加载socket.io
我想说的最简单的方法是用
(function() {
// All Standard SocketIO code
}).call(MyLibrary);
这将使文件加载到io
到MyLibrary
上。与许多库一样,SocketIO使用this
来决定如何加载内容。在浏览器环境中,此
是对象窗口
,但通过围绕所有对象包装函数,您可以控制此
,并使用方法调用
将其更改为您自己的值
许多其他库(虽然不是socketIO)都有一个助手来避免这个问题。它们通常有一个名为noConflict()
的方法。例如,如果希望避免jQuery出现这样的问题,可以执行以下操作:
MyLibrary.$ = MyLibrary.jQuery = jQuery.noConflict(true);
这是因为当jQuery加载时,它会保存对先前加载版本的引用,这样,如果需要,它可以将全局对象设置回原来的状态。您可以控制如何加载这些对象吗?如果您正在将Socket.io与代码一起提供,那么为什么不更改它使用的变量以避免冲突?我想您帮助我解决了这个问题。将此作为答案发布,并获得一些分数。我在脚本的第一部分使用了MyLib.prototype.io={},然后是MyLib.prototype.io(有时需要MyLib.prototype.io.Transport)。我补充了我的答案。如果您有任何问题,请告诉我。这种方式意味着,当我加载我的socket.io版本时,要么我会使网站的版本过载,要么(更糟的是)他会使我的版本过载,并且无论哪种方式,我都会删除他使用的版本。我刚刚用MyLib.prototype.io={}更改了socket.io的源代码,正如我在上面所写的是的,这是另一种方式。但是我试图避免修改这个文件,那么JSONP“io.j”回调呢?这不要求在窗口
对象上有io
吗?我不能具体地说是socket.io
,但通常在调度JSONP调用时向窗口添加一个随机命名的函数,这与io
对象本身无关。