首先,我在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
应用程序创建流程)并避免内部状态?
答案 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仍然存在一些性能问题。