跨Node.js模块共享变量的更好方法是什么?

Jim*_*nes 3 javascript sockets node.js

所以我正在用Socket.io编写一个多人游戏,大多数套接字调用都在主文件(app.js)中处理,包括存储用户名和他们连接的套接字.

但我想创建一个单独的文件(game.js)来处理所有游戏代码,包括到某些房间的套接字排放.但是要做到这一点,我需要访问我的数组,其中存储有用户/套接字(在app.js中)

所以我想知道共享变量的最佳方式是什么?我应该通过我需要的每个函数传递数组引用吗?或者我应该编写一个被调用一次的函数并创建一个全局变量(或我需要它的范围)并引用该数组?

另外如果我需要在多个文件中共享相同的依赖项,我应该在每个文件中调用require吗?

Edw*_*rzo 6

关于模块和使用全局/共享状态

模块的一个有趣方面是它们的评估方式.在第一次需要时对模块进行评估,然后对其进行高速缓存.这意味着在评估它之后,无论我们需要它多少次,我们总会得到相同的导出对象.

这意味着,尽管Node提供了一个global对象,但最好使用模块来存储共享的声明,而不是直接将它放入全局对象中.例如,以下模块公开Mongo数据库的配置.

//module config.js

dbConfig = {
  url:'mongodb://foo',
  user: 'anakin',
  password: '*******'
}

module.exports = dbConfig;
Run Code Online (Sandbox Code Playgroud)

我们可以轻松地与我们想要的其他模块共享此模块,并且每个模块都将获得配置对象的完全相同的实例,因为模块仅被评估一次并且导出的对象从那里被缓存.

//foo.js
var dbConfig1 = require('./config');
var dbConfig2 = require('./config');
var assert = require('assert');
assert(dbConfig1==dbConfi2);
Run Code Online (Sandbox Code Playgroud)

因此,对于您的特定问题,您要共享的共享状态可以驻留在由您拥有的任何模块公开的单个对象中.只需确保您的单件对象是模块中公开的对象,并且每次需要时都会始终获得一个引用.