javascript - 跨 Node.js 模块共享变量的更好做法是什么

标签 javascript node.js sockets

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

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

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

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

最佳答案

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

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

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

//module config.js
 
dbConfig = {
  url:'mongodb://foo',
  user: 'anakin',
  password: '*******'
}
 
module. exports = dbConfig;

我们可以轻松地与任意数量的其他模块共享此模块,并且每个模块都将获得相同的配置对象实例,因为该模块仅被评估一次,并且导出的对象缓存在其上。

//foo.js
var dbConfig1 = require('./config');
var dbConfig2 = require('./config');
var assert = require('assert');
assert(dbConfig1==dbConfi2);

因此,对于您的特定问题,您想要共享的共享状态可以驻留在由您拥有的任何模块公开的单例对象中。只需确保您的单例对象是在您的模块中公开的对象,每次您需要它时,您总是会得到一个对它的引用。

关于javascript - 跨 Node.js 模块共享变量的更好做法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24835476/

相关文章:

javascript - 为什么我的 Angular 函数在 Android 和 Windows 中有效,但在 iOS 中无效?

javascript - 无法为变量赋值 - Javascript

javascript - 使用键获取对象数组中的对象

java - 在Android Studio中发送开放声音控制(OSC),套接字错误

c# - 如何从 void 函数返回数据?

javascript - 如何根据三个键对数组对象进行分组

javascript - 你能在 HTML 标签上同时使用 async 和 defer 属性吗?

node.js - "npm install"和 "npm --userconfig=./.npmrccorp i "有什么区别

javascript - Node.js 和 Johnny-Five "document is not defined"错误

c++ - C++11 中会(并且应该)有套接字吗?