在我的命名空间中使用socket.io

时间:2012-02-12 23:06:37

标签: javascript jquery ruby-on-rails socket.io

我正在发送socket.io作为我的第三方网站代码的一部分。我不希望它污染全局命名空间(例如,不同版本的io会发生碰撞),而是让它只作为我的库的一部分工作,所以它将被命名空间并仅从

调用

MyLibrary.io

我该怎么做?

2 个答案:

答案 0 :(得分:1)

似乎建议的方法(Issue #85)是按照正常情况加载它然后运行这两行:

MyLibrary.io = window.io; // Assign it to your desired namespace
delete window.io; // Remove it from the window namespace

socket.io.js 中的代码将io变量添加到window

您可以修改socket.io.js中的代码,但由于您必须跟踪对该文件所做的更改并将其传播到较新版本的socket.io.js,因此可能会在将来难以维护。

起初,我认为你可以用module.exports做一些事情,因为它有CommonJS格式,但是,在阅读完代码之后,我意识到这只是在构建{{{}之前组织事物的方式。 1}}文件。请参阅file directory here了解我所指的内容。

答案 1 :(得分:1)

由于您可以完全控制文件,因此最简单的方法是修改文件以在新位置加载socket.io。

我要说的最简单的方法是用{/ 1>包裹dist/socket.io.js的内容

(function() {
  // All Standard SocketIO code

}).call(MyLibrary);

这会使文件加载io而不是MyLibrary。与许多库一样,SocketIO使用this来决定如何加载东西。在浏览器环境中,this是对象window,但通过将函数包装在所有内容中,您可以使用方法{{1}控制this并将其更改为您自己的值}。

许多其他库,虽然不是socketIO,但有一个帮助器来避免这个问题。通常他们有一个名为call的方法。例如,如果你想为jQuery避免这样的问题,你可以这样做:

noConflict()

这是有效的,因为当jQuery加载时,它会保存对以前加载的版本的引用,因此如果需要,它可以将全局对象设置回原来的状态。