npm run 了个啥?

658 阅读1分钟

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 rumnpm urnnpm start 雷同 npm run start,但有不同回避机制)

2 系统执行

脚本命令在PATH中搜索不到,则会试图在命令前加上node_modules/.bin路径再次进行寻找执行文件,并执行(window用cmd.exe执行,linux用/bin/sh,可通过--script-shell配置)

可以看到node_modules/.bin/webpack-dev-server文件

image.png

在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