gpt4 book ai didi

javascript - 如何避免 Node 需要两次加载相同的模块

转载 作者:搜寻专家 更新时间:2023-10-31 22:48:41 25 4
gpt4 key购买 nike

我正在开发一个 Node 模块 my-module,它又依赖于另一个模块 other-moduleother-module 因此是我模块的 package.json 中明确列出的依赖项。

由于我的模块只是通过 required 修改了 other-module 的行为,因此仅加载 other-module 很重要一次又一次,这个唯一的“实例”是在任何需要 myother 的应用程序中引用的实例。

根据 Node 的模块缓存策略,我预计这会成立,但我在编写一个简单的测试应用程序时遇到的是:

如果 my-modulenpm installed before other-module 那么后者作为前者的依赖。 npm installing other-module 之后第二次将其带入 node_modules 层次结构。然后,当我的模块需要 other-module 时, Node 会加载我模块的“本地”副本,当应用程序需要时, Node 会再次加载它,(这次是由于第二个 npm install 而安装的版本)。这显然不是预期的结果。

如果 my-modulenpm installed after other-module 那么我最终得到 node_modules 中只有一份 other-module 副本,我的测试应用程序按预期工作。

这种行为让我再次查看 Node 的相关政策,果然我遇到了“模块缓存警告”:

Modules are cached based on their resolved filename. Since modules may resolve to a different filename based on the location of the calling module (loading from node_modules folders), it is not a guarantee that require('foo') will always return the exact same object, if it would resolve to different files.

此时看起来我的模块可能会或可能不会按预期运行,具体取决于 npm install 的顺序。

我是否缺少任何最佳实践?有没有办法在不改变我的模块工作方式的情况下避免这种困惑?

最佳答案

简短的回答:你不能。

正如您指出的那样, Node 将从最本地的位置加载所需的模块。据我所知,这是包管理器所独有的,它使您不必关心模块的确切依赖关系树。 Node 和 npm 会为你解决这个问题。在我看来,这是一件非常好的事情。

通过让您的模块有机会要求他们需要的确切版本,可以简单地避免依赖 hell 。

我认为除非我不完全理解你的问题,否则你正在尝试做的不是好的 Node 实践。加载模块并将其分配给局部变量。应该避免全局状态,因为这会导致相当尴尬和不可测试的代码。此外,如果您成功地将修改后的模块注入(inject)到其他人的代码中,则无法保证他们的代码仍然有效。这就像在旧的 Prototype.js_ 时代一样,那时可以使用 JavaScript 的内置全局变量,如 StringArray ,这导致了一些灾难性的代码。

但是请记住,这篇文章只是一个人的意见。如果您在这里找不到更多答案,请将您的问题发布到其他地方,例如该 Node 的 IRC channel 。

关于javascript - 如何避免 Node 需要两次加载相同的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13906933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com