javascript/nodejs 中的 require 是否在每次导入另一个模块时执行相同的文件?

问题描述

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) 来更新。