问题描述
JavaScript/Node.js 中的 require()
是否每次导入其他模块时都会执行同一个文件?
如果是,如何在一个文件中包含一个数组并从另一个 JS 文件中附加/更新其中的值? 例如,我在一个文件中有一个数组,我正在从多个文件更新数组,我希望所有文件都只与更新后的数组交互。我怎样才能做到这一点?
解决方法
模块被缓存,如果你再次加载它们,缓存副本被加载。
https://nodejs.org/api/modules.html#modules_require_cache
模块在需要时缓存在这个对象中。通过删除 这个对象的一个键值,下一个 require 将重新加载模块。 这不适用于本机插件,因此会导致重新加载 错误。
也可以添加或替换条目。这个缓存被检查 在本机模块之前,如果添加了与本机模块匹配的名称 到缓存,没有 require 调用将接收本机模块 了。小心使用!
您可以使用https://www.npmjs.com/package/clear-module
const clearModule = require('clear-module');
const myArray = clearModule('./myArray'); // but you need load this everytime to get fresh copy of that array
相反,您可以从模块中公开一个函数来读取数组值,因此它始终会获取一个新值。
myArray.js
const myArray = [1];
const get = () => {
return myArray;
};
const update = (data) => {
myArray.push(data);
};
exports.get = get;
exports.update = update;
index.js
const myArray = require('./myArray');
console.log(myArray.get()); // [1]
console.log(myArray.update(2)); // update the value
console.log(myArray.get()); // [1,2]
所以现在总是使用 myArray.get()
来读取值并使用 myArray.update(data)
来更新。