当在JavaScript/Node.js中需要一个文件时,每次导入它时都会执行相同的文件吗?

4

require()在JavaScript/Node.js中每次被导入到其他模块时,是否执行相同的文件?

如果是,我该如何在一个JS文件中拥有一个数组并从另一个JS文件中添加/更新值呢? 例如,我有一个文件中的数组,并且我从多个文件中更新该数组,我希望它们都只与更新后的数组进行交互。我该如何实现这一点?


1
require() 只运行一次文件,然后使用缓存的导出。不确定您问题的其余部分在问什么,或者是否仍然适用。 - Jacob G
1个回答

7

模块被缓存,如果再次加载它们,将加载缓存副本。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接