2016-01-07 34 views
0

首先,我在Node.js中没有那么有经验。我对Node.js模块的理解是,这些模块与Python的模块非常相似。我的意思是只执行一次代码并保持内部状态。直到我读过this article可以依赖node.js模块状态吗?

但你可能不知道,如果你的项目是 基于NPM模块都需要在“共享”模块作为 依赖,就像(我肯定没有!)这样的:

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

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

...而 安装它们的依赖与NPM,将有 “共享/ index.js” 两个副本晾一下:

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

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

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

回答

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仍然存在一些性能问题。

+0

那么,如果同一个模块同时出现两个不同状态是一个问题,那么重点就是避免模块的状态?因此,在需求期间,应该通过依赖注入来在模块之间显式地传递实例。 –

+0

@Ostrovski我尽量避免依赖注入,因为它有点魔法,可能会让人困惑。如果我需要共享状态,我尝试使用共享的状态对象或某种消息传递(事件总线或类似memcached或redis的东西) - 这样您可以更好地控制情况。 – tkone