避免重新评估和dynamic卸载用`require`调用的对象
我正在研究nodejs模块系统是如何工作的。
迄今为止我发现了这些文献:
- https://nodejs.org/api/modules.html
- http://fredkschott.com/post/2014/06/require-and-the-module-system/
- 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模块都适合这个类别,但这并不意味着单例对您来说不是个好主意。