某天有个开发者找到我,说安装我们提供的模块后,目录下找不到,调查了一下,当他在当前目录创建一个package.json文件后,可以看到模块被安装到当前目录,为了弄清楚其中规律,做了以下实验:
- 父子目录均无
package.json
,在子目录下执行nom i moment —save
,moment
安装在子目录下,并在子目录下生成node_modules
以及package-lock.json
文件,但不生成package.json
- 在子目录提前生成
package.json
,效果同一,模块被安装到子目录下 - 父目录包含
node_modules
目录或package.json
文件,在子目录下执行安装,moment
会被安装到父级目录下 - 无论父目录包含
package.json
文件还是node_modules
目录,只要子目录下存在package.json
文件或node_modules
目录,子目录下执行安装,moment
会被安装到子目录下。在父级目录安装时,也会在父级目录下安装该模块,即父子目录都会包含node_modules/moment
总结:
- 执行
npm i xxx
安装某个模块时,如果当前目录包含package.json
或node_modules
,则会将模块安装到当前目录,若不存在,会从当前目录开始,向父级目录依次查找,直到找到包含package.json
或node_modules
的目录,模块会被安装在该目录下。如果到根目录依然没有找到包含package.json
或node_modules
的目录,则当前模块会被安装到当前目录下。 - 当父子目录均包含
node_modules
目录或package.json
文件时,安装相同模块(即使版本相同),会在父子目录下各安装一个
根据以上说明,可以猜测该开发者应该是当前目录下没有package.json
或node_modules
目录,但是某个父目录包含,所以安装我们的模块时,该模块被安装到了那个父级目录下,所以当前目录下找不到