可以依赖node.js模块状态吗?

时间:2016-01-07 17:32:22

标签: javascript node.js module npm singleton

首先,我在Node.js中没那么有经验。我对Node.js模块的理解是那些行为与Python的模块完全相同。我的意思是只执行一次代码并保持内部状态。在我阅读this article之前:

  

但你可能没有意识到(我确定没有!)如果你的项目是   基于npm模块,它们都需要“共享”模块作为   依赖,像这样:

node_modules/one/index.js:  
var shared = require('shared');     

node_modules/two/index.js:  
var shared = require('shared');
     

......而且   你用npm安装它们的依赖项,会有两个副本   “shared / index.js”挂着:

node_modules/one/node_modules/shared/index.js
node_modules/two/node_modules/shared/index.js

在阅读之后我不确定,可以依赖于模块的内部状态,因为可能在不同路径上存在一个模块,因此在缓存中有两个或更多个相同模块的实例。这意味着至少“通过本机模块机制不再有单例”。同时,我还没有在Python中听说过这样的问题。

这是否意味着几乎所有模块都必须只返回函数/构造函数(如express.js应用程序创建流程)并避免内部状态?

1 个答案:

答案 0 :(得分:1)

节点模块上的内部状态仅在从不同路径加载这些模块时才有所不同,因此它取决于您使用的NPM版本以及如何管理依赖项。

这实际上更像是一个NPM问题,因为您可能会使用它来管理您的依赖项。

NPM 2有一种更嵌套的方法来安装依赖项,这意味着您将拥有比使用NPM 3安装时更多的单个模块副本。

实施例。假设您安装了模块A和模块B,这两个模块都依赖于模块C的1.4版,您可以获得NPM 2:

+- Module A
|  |
|  + Module C v 1.4
|
+- Module B
   |
   + Module C v 1.4

这意味着模块A和B将装载完全不同版本的模块C.

如果你运行npm dedupe,那么理想化这棵树应该是:

+- Module A
|  
+- Module C v 1.4
|
+- Module B

这棵更平的树也是NPM 3试图创造的。

在我们尝试依赖共享模块的固有单实例的系统上工作时,我建议不要这样做。 NPM 2 dedupe有相当多的问题,NPM 3仍然存在一些性能问题。