npm run what
0 脚本
package.json中有这么一条脚本
"scripts": {
"dev": "webpack-dev-server"
}
1 run
我们开发时运行npm run dev
,用到了npm run <command>
npm run
(执行scripts中命令,内置有env命令), 完整为npm run-script
别名有npm rum
、npm urn
(npm start
雷同npm run start
,但有不同回避机制)
2 系统执行
脚本命令在PATH
中搜索不到,则会试图在命令前加上node_modules/.bin
路径再次进行寻找执行文件,并执行(window用cmd.exe
执行,linux用/bin/sh
,可通过--script-shell配置)
可以看到node_modules/.bin/webpack-dev-server文件
在linux中直接就执行无后缀的webpack-dev-server
可执行文件,而在window中无后缀及iu不可执行,且默认执行顺序为PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
,所以会执行webpack-dev-server.cmd
3 执行内容
# 文件说明:node_modules/.bin/webpack-dev-server
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../webpack-dev-server/bin/webpack-dev-server.js" "$@"
else
exec node "$basedir/../webpack-dev-server/bin/webpack-dev-server.js" "$@"
fi
:: 文件说明:node_modules/.bin/webpack-dev-server.cmd
@ECHO off
GOTO start
:find_dp0
SET dp0=%~dp0
EXIT /b
:start
SETLOCAL
CALL :find_dp0
IF EXIST "%dp0%\node.exe" (
SET "_prog=%dp0%\node.exe"
) ELSE (
SET "_prog=node"
SET PATHEXT=%PATHEXT:;.JS;=;%
)
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\webpack-dev-server\bin\webpack-dev-server.js" %*
两个文件(应该)只有语言区别,执行意义相同。所以读懂sh脚本就好。
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
# 获取目录名称
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
# 判断系统名称做目录兼容
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../webpack-dev-server/bin/webpack-dev-server.js" "$@"
else
exec node "$basedir/../webpack-dev-server/bin/webpack-dev-server.js" "$@"
fi
# node命令执行指定文件并传入参数
4 文件由来
现在,文件从那来?npm
自动生成,参考官文。只要模块package.json中配置了bin
,就会在安装时自动生成。这个文件相当于一个模块中可执行文件的Link
。