认识NPX

简介

  1. 在npmv5.2.0版本被引入(大约在2017年年中),成为npm的伴生命令
  2. 可以执行依赖包里的二进制文件
  3. 提升开发者使用依赖包内提供的命令行工具的体验
  4. 自动查找当前依赖包里的可执行文件(一般是在.bin下搜索);找不到就去PATH里找;还找不到就安装
  5. 支持运行远程仓库的可执行文件(所以允许我们单次执行命令而不需要安装,可以不用再为了仅仅一次的使用而全局安装一些工具了)
  6. 甚至可以放弃用nvm来管理node版本了:允许以不同的node版本来运行指定命令、允许我们交互式地开发node命令行工具,比如:npx -p node-bin@6 npm it这种格式来指定node的版本

npx命令

  1. npx [npx-options] <bin>[@version] [bin-options]
  2. npx [npx-options] [-p | --package <packagename>]... <bin> [bin-options]...
  3. npx [npx-options] -c '<命令的字符串>'
  4. npx --shell-auto-fallback [命令行解释器]

补充:通常运行命令行工具的四种形式

以下四种方法是等价的,这就是我们平时使用npm的一些真相。

  1. 平常项目里经常采用的是第二种方法:不需要开发者全局安装一些npm包来使用命令,而是可以简单的通过npm scripts来使用。
  2. 另外,写成npm scripts有一个好处:那就是你不必全局安装某个工具(没有全局安装的话,你直接执行run-script里的东西是会报错的)。
  3. npx基本上是第四种方法的封装

全局安装这个命令行工具

  1. npm i -g <tool>不用多说了
  2. 避免了不同项目需要不同版本的尴尬,不再为全局工具的版本过期或者污染烦恼。
  3. 而npx现在可以临时安装,命令完成后删除,不会保存到全局安装的文件夹里

定义npm scripts

  1. 这个也很好理解,就是在package.json里增加script命令,这是npm支持的功能。
  2. 通过npm run可以查看当下可以直接被运行的脚本们
  3. npm脚本的原理是,自动新建一个Shell,并且把当前目录里的node_modules/.bin子目录加入PATH变量,执行完脚本后再恢复PATH。这就使它可以在那个Shell里直接执行各种命令。
  4. 比如:

    1
    2
    3
    "script": {
    "start": "parcel index.html"
    }
  5. npm脚本的本质就是Shell脚本,所以支持Shell脚本的各种特性,比如通配符等等。

  6. npm脚本可以嵌套:比如在一个里写入另外一个脚本

    1
    2
    "lint": "jshint **.js",
    "lint:checkstyle": "npm run lint -- --reporter checkstyle > checkstyle.xml"
  7. npm脚本里,可以通过&表示命令的并行,而通过&&表示命令的串行。

  8. 如果有必要,以--的方式传递参数,比如npm run dev -- -p 3007,当然,如果写进script里,就不需要这个--了。

直接执行

根据路径直接执行,比如:./node_modules/.bin/parcel index.html

利用PATH

把node_modules的可执行目录加到PATH里,比如:

1
2
alias npmx=PATH=$(npm bin):$PATH
npmx parcel index.html