npx 使用简介 — 方便地调用 npm 包命令

npx 是一个在安装 npm 时,默认被安装的 npm 包。它的作用就是让用户更加方便地调用 npm 包的命令。

举个简单的例子,一般在项目中会使用 eslint 来规范 js 代码,如果我们在项目中目录中执行 npm install eslint -D,来安装 eslint,而不是全局安装,那么如果想要使用 eslint 命令来对某些文件校验时,就需要指定 eslint 的路径,如:./node_modules/eslint/bin/eslint.js ...或者./node_modules/.bin/eslint ... 。这样的写法太不友好了,而如果使用 npx,则只需这样 npx eslint ...

上面的这个例子,其实是 npx 的核心功能。接下来,我们系统地梳理一下 npx 如何使用。

执行命令

npx <command>[@version] [command-arg]...

npx 后面跟命令 ,这个命令会从系统环境变量和本地 node_modules/.bin 中寻找,如果找到此命令,那么就执行命令,如果没找到,会从远程 npm 仓库中下载此命令相关的包,再执行。当然如果远程仓库没有,那么就会报 404 error。所以 npx 的功能本质就是在 shell 中执行命令,只不过,如果在系统中没发现此命令的话,会从安装的 npm 包中寻找,如果找到,就会执行命令,如果本地没找到,就到远程 npm 仓库寻找,找到的话,就下载相关包后执行命令。

npx 命令还可设置一些可选参数:

  • -p, --package

    指定安装对应的包,可以设置多个。如果使用的命令和包名不一致,或者该命令是在指定的包中,那么可以设置此参数。设置此参数后,npx 不会考虑本地是否能查到该命令,而是直接从远程下载指定的包的最新版本,然后运行命令。

  • --ignore-existing

    忽略本地是否存在可执行的命令。和设置 -p 后的效果一样。

  • --no-install

    不会从远程安装包来执行命令。如果在本地没有找到可执行的命令,就直接报错,不会去远程找。

  • -c

    执行指定字符串脚本。这里的字符串会在 npm run-script 中执行。在这个字符串中,如果在本地不能找到对应命令,则需要使用 -p 来指定对应的包。
    例如: npx -p nyc -p mochapack -c "nyc mochapack"

  • --shell

    指定在哪种 shell 环境下执行命令。如:npx --shell zsh webpack

  • -q, --quiet

    不显示 npx 的输出信息

  • -n, --node-arg

    指定 node 参数。如果命令执行的是 node 脚本,可以设置 node 参数。如:npx --node-arg=--inspect cowsay

  • --shell-auto-fallback

    生成覆盖 shell 的"command not found"的脚本。个人认为这是一个比较好的特性。它可以指定,在 shell 环境下,如果命令找不到,就自动使用 npx 去执行。这就不用我们每次都要用 npx 去执行命令。如:

    $ npm@4 --version
    (stderr) npm@4 not found. Trying with npx...
    4.6.1
    

    这个例子中,没有找到 npm@4 命令,就使用 npx npm@4 --version 执行,最终输出了结果 4.6.1,而不是 command not found。
    如果想要永久生效,那么把生成的脚本写到对应 shell 的配置文件中,这样每次打开终端,就会执行生效。

    运行 npx --shell-auto-fallback zsh,会生成可在 zsh 环境下可运行的脚本:

    command_not_found_handler() {
      # Do not run within a pipe
      if test ! -t 1; then
        >&2 echo "command not found: $1"
        return 127
      fi
      if which npx > /dev/null; then
        echo "$1 not found. Trying with npx..." >&2
      else
        return 127
      fi
      if ! [[ $1 =~ @ ]]; then
        npx --no-install "$@"
      else
        npx "$@"
      fi
      return $?
    }
    

    这段脚本的首先用 test ! -t 1 对在管道中使用的命令直接报 “command not found”;对存在 npx 的环境,如果命令中不包含 @,则运行 npx --no-install ,即不会从远程下载;如果包含 @ ,则会执行npx ,会从远程下载包。

  • --cache

    指定安装包的缓存路径。默认是 npm 设置的缓存路径。

  • --userconfig

    指定 npm 的 userconfig 文件路径。默认是 npm 当前指定的 userconfig 文件路径。

  • -v, --version

    获取 npx 的版本。

总结

这些大致就是 npx 的全部内容,最常用的还是 npx 这样直接使用,根据需求,-p 应该也是会常使用到的,另外在 shell 的配置文件中加上npx --shell-auto-fallback 生成的脚本,就可以不用每次都输入 npx,也是很好的一个体验。总之,这个工具还是非常好用的。

你可能感兴趣的:(工具)