避免重新评估和dynamic卸载用`require`调用的对象

我正在研究nodejs模块系统是如何工作的。

迄今为止我发现了这些文献:

  1. https://nodejs.org/api/modules.html
  2. http://fredkschott.com/post/2014/06/require-and-the-module-system/
  3. http://www.bennadel.com/blog/2169-where-does-node-js-and-require-look-for-modules.htm

这有助于我理解几点,但仍然有这些问题:

  • 如果我有一个昂贵的资源(假设数据库池连接)在一个模块内,我怎么能确保通过再次要求模块我不重新评估资源?
  • 我如何dynamic卸载一次性资源,一旦我已经调用了“要求”呢?

这很重要,因为我有一些场景要求我确保拥有一个数据库池实例。 因为这个我出口模块,能够接收参数,而不是只需要昂贵的资源。

任何指导,非常感激。

Alon Salont编写了一本了解NodeJS导出的优秀指南(这就是你在调用require()时访问的内容): http : //bites.goodeggs.com/posts/export-this/#singleton

如果研究模块可以导出的选项列表,则会看到问题的答案取决于模块的写入方式。 当你调用require ,NodeJS会查找加载到caching中的模块,如果它已经加载到其他地方,就返回它。

这意味着如果你select导出单例模式,猴子补丁或者创build全局对象(我只推荐你的第一个对象),那么只有一个共享对象将被创build/存在。 单例模式适用于像许多模块共享的数据库连接。 尽pipe有些人认为通过父母/调用者“注入”这些依赖关系更好,但这是一个不被所有人共享的哲学观点,单身人士被软件开发者广泛用于这样的共享服务任务。

如果你导出一个函数,通常是一个构造函数, require()将只返回一个共享引用。 但是,在这种情况下,引用是函数,而不是函数返回的内容。 require()实际上并没有为你调用函数,它只是给你一个参考。 为了在这里做任何真正的工作,你现在必须调用这个函数,这意味着每个requires这个东西的模块都将拥有它自己的模块提供的任何类的实例。 这种模式是比较传统的,希望实现类实例/是目标。 大多数NPM模块都适合这个类别,但这并不意味着单例对您来说不是个好主意。