带有模块的node.js中的单例位置在哪里?

时间:2018-11-20 20:11:34

标签: javascript node.js design-patterns singleton

关于javascript中的单例模式有很多问题。我发现的所有答案都建议:

  • IIFE,该工厂生产隐藏在封闭中的工厂。然后使用该工厂,我们可以调用getInstance()

  • 避免依赖require(和node.js模块)作为获得单例的方式。

,但是我们必须将该工厂存储在某个地方,以便其他模块可以访问它。它不能存储在任何随机模块中,因为那样我们就依赖于require。在这种情况下,似乎拥有安全单身人士的唯一方法是:

  • 将工厂存储在全局变量中或
  • 让顶级脚本管理单例实例的创建(并将其传递给其他模块)

其中一个比另一个好吗?还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

Node.js已经提供了一种产生单例的方法。 CommonJS模块(其他JS模块也是如此)在首次导入时会评估一次,因此导出的对象保持单例状态。这是平台的自然行为,可以作为经验法则。

require缓存改写可以覆盖Node.js模块的这种行为,例如decache。一种可能的用途是测试。另一个用例是入侵第三方NPM模块,以使其产生单例(如果这是理想的行为),否则需要将其分叉。

  

将工厂存储在全局变量中

通常不建议在模块化环境中使用全局变量。

  

让顶级脚本管理单例实例的创建(并将其传递给其他模块)

这是依赖项注入模式。可以在需要的地方使用它,但是如果应用程序不使用该模式的好处,则会增加开销。