vue|运行 npm run xxx 的时候发生了什么?

1,366 阅读3分钟

一、npm  run xxx 的时候发生了什么?

思考 💡:npm run xxx 的时候,发生了什么?讲的越详细越好

npm run xxx 的时候,首先会去项目的 package.json 文件里找 scripts 里找对应的 xxx,然后执行 xxx 的命令,例如启动 vue 项目 npm run serve 的时候,实际上就是执行了 vue-cli-service serve 这条命令。

package.json 文件

  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },

二、为什么不直接执行 vue-cli-service serve?

思考 💡:为什么不直接执行vue-cli-service serve而要执行npm run serve  呢?

因为 直接执行vue-cli-service serve,会报错,因为操作系统中没有存在vue-cli-service这一条指令

Snipaste_2022-07-19_20-22-43.png

三、为什么执行 npm run serve 的能成功?

思考 💡:为什么执行npm run serve的时候,这样它就能成功,而且不报指令不存在的错误呢?

在安装依赖的时候,是通过 npm i xxx 来执行的,例如  npm i @vue/cli-service,npm 在安装这个依赖的时候,就会node_modules/.bin/  目录中创建好vue-cli-service  为名的几个可执行文件了。

Snipaste_2022-07-19_20-26-55.png

bin 目录,这个目录不是任何一个 npm 包。目录下的文件,表示这是一个个软链接,打开文件可以看到文件顶部写着  #!/bin/sh ,表示这是一个脚本。

Snipaste_2022-07-19_20-27-55.png

当使用 npm run serve 执行 vue-cli-service serve 时,虽然没有安装 vue-cli-service的全局命令,但是 npm 会到 ./node_modules/.bin 中找到 vue-cli-service 文件作为 脚本来执行

四、.bin 目录下的那些软连接文件是哪里来的呢?

思考 💡:.bin 目录下的文件表示软连接,那这个 bin 目录下的那些软连接文件是哪里来的呢?它又是怎么知道这条软连接是执行哪里的呢?

直接在新建的 vue 项目里面搜索 vue-cli-service

Snipaste_2022-07-20_09-40-54.png

从 package-lock.json 中可知,当我们 npm i 整个新建的 vue 项目的时候,npm 将 bin/vue-cli-service.js 作为 bin 声明了

所以在 npm install 时,npm 读到该配置后,就将该文件软链接到 ./node_modules/.bin 目录下,而 npm 还会自动把 node_modules/.bin 加入$PATH,这样就可以直接作为命令运行依赖程序和开发依赖程序,不用全局安装了

假如我们在安装包时,使用  npm install -g xxx  来安装,那么会将其中的 bin 文件加入到全局

npm i 的时候,npm 就帮我们把这种软连接配置好了,其实这种软连接相当于一种映射,执行 npm run xxx 的时候,就会到 node_modules/bin 中找对应的映射文件,然后再找到相应的 js 文件来执行。

五、为什么在 node_modules/bin 中 有三个 vue-cli-service 文件?

思考 💡:刚刚看到在 node_modules/bin 中 有三个 vue-cli-service 文件。为什么会有三个文件呢?


# unix 系默认的可执行文件,必须输入完整文件名 vue-cli-service

# windows cmd 中默认的可执行文件,当我们不添加后缀名时,自动根据 pathext 查找文件 vue-cli-service.cmd

# Windows PowerShell 中可执行文件,可以跨平台 vue-cli-service.ps1

总结

1.运行 npm run xxx 的时候,npm 会先在当前目录的 node_modules/.bin 查找要执行的程序,如果找到则运行;

2.没有找到则从全局的 node_modules/.bin 中查找,npm i -g xxx 就是安装到到全局目录;

3.如果全局目录还是没找到,那么就从 path 环境变量中查找有没有其他同名的可执行程序。

未命名文件 (1).png

参考

# 三面面试官:运行 npm run xxx 的时候发生了什么?