我正在研究nodejs模块系统的工作原理。
到目前为止,我发现了这些文献:
这有助于我理解一些问题,但仍有这些问题:
这很重要,因为我有一些场景要求我确保我有一个数据库池实例。因为我可以导出能够接收参数的模块,而不仅仅需要昂贵的资源。
非常感谢任何指导。
答案 0 :(得分:1)
Alon Salont撰写了一篇优秀的指南,了解NodeJS中的exports
(这是您在致电require()
时访问的内容):
http://bites.goodeggs.com/posts/export-this/#singleton
如果您研究模块可以导出的选项列表,您会看到问题的答案取决于模块的编写方式。当您调用require
时,NodeJS将查找其缓存中加载的模块,如果已将其加载到其他位置,则返回该模块。
这意味着如果您选择导出Singleton模式,进行猴子修补或创建全局对象(我建议仅在您的情况下使用第一个),则只会创建/将存在一个共享对象。单例模式适用于您希望由许多模块共享的数据库连接。虽然有些人认为通过父/调用者“注入”这些依赖关系更好,但这是一个不被所有人共享的哲学观点,而且单身人士被软件开发人员广泛用于这样的共享服务任务。
如果导出函数(通常是构造函数),require()
将仅返回一个共享引用。但是,在这种情况下,引用是函数,而不是函数返回的函数。 require()
实际上并没有为您调用该函数,它只是为您提供了参考。要在这里做任何实际的工作,你现在必须调用该函数,这意味着每个模块requires
这个东西都有自己的模块提供的类的实例。这种模式是更传统的模式,其中需要类实例/是目标。大多数NPM模块都适合这个类别,但这并不意味着单例在你的情况下是一个坏主意。