了解npm run指令
在package.json
文件中的script
字段,可以定义脚本命令,通过npm run
指令运行该脚本。
比如简单定义一个输出打印的shell
脚本。
{
"script": {
"hw": "echo hello world!"
}
}
执行npm run hw
可以看到终端上打印出了hello world!
。
我们可以在很多工程项目中的package.json
文件中看到定义了很多脚本命令,比如下面的:
{
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
}
}
那么npm
是如何启动这些脚本的呢?
执行原理
在执行npm run xxx
指令的时候会创建一个shell
,在shell
中执行对应的脚本。
shell
会将当前项目的可执行依赖目录(node_modules/.bin
)添加到环境变量path
中,当执行之后恢复原样(本地模块可以直接运行,不需要全局安装NPM
模块)。也就是说脚本命令中的依赖名会直接找到node_modules/.bin
下面的对应脚本,而不需要加上路径。
而在.bin
目录下,一般针对一个依赖模块,会有3个可执行文件,没有后缀名的是对应Unix
系的shell
脚本,.cmd
为后缀名的是windows bat
脚本,.ps1
为后缀名的则是PowerShell
中可执行文件(可以跨平台),三者作用都是用node
执行一个js
文件。
比如说在项目中安装了webpack
依赖,由于webpack
依赖库中定义了bin
,在安装后就会在项目的node_modules/.bin
目录中简历一个软连接到webpack
依赖中。
打开webpack
看看那个文件里有啥:
前面提到,脚本命令中的依赖名会直接找到node_modules/.bin
,在上图中可以看到这个软连接其实就是指向了node_modules/webpack
中的bin
目录。
可以直接写成如下:
"scripts": {"build": "webpack"}
而不需要写成
"scripts": {"build": "node_modules/.bin/webpack"}
在webpack
中的package.json
定义了一个bin
字段指向node
可执行的文件(bin/webpack.js
)