Javascript 跨Node.js模块共享变量的更好做法是什么
所以我正在用Socket.io编写一个多人游戏,大多数Socket调用都在主文件(app.js)中处理,包括存储用户名和它们连接的套接字 但我想创建一个单独的文件(game.js),处理所有游戏代码,包括特定房间的插座发射。然而,要做到这一点,我需要使用存储在其中的用户/套接字访问我的阵列(在app.js中) 所以我想知道共享变量的最佳方式是什么?我应该将数组引用传递给我需要的每个函数吗? 或者我应该编写一个只调用一次的函数,并创建一个全局变量(或我需要它的范围),并引用数组Javascript 跨Node.js模块共享变量的更好做法是什么,javascript,node.js,sockets,Javascript,Node.js,Sockets,所以我正在用Socket.io编写一个多人游戏,大多数Socket调用都在主文件(app.js)中处理,包括存储用户名和它们连接的套接字 但我想创建一个单独的文件(game.js),处理所有游戏代码,包括特定房间的插座发射。然而,要做到这一点,我需要使用存储在其中的用户/套接字访问我的阵列(在app.js中) 所以我想知道共享变量的最佳方式是什么?我应该将数组引用传递给我需要的每个函数吗? 或者我应该编写一个只调用一次的函数,并创建一个全局变量(或我需要它的范围),并引用数组 此外,如果我需要在
此外,如果我需要在多个文件之间共享相同的依赖关系,我是否应该在每个文件中调用require?关于模块和使用全局/共享状态 模块的一个有趣方面是它们的评估方式。模块在第一次需要时进行评估,然后缓存。这意味着,在对其进行求值之后,无论我们需要它多少次,我们都会得到相同的导出对象 这意味着,尽管节点提供了一个
全局
对象,但最好使用模块来存储共享语句,而不是直接将其放入全局对象中。例如,以下模块公开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);
因此,对于您的特定问题,您想要共享的共享状态可以驻留在由您拥有的任何模块公开的单例对象中。只需确保你的单点对象是在你的模块中被曝光的对象,并且每次你需要它时都会得到它的引用。 < P>如果你是指“变量”,你指的是对套接字的引用——你可能想考虑把一个回调或模块传递给GAME.JS来处理发射——但是GAME.JS在必要的时候调用。p> 就像Edwin Dalorzo提到的那样,为所有变量创建一个单独的文件似乎是最好的 我有一个类似的问题已经有几个小时了,因为我不知道变量是持久的。我的情况是: 我有两个文件
cli.ts
和main lib.ts
cli.ts
读取用户输入,并根据输入运行main lib.ts
中的函数。当main lib.ts
正忙于验证输入时,cli.ts
使用测试通过时main lib.ts
生成的一些全局变量。唯一的限制是我不能将main lib.ts
代码与cli.ts
混合使用,我只能共享函数callValidateFunction
我最初想到的问题是:如果我要创建一个global vars.ts
文件,那么每次调用require
(即调用setVar(…)
只会更改导入的变量值)
然而,由于Edwin的回答,我成功地实现了一个桥接:
// cli.ts
import { setVar, getVar } from "./var-bridge";
import { callValidateFunction } from "./main-lib";
function run(args: string[]): void {
// ...
if (arg == "--email") {
// Set the test status.
setVar("testStatus", "pending");
// Validate the input email address.
callValidateFunction("validateEmail", nextArg());
// Get the testStatus.
const testStatus: string = getVar("testStatus");
}
// ...
}
我应该在每一个函数中调用require吗->如果你很懒,你可以使用一个带有“npm fs”的函数,谢谢,这太完美了!我想我真的不知道require的工作方式!只是等待计时器结束
// main-lib.ts
import { setVar, getVar } from "./var-bridge";
const funcs: {name: string, func: (arg: string) => boolean} = {};
funcs.validateEmail = function(arg: string): boolean {
let passed: boolean = false;
// ...
return passed;
};
function callValidateFunction(functionName: string, arg: string): void {
// ...
const passed = funcs[functionName](arg);
if (passed) setVar("testStatus", "passed");
}
// ...
// var-bridge.ts
const variables: {name: string, value: any} = {
"testStatus": "",
// ...
};
function setVar(varName: string, varValue: any): void {
variables[varName] = varValue;
}
function getVar(varName: string): any {
return variables[varName];
}
export { setVar, getVar };