【问题标题】:Is module.export = [] bad practice?module.export = [] 是不好的做法吗?
【发布时间】:2015-05-03 09:21:51
【问题描述】:

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

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 使用的标准机制。它有什么问题?
  • 我更新了我的问题。基本上,为此制作一个或多或少为空的文件和模块感觉很奇怪。我从未见过其他人这样做。
  • 我以前做过,以避免循环依赖。请务必清楚地命名您的模块和/或发表评论,说明它用于什么数据,也许还有一些数据消费/生产模块的示例。
  • 这样做没有错。
  • 好的,谢谢。我只想再次指出,该文件只不过是module.exports = []。这不仅仅是这里的例子。我认为这让我三思而后行,也许它甚至不应该是一个单独的模块,因为它不包含任何初始数据。

标签: javascript node.js


【解决方案1】:

这不是一个坏习惯。它只是在模块之间共享数据的几个选项之一。以你的方式做这件事并没有什么“错误”。


在 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 
}

【讨论】:

    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多