npm安装如何工作

我使用Node.js(通过browserify )为我的每个Web应用程序,所有这些都有一些共同的依赖和其他特定于自己。 这些应用程序中的每一个都有一个package.json文件,用于指定所需模块的版本。

现在,我的应用程序的父文件夹中有一个/node_modules目录,它们都需要引用,然后我将特定于应用程序的模块放在该应用程序目录的一个node_modules文件夹中。 这在短期内工作正常,因为我的require()语句能够在文件结构中继续向上查找,直到find具有正确应用程序的node_modules目录为止。

当这个问题变得棘手的时候,我想回到一个旧的项目并运行npm install ,以确保它仍然可以find所需的所有依赖项。 (谁知道自父主目录层次以来发生了什么有趣的事情)。我的印象是npm install做到了这一点:

  • 对于package.json列出的每个模块,首先检查它是否存在, 按照相同的方式向上移动目录 。 如果不是,则将其安装到本地node_modules目录(如有必要,创build该目录)。

但是,当我在应用程序文件夹中运行npm install时,它似乎在本地安装所有内容,而不pipe上游可能存在哪些内容。 这是正确的行为? (这可能还有另一个原因,比如我的package.json糟糕的版本语言)。 如果这是正确的行为,有没有办法让我的npm install行为像上面一样?

在每个应用程序中广泛地复制模块并不是什么大不了的事情,但是感觉混乱,并且使我无法对通用模块进行小的改进,也不必更新每个旧的package.json文件。 当然,这可能是一件好事…

但是,当我在应用程序文件夹中运行npm install时,它似乎在本地安装所有内容,而不pipe上游可能存在哪些内容。 这是正确的行为? (这可能还有另一个原因,比如我的package.json中的糟糕的版本语言)。 如果这是正确的行为,有没有办法让我的npm安装行为像上面一样?

是的,那是npm install所做的。 在node.js代码中, requirealgorithm具有特定的顺序,包括遍历文件系统。 但是, npm install不这样做。 它只是安装到位。 它使用的algorithm都被限制在当前目录下的一个node_modules目录下,并且不会触及任何高于(除-g之外的)任何东西。

在每个应用程序中广泛地复制模块并不是什么大不了的事情,但是感觉混乱,并且使我无法对通用模块进行小的改进,也不必更新每个旧的package.json文件。 当然,这可能是一件好事…

是的,基本上你做错了。 常规的工作stream程适合互联网。 对于您的用例,它会创build一些额外的繁琐工作,但也可以按照预期使用语义版本化,并在您的package.json中为您的应用程序指定"mylib": "^1.0.0" ,然后自动获取更新的版本当你npm install