我正在发送socket.io作为我的第三方网站代码的一部分。我不希望它污染全局命名空间(例如,不同版本的io会发生碰撞),而是让它只作为我的库的一部分工作,所以它将被命名空间并仅从
调用 MyLibrary.io
我该怎么做?
答案 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加载时,它会保存对以前加载的版本的引用,因此如果需要,它可以将全局对象设置回原来的状态。