如何为每个实例获取单独的"global"模块?



是否可能获得个人"全局";每个实例的模块?

import MyModule from './index.js';
const first = new MyModule();
const second = new MyModule();
// PLEASE SEE EXAMPLE BELOW FOR LOGS
// expect to log for both:
// 1. "in entry: true"
// 2. "in init: true"
// but second module logs:
// 1. "in entry: false"
// 2. "in init: false"

此处的问题是两者共享globals和1。实例将属性更改为false

在每个实例的单个globals模块中,我有哪些选项?

PS我有成千上万行的遗留代码。如果我不需要更改/删除/重构globals.js内容,也不需要这些导入import globals from './globals.js';,那会好100倍。尽管如此,说出你所有的想法——我需要解决它,即使我需要改变很多。


上述示例代码/最小可重复示例

index.js

import globals from './globals.js';
import init from './init.js';
export default function MyModule (conf) {
console.log('in entry:', globals.state1);
init();
}

globals.js

export default {
state1: true,
};

init.js

import globals from './globals.js';
export default function init () {
console.log('in init:', globals.state1);
globals.entry1 = false;
}

由于对象是通过引用传递的,因此每次使用globals时都需要创建一个副本。

一个好的方法是导出一个函数,如:

/* globals.js */
const globals = { // Maybe wrap the object in Object.freeze() to prevent side effects
state1: true,
};
export default () => ({ ...globals });

然后,您可以在每次需要时调用该函数来创建一个副本。

/* init.js */
import getGlobals from './globals.js';
export default function init () {
const globals = getGlobals();
console.log('in init:', globals.state1);
globals.entry1 = false;
}

最新更新