{
"name": "h5",
"version": "1.0.7",
"private": true,
"scripts": {
"serve": "vue-cli-service serve"
},
}
问:npm run xxx的时候,发生了什么?讲的越详细越好。
答:例如启动vue项目 npm run serve的时候,实际上就是执行了vue-cli-service serve 这条命令。
问:那 为什么 不直接执行vue-cli-service serve而要执行npm run serve 呢?
答:因为 npm run serve 比较简短,比较好写。执行vue-cli-service serve,会报错,因为操作系统中没有存在vue-cli-service这一条指令
问:那既然vue-cli-service这条指令不存在操作系统中,为什么执行npm run serve的时候,也就是相当于执行了vue-cli-service serve ,为什么这样它就能成功,而且不报指令不存在的错误呢?
答:我们在安装依赖的时候,是通过npm i xxx 来执行的,例如 npm i @vue/cli-service,npm 在 安装这个依赖的时候,就会node_modules/.bin/ 目录中创建 好vue-cli-service 为名的几个可执行文件了。.bin 目录,这个目录不是任何一个 npm 包。目录下的文件,表示这是一个个软链接。npm 会到 ./node_modules/.bin 中找到 vue-cli-service 文件作为 脚本来执行,则相当于执行了 ./node_modules/.bin/vue-cli-service serve(最后的 serve 作为参数传入)。
问:你说.bin 目录下的文件表示软连接,那这个bin目录下的那些软连接文件是哪里来的呢?它又是怎么知道这条软连接是执行哪里的呢?
答:在 npm install 时,npm 读到该配置后,就将该文件软链接到 ./node_modules/.bin 目录下,而 npm 还会自动把node_modules/.bin加入$PATH,这样就可以直接作为命令运行依赖程序和开发依赖程序,不用全局安装了。假如我们在安装包时,使用 npm install -g xxx 来安装,那么会将其中的 bin 文件加入到全局,比如 create-react-app 和 vue-cli ,在全局安装后,就可以直接使用如 vue-cli projectName 这样的命令来创建项目了。
问:刚刚看到在node_modules/bin中 有三个vue-cli-service文件。为什么会有三个文件呢?
答:# unix 系默认的可执行文件,必须输入完整文件名 vue-cli-service
# windows cmd 中默认的可执行文件,当我们不添加后缀名时,自动根据 pathext 查找文件 vue-cli-service.cmd
# Windows PowerShell 中可执行文件,可以跨平台 vue-cli-service.ps1