module.export = [] 是一种不好的做法吗?

5
我有两个模块,它们都需要访问一个共享数组。我通过创建一个仅包含以下内容的模块来解决这个问题:

sharedArray.js

module.exports = [];

在我使用的模块中,我是这样使用它的:
module1.js
var arr = require('./sharedArray');

function addSomething() {
    // Add something to arr 
}

module2.js

var arr = require('./sharedArray');

function doSomething() {
    // Use arr for something
}

这种方法虽然可行,但感觉不太对(无用的空模块),而且我可能忽略了一些显而易见的东西。

有没有更好的方法来解决这个问题,或者说这确实是解决它的方法?


这只是Node.js使用的标准机制,有什么问题吗? - beautifulcoder
我更新了我的问题。基本上,为此而创建一个几乎为空的文件和模块感觉很奇怪。我从未见过其他人这样做。 - user1767586
我以前做过这个,以避免循环依赖。只需确保清晰地命名您的模块和/或留下注释,解释它所用的数据以及一些消耗/生产数据模块的示例即可。 - ekuusela
这种方式做没有任何问题。 - Miguel Mota
好的,谢谢。我想再次指出,这个文件只是 module.exports = []。它不仅仅是为了这个例子而存在。我认为这让我对它产生了疑问,也许它甚至不应该成为一个独立的模块,因为它没有包含任何初始数据。 - user1767586
1个回答

6

这并不是一个坏的实践。这只是在模块之间共享数据的几个选项之一。你现在这样做没有什么“错误”。


在node.js中,在模块之间共享数据时,基本上有三种选择:

  1. 当加载时将数据分配给全局命名空间的一个模块。

  2. 某个模块的方法返回对数据的引用。该方法可以是模块构造函数或其他方法。

  3. 使数据成为静态数据结构的一部分,该结构位于模块导出中。这本质上就是你现在所做的,你只需使整个导出成为数组即可。

这三种方式都是完全合法的共享数据方式。

全局数据具有使用全局变量的典型缺点(影响全局命名空间,并可能与根本不尝试使用此特定数据的模块发生冲突)。

如果您还要执行许多其他操作或者在需要时生成数据而不是静态声明数据,则可以使用第二种选项。

对于第三个选项,如果您使模块返回对象,并且让数组成为该对象中的一个属性,则可以使模块更具可扩展性,因为您还可以在该模块中拥有其他共享元素。但是,它按照您目前的方式运作,只是不太具有可扩展性。


个人而言,我可能会选择更具可扩展性的选项,这样您就可以在其中放置其他共享项:

sharedData.js

module.exports = {
    myData: [...],
    myOtherData: [...]
};

module1.js

var arr = require('./sharedData').myData;

function addSomething() {
    // Add something to arr 
}

module2.js

var arr = require('./sharedData').myData;

function addSomething() {
    // Add something to arr 
}

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