避免重新评估和动态卸载用“require”调用的对象
Avoiding re-evaluation and dynamically unloading objects called with `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
它帮助我理解了几点,但仍然有这些问题:
- 如果我在一个模块内有一个昂贵的资源(比如说数据库池连接),我如何确保通过再次要求该模块,我不会重新评估资源
- 一旦我已经调用了一次性资源的"require",我如何动态卸载它
这很重要,因为我有一些场景要求我确保我有一个数据库池的实例。正因为如此,我导出的模块能够接收参数,而不仅仅需要昂贵的资源。
非常感谢您的指导。
Alon Salont在这里编写了一份关于理解NodeJS中的exports
的卓越指南(当你调用require()
时,你会访问它):http://bites.goodeggs.com/posts/export-this/#singleton
如果你研究模块可以导出的选项列表,你会发现问题的答案取决于模块的编写方式。当您调用require
时,NodeJS将查找加载在其缓存中的模块,如果它已经在其他地方加载了模块,则返回它。
这意味着,如果您选择导出Singleton模式、进行monkey修补或创建全局对象(在您的情况下,我建议只创建第一个),则只会创建/存在一个共享对象。Singleton模式非常适合于数据库连接等需要由多个模块共享的情况。尽管有些人认为通过父/调用方"注入"这些依赖关系更好,但这是一种并非所有人都认同的哲学观点,软件开发人员广泛使用singleton来执行此类共享服务任务。
如果导出一个函数,通常是构造函数,require()
仍然只返回一个对该函数的共享引用。然而,在这种情况下,引用是对函数的引用,而不是函数返回的内容。require()
实际上并没有为你调用函数,它只是给了你一个对它的引用。要在这里做任何实际的工作,你现在必须调用函数,这意味着requires
这个东西的每个模块都将有它自己的模块提供的任何类的实例。这种模式是更传统的模式,其中需要类实例/是目标。大多数NPM模块都属于这一类,尽管这并不意味着在您的情况下单例是个坏主意。
- 我是否可以检测到javascript正在被卸载(作为调试模式)
- 动态加载和卸载js文件
- 在页面卸载时写入HTML5 FileSystem API存储
- 如何禁用窗口.当计时器超时时,打开卸载警报
- 从jqueryajax加载php页面卸载当前页面
- 火灾在卸载前确认警报仅适用于外部站点
- 在火狐浏览器卸载之前
- 在窗口中单击按钮完成之前,光标不会停止.请继续卸载
- 卸载未触发组件WillUnmount的子级
- ReacJS与猴面包树,如何在卸载组件后释放光标
- 避免重新评估和动态卸载用“require”调用的对象
- 我可以't在Chrome中触发卸载事件
- Modernizr IE跳过“;卸载”;
- 在AngularJS中手动加载和卸载外部javascript
- 在混合基本 URL 下动态加载 require.js 模块
- 有没有一种方法可以为卸载的lazylod图像隐藏alt标签
- 从模态卸载数据
- 页面卸载期间的JavaScript事件循环
- 使用 javascript 创建的窗口在使用 window.close() 时不会在卸载之前触发
- 是否可以在卸载事件之前触发引导模式