关于 运行npm run xxx

npm run命令会根据package.json中的scripts字段执行相应命令。它避免了直接执行未在操作系统中注册的指令(如vue-cli-service)导致的错误。npm在安装依赖时,会在node_modules/.bin目录下创建软链接,使得npm run可以找到并执行这些文件。bin目录下的文件是npm安装依赖时根据package-lock.json中的bin配置创建的软链接,指向实际的js文件。在Windows上,通常是.vue-cli-service.cmd批处理脚本。npm run首先查找当前目录,接着查找全局目录,最后查看PATH环境变量。
摘要由CSDN通过智能技术生成

关于 运行npm run xxx

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

/* package.json */ 
"name": "vue-admin",
"version": "1.0.0",
"author": "Lizhen",
"scripts": {
    "dev": "vue-cli-service serve",
    "build:prod": "vue-cli-service build"
},
  • 那为什么不直接执行vue-cli-service 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包。目录下的文件,表示这是一个个软链接,打开文件可以看到文件顶部写着 #!/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 作为参数传入)

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

可以直接在从package-lock.json里面搜索vue-cli-service

在这里插入图片描述

当我们 npm i 整个新建的项目的时候,npm 将 bin/vue-cli-service.js 作为 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 这样的命令来创建项目了。

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

  • 在node_modules/bin中 有三个vue-cli-service文件,为什么会有三个文件呢?

在这里插入图片描述

在 cmd 里运行的时候,windows 一般是调用了 vue-cli-service.cmd,这个文件,这是 windows 下的批处理脚本

@ECHO off
SETLOCAL
CALL :find_dp0

IF EXIST "%dp0%\node.exe" (
  SET "_prog=%dp0%\node.exe"
) ELSE (
  SET "_prog=node"
  SET PATHEXT=%PATHEXT:;.JS;=;%
)

"%_prog%"  "%dp0%\..\@vue\cli-service\bin\vue-cli-service.js" %*
ENDLOCAL
EXIT /b %errorlevel%
:find_dp0
SET dp0=%~dp0
EXIT /b

所以当我们运行vue-cli-service serve这条命令的时候,就相当于运行 node_modules/.bin/vue-cli-service.cmd serve,然后这个脚本会使用 node 去运行 vue-cli-service.js这个 js 文件。

由于 node 中可以使用一系列系统相关的 api ,所以在这个 js 中可以做很多事情,例如读取并分析运行这条命令的目录下的文件,根据模板生成文件等。

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

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

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

小结一下:

运行 npm run xxx的时候,npm 会先在当前目录的 node_modules/.bin 查找要执行的程序,如果找到则运行;
没有找到则从全局的 node_modules/.bin 中查找,npm i -g xxx就是安装到到全局目录
如果全局目录还是没找到,那么就从 path 环境变量中查找有没有其他同名的可执行程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值