1. 比如在我的应用中要依赖 mongoose 软件包,于是我下载了它,但是在 node_modules 文件夹中除了包含 mongoose 以外还多出了很多其他软件包,为什么会多出这么多软件包呢?实际上它们又是 mongoose 依赖的软件包。 2. 为什么 mongoose 依赖的软件包不放在 mongoose 文件夹中呢? 在早期的 npm 版本中, 某个软件包依赖的其他软件包都会被放置在该软件包内部的 node_modules 文件夹中,但是这样做存在两个问题,第一个问题是很多软件包都会有相同的依赖,导致开发者在一个项目中会下载很多重复的软件包,比如 A 依赖 XB 依赖 XC 依赖 X,在这种情况下 X 就会被重复下载三次。第二个问题是文件夹嵌套层次太深,导致文件夹在 windows系统中不能被直接删除。比如 A 依赖 B, B 依赖 C, C 依赖 D … , 就会发生文件夹依次嵌套的情况。 3. 所有的软件包都放置在 node_modules 文件夹中不会导致软件包的版本冲突吗?

    在目前的 npm 版本中,所有的软件包都会被直接放置在应用根目录的 node_modules 文件夹中,这样虽然解决了文件夹嵌套层次过深和重复下载软件包的问题,但如果只这样做肯定会导致软件包版本冲突的问题,如何解决呢?

    比如 A 依赖 X 1 版本,B 依赖 X 2 版本,如果你先下载的是 A,那么 A 依赖的 X 会被放置在根目录的 node_modules 文件夹中, 当下载 B 时,由于在根目录中已经存在 X 并且版本不一致,那么 B 依赖的 X 就会被放置在 B 软件包中的 node_module 文件夹中,通过此方式解决软件包版本冲突的问题。 4. node_modules 文件夹中的软件包都需要提交到 git 仓库中吗? node_modules 文件夹中有很多软件包,随着应用程序的增长,软件包也会越来越多,甚至会达到几百兆。 当我们将应用提交到版本库时,我们不想提交它,因为它们不是我们应用中的源代码,而且由于碎文件比较多,其他人在检出代码时需要等待的时间会很久。当其他人拿到应用程序时没有依赖软件包应用程序是运行不起来的,如何解决呢? 实际上应用程序依赖了哪些软件包在 package.json 文件中都会有记录,其他人可以通过 npm install 命令重新下载它们为了保持下载版本一致,npm 还会根据 package-lock.json 文件中的记录的地址进行下载 将应用程序提交到版本库之前,将 node_modules 文件夹添加到 .gitignore 文件中。 git init git status echo “node_modules/“ > .gitignore git status git add . git commit -m “our first commit”