【问题标题】:Where to locate singleton in node.js with modules?在带有模块的 node.js 中哪里可以找到单例?
【发布时间】:2018-11-20 20:11:34
【问题描述】:

关于 javascript 中的单例模式有很多问题。我找到的所有答案都推荐:

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

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

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

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

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

【问题讨论】:

  • 避免依赖 require(和 node.js 模块)作为获取单例的方式 - 这是一个错误。 它不能存储在任何随机模块中,因为那时我们依赖于 require - 为什么这是个问题?
  • 文章包含正确的事实,但结论毫无根据。 Node 的模块缓存机制区分大小写 - 文件系统不区分大小写。 模块会根据解析后的文件名进行缓存 - 这可用于好坏。

标签: javascript node.js design-patterns singleton


【解决方案1】:

Node.js 已经提供了一种生成单例的方法。 CommonJS 模块(同样适用于其他 JS 模块)在第一次导入时评估一次,因此导出的对象仍然是单例。这是平台的自然行为,可用作经验法则​​。

Node.js 模块的这种行为可以被 require 缓存修改覆盖,例如decache。一个可能的用途是测试。另一个用例是破解第三方 NPM 模块以产生单例,如果这是理想的行为,则需要分叉它。

将工厂存储在全局变量中

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

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

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

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2021-07-05
    • 2016-06-18
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多