npm的m是Management,npx的x为eXecute

npm run

  1. npm run命令会自动在环境变量$PATH添加node_modules/.bin目录,所以scripts字段里面调用命令时不用加上路径,这就避免了全局安装NPM模块
  2. npm run会创建一个Shell,执行指定的命令,并临时将node_modules/.bin加入PATH变量,这意味着本地模块可以直接运行
  3. npm run如果不加任何参数,直接运行,会列出package.json里面所有可以执行的脚本命令

当执行npx xxx的时候,npx先看xxx在全局环境变量$PATH里有没有,如果没有,找当前目录的node_modules里有没有,如果还是没有,就安装这个xxx 来执行
npx也可以理解为少些package.json里一个script而诞生的

使用

1. 全局命令,免安装

好处就是避免安装全局命令,可以减少碎片化问题

  1. $ npx @vue/cli -V
  2. # 等价于
  3. $ npm install @vue/cli -g
  4. $ vue -V

2. 本地 bin 寻址

果一个包配置了 bin后,当它被安装的时候,在项目的 node_modules/.bin下就会有相应的指令,方便执行
如常见的执行单元测试,我们可以看到 mocha 有配置了一个bin
如果我们 npm install mocha —save-dev 后,可以:

  1. # 手动档执行
  2. $ node node_modules/.bin/mocha **/*.test.js
  3. # 配置 zsh 别名:alias n='PATH=$(npm bin):$PATH'
  4. n mocha **/*/test.js
  5. mocha 指令写入到 npm scripts 后,会自动寻址 node_modules/.bin
  6. # { scripts: { "test": "mocha **/*.test.js" }}
  7. $ npm test
  8. # 适用于临时需要执行某个 bin
  9. $ npx mocha **/*.test.js