我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

平时安装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子命令参数

下面展示一些npx命令的子命令,都可以完成特定的功能。

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代码地址是:

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

可能的使用场景

下面的场景,是苏南大叔总结的可能的使用场景:

  • 不想安装相关的代码,仅仅是个测试,用完自动删除。
  • 想运行当前目录下的node_modules/内的命令,比如:webpack-cli

相关链接

总结

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

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

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

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

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   node    npm