一、运行npm run xxx的时候发生了什么
https://juejin.cn/post/7078924628525056007
package.json文件
执行 npm run xxx 的时候,首先会去项目的 package.json 文件里找script里找对应的xxx,然后执行xxx 的命令
例如:启动vue项目npm run serve的时候,实际上就是执行了vue-cli-service serve 这条命令。
// package.json文件
{
"name": "h5",
"version": "1.0.7",
"private": true,
"scripts": {
"serve": "vue-cli-service serve"
},
}
为什么不直接执行vue-cli-service serve
因为 直接执行 vue-cli-service serve,会报错,因为操纵系统中没有存在 vue-cli-service 这条指令
我们在安装依赖的时候,通过 npm i xxx 来执行,例如 npm i @vue/cli-serve ,npm在安装这个依赖的时候,就会在 node_modules/.bin/ 目录中创建好 vue-cli-service 为名的几个可执行文件了
.bin 目录,这个目录不是任何一个npm包。目录下的文件,表示这是一个个软连接,打开文件可以看到文件顶部写着 #!/bin/sh, 表示这是一个脚本
由此知道,当使用 npm run serve 执行 vue-cli-service serve 时,虽然没有安装 vue-cli-service 的全局命令,但是npm 会到 ./node_modules/.bin 中找到 vue-cli-service文件作为脚本来执行,则相当于执行了 ./node_modules/.bin/vue-cli-service serve(最后的serve作为参数传入)
软连接文件是哪里来的呢?
可以看到,它存在项目最外层的 package-lock.json文件中
从 package-lock.json 中可知,当我们npm i 整个新建的vue项目的时候,npm 将 bin/vue-cli-service.js 作为 bin 声明了。
所以在 npm install 时,npm 读到该配置后,就将该文件软链接到 ./node_modules/.bin 目录下
为何node_modules/bin中有三个vue-cli-service文件
如果我们在 cmd 里运行的时候,windows 一般是调用了 vue-cli-service.cmd,这个文件
总结
运行 npm run xxx的时候,npm 会先在当前目录的 node_modules/.bin 查找要执行的程序,如果找到则运行;
没有找到则从全局的 node_modules/.bin 中查找,npm i -g xxx就是安装到到全局目录;
如果全局目录还是没找到,那么就从 path 环境变量中查找有没有其他同名的可执行程序。