本博客不欢迎:各种镜像采集行为,请尊重知识产权法律法规。大家都是程序员,不要闹得不开心。

平时安装node模块的时候,经常使用的命令是npm。其实还有另外一个命令,叫做npx。网上的说法都是:npxnpm命令的升级版本,功能非常强大。但是,苏南大叔不同意这个看法。

苏南大叔:npx是什么命令?npx和npm有什么区别? - node-npx
npx是什么命令?npx和npm有什么区别?(图10-1)

本文主要说明的就是npx的基本使用方式。本文测试环境:win10node@14.16.0npm@6.14.11npx@6.14.11

npxnpm的区别

谈起npxnpm的区别,虽然网上的说法是:npxnpm的升级版本。但是,苏南大叔认为:两者就是拼写比较像。命令的基本功能完全不一样,并不存在着升级不升级的说法,不是替代的关系。

  • npx侧重于执行命令的,执行某个模块命令。虽然会自动安装模块,但是重在执行某个命令。
  • npm侧重于安装或者卸载某个模块的。重在安装,并不具备执行某个模块的功能。

苏南大叔:npx是什么命令?npx和npm有什么区别? - npx-shell
npx是什么命令?npx和npm有什么区别?(图10-2)

npx的基本逻辑

npx非常强大。苏南大叔认为他最主要的功能就是:

  • npx非常智能的识别模块,如果模块存在,就使用。如果不存在,就临时下载,用完就删除。
  • 使用某个node模块的时候,根本不用关心是否安装过了。npx会给你最满意的答案(没有对应模块就临时下载)。

苏南大叔:npx是什么命令?npx和npm有什么区别? - npx-shell-2
npx是什么命令?npx和npm有什么区别?(图10-3)

所以,不使用特殊参数的npx命令的基本逻辑是:先检查当前项目node_modules/下,是否存在。不存在的话,就检查全局是否已经安装对应的模块。如果还没有的话,就去仓库里面去下载对应的模块,下载完毕就执行。执行完毕就删除,不留下一丝痕迹!

苏南大叔是个比较怀旧的人,对于npx这种用完就丢弃删除的行为,是十分不屑的。所以,比较不喜欢使用npx命令。下次使用不是又要下载嘛,很麻烦是不?很耗时不是?

npx的基本动作

electron这个模块为例,基本背景是这样的:

当前项目test下,安装的是electron@8

苏南大叔:npx是什么命令?npx和npm有什么区别? - npx-electron
npx是什么命令?npx和npm有什么区别?(图10-4)

同时,电脑里面全局安装的是electron@12

苏南大叔:npx是什么命令?npx和npm有什么区别? - npx-electron-2
npx是什么命令?npx和npm有什么区别?(图10-5)

截至到发稿,electron最新版是14系列。

苏南大叔:npx是什么命令?npx和npm有什么区别? - npx-electron-3
npx是什么命令?npx和npm有什么区别?(图10-6)

相关文档:

然后,问题来了,npx electron -v命令会显示什么样的版本号?

  • 在项目根目录下面,执行npx electron -v,显示的node_modules/下的electron版本号。
  • 在其它路径下面,执行npx electron -v,显示的全局的electron版本号。

苏南大叔:npx是什么命令?npx和npm有什么区别? - npx-electron-4
npx是什么命令?npx和npm有什么区别?(图10-7)

然后,苏南大叔卸载了全局的electron。再次在非项目路径下,执行npx electron -v。在一阵下载界面闪过之后,显示的是最新的electron版本号。

npx --no-install

npx的最大优势就是:不存在就会尝试下载。但是,居然就有这么一次参数--no-install。意思是不存在就不存在了,不要去尝试下载... 那这个npx命令还有啥存在价值?苏南大叔表示:很无语!

苏南大叔:npx是什么命令?npx和npm有什么区别? - npx--no-install
npx是什么命令?npx和npm有什么区别?(图10-8)

温馨提示:注意--no-install 参数的位置,否则,就说不清这个参数是作用在npx命令上面的,还是后面的命令(例子中的electron命令)上的了。

npx --ignore-existing

这又是一个令人很无语的参数--ignore-existing,它的意思就是:不管本地有没有(包括项目内或者全局),都一定要下载命令,然后执行,然后删除!令人无语吧?

苏南大叔:npx是什么命令?npx和npm有什么区别? - npx--ignore-existing
npx是什么命令?npx和npm有什么区别?(图10-9)

npx -p

这个参数的意思是:必须先下载完对应模块,然后再执行后面的命令。这里苏南大叔写了个测试文件test.js,用于输出当前的node版本号,然后看看效果吧。
test.js:

console.log(process.version)
npx -p node@8 node test.js

苏南大叔:npx是什么命令?npx和npm有什么区别? - npx-p
npx是什么命令?npx和npm有什么区别?(图10-10)

上图的例子中,本地的node版本号是14.16.0,但是通过npx-p命令,硬生生的改成了node@8来执行这个test.js。颇有违和感!

npx github:

这个功能需要git客户端的配合,如果本地没有识别出git命令的话,是需要先安装git客户端才能正常使用的。安装完git命令之后,记得要新开命令行窗口才能被识别。

还是以electron -v命令为例:

npx github:electron/electron -v

这个命令能够成功执行的话,

  • 一是要正确安装git命令
  • 二是要能访问github网站,这可是个技术活儿。不是么?
  • 三是人品问题。放弃吧。

对应的github代码地址是:

由于人品问题,这个实验暂时放弃。

相关链接

总结

总结上来说,苏南大叔认为:

  • npx命令的优点就是:可以智能识别,甚至主动下载。保证对应命令一定会执行完成。
  • npx命令的缺点就是:主动下载的文件,用完就会删除。下次还要再次下载。耗时耗资源!

更多npx的文章,请点击下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。