【问题标题】:How does Node.JS handle duplicate transitive dependencies?Node.JS 如何处理重复的传递依赖?
【发布时间】:2015-03-26 02:47:02
【问题描述】:

如果我的问题很幼稚,我深表歉意。总的来说,我对 Node.JS 和 JavaScript 比较陌生。我希望有人可以阐明 Node.JS 如何处理重复的,可能是传递的,依赖关系?甚至不是全局命名空间或任何类型的冲突,或同一模块的不同版本(例如,您的应用程序中其他地方的 v0.1 与 v0.2),但更多的是尽可能智能和高效。例如:

  • 是否有可能 Node 在占用空间方面足够聪明,以至于模块文件夹中没有相同版本的库的多个副本?类似于每个所需版本的 1 个副本,带有符号链接,或者类似的东西指向依赖于该模块版本的每个模块的此代码?
  • 在运行时将重复的模块加载到内存中会怎样?如果模块 x 的 v0.1 已经加载到内存中,如果出现了需要该模块相同版本的其他依赖模块,代码是否会重新加载到内存中,或者 Node 是否足够聪明,可以看到该代码是已经加载并重新使用它? Node 在这方面的沙盒化程度如何?

谢谢!

【问题讨论】:

  • 一般情况下,为了避免版本冲突,使用单独的副本。

标签: javascript node.js node-modules


【解决方案1】:

Node.js 没有版本的概念。 require() 函数将其参数解析为 .js 文件的完整路径,并按文件名缓存它们。

您可能会问 npm 如何安装模块;这取决于您安装它们的顺序。

您可以在这里运行npm dedup 做一些好事。

【讨论】:

  • 那么,我是否理解正确,我可以预期我的直接依赖项每个都有自己的路径到它们传递需要的每个模块,这就是将要加载的版本?我是否了解重复数据删除对此无济于事?
  • npm dedup 将删除重复项,只要版本兼容。它们是否首先被创建取决于安装顺序。
  • 这是否意味着“npm install”正在做它的事情,如果您的一个依赖项对安装已经运行的某些东西有嵌套依赖项,那么该模块的任何 require 语句将指向一个已经安装的?如果有重复,那么重复数据删除基本上会做同样的事情?
  • 如果兼容版本已经在搜索路径中,npm install 将不会安装模块。见nodejs.org/api/…
  • 这对我来说更有意义。我会继续阅读和消化。谢谢你的帮助。
猜你喜欢
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多