b: 首先会去项目的package.json文件里找scripts,找到对应的XXX,然后执行。
b: 比如启动vue项目npm run serve的时候,实际上就是执行了vue-cli-service这条命令。
a:直接执行vue-cli-service不香嘛?
b:vue-cli-service不是一条指令,操作系统不存在这条指令
a:那既然vue-cli-service
这条指令不存在操作系统中,为什么执行npm run serve
的时候,也就是相当于执行了vue-cli-service serve
,为什么这样它就能成功,而且不报指令不存在的错误呢?
b:因为我们在安装依赖的时候,是通过npm i XXX来执行的,例如npm i @vue/cli-service,npm在安装这个依赖的时候,就会在node_modules/.bin/目录中创建好vue-cli-service为名的几个可执行文件了
b: .bin 目录,这个目录不是任何一个 npm 包。目录下的文件,表示这是一个个软链接,打开文件可以看到文件顶部写着 #!/bin/sh
,表示这是一个脚本。
b: 由此我们可以知道,当使用 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 作为参数传入)。
a: 可以啊,真不错,但是我还想继续问问,你说.bin 目录下的文件表示软连接,那这个bin目录下的那些软连接文件是哪里来的呢?它又是怎么知道这条软连接是执行哪里的呢?
b: 存在项目最外层的package-lock.json文件中