3

记录一下 npx 的使用场景

 2 years ago
source link: https://zhuanlan.zhihu.com/p/397286775
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

记录一下 npx 的使用场景

中国科学院大学 计算机应用技术硕士

npm 从5.2.0版本开始,开始增加了 npx 命令。简单来说,npx 是一个旨在帮助开发者更方便的使用 npm 模块的工具,它简化了很多流程,比如允许我们在不预先安装模块到开发者电脑上时便可执行一些 npm 模块与可执行文件等。

以下列举 npx 的常见使用场景。

在不使用 npm run-script 情况下使用本地安装过的模块

在过去一段时间,npm 生态越来越倾向将工具库设置为 devDependencies 安装在本地,而不要求用户在全局进行安装注册。但如果想要调用这些模块,我们必须要在项目脚本或 package.json 的 scripts 字段中对其调用进行定义。否则,我们必须要要定位到 node_modules 中用繁琐的命令才能实现在命令行中对其进行调用。

假设我们安装了一个模块 mocha,正常来说我们要像 node-modules/.bin/mocha --version 一样调用,而通过 npx 则可以简化成:

npx mocha --version

npx 不仅会到 node_nmodules/.bin 中检查命令是否存在,同时还会检查环境变量 $PATH,这意味着我们可以通过 npx 调用系统命令,比如:

npx ls

避免全局安装,执行一次性命令

假设这样一种场景,我们想执行一些 CLI 工具,但是为了运行一次而不得不在全局安装他,这有点烦人了。这个时候,npx 就很合适登场了。

通过 npx 执行时,如果命令不在你的 $PATH 中,npx 会自动从 npm 注册源中拉取具有该名字的模块并安装调用他。在调用完成后,安装的模块并不会被放入你的环境变量,因此你不用担心如此调用对你的环境造成污染。

这种方式下最常见的用法莫过于新建一个 react 项目了:

npx create-react-app my-react-app

上面代码运行时,npx 将 create-react-app 下载到一个临时目录,使用以后再删除。所以,以后再次执行上面的命令,会重新下载 create-react-app。通过 @ 我们还可以指定模块版本:

npx [email protected] my-react-app

指定 Node 执行版本

由于 npx 可以下载模块,于是我们也可以指定 Node 版本,比如这样:

上面命令会使用 0.12.8 版本的 Node 执行脚本。原理是从 npm 下载这个版本的 node,使用后再删掉。

使用 -p 参数,我们可以指定要安装的模块,后面继续跟着要执行的命令,如上命令便可以重新写为下面这样:

npx -p [email protected] node -v

执行 gist 片段代码

这就比较简单了,npx 支持通过 url 执行 GitHub 上的源码模块。只要按照模块的定义写好,然后提供 gist 地址,npx 便可以按照约定执行脚本。

一个标准模块定义至少应该包含一个 package.json 文件,并指定 bin 脚本入口,例如下面这样:

{
    "name": "npx-is-cool",
    "version": "0.0.0",
    "bin": "./index.js"
}

然后便可以这样执行:

npx https://gist.github.com/hijiangtao/xxx

当我们需要执行一些流程化处理的事情时,最直接的办法当然是写 shell 脚本,但如果其中有一些可以快速用 JavaScript 实现的执行逻辑时,便可以简单将其封装为一个 npm 模块,然后通过 npx 的形式插入到脚本中。

最近给组内封装了一个 Code Review 通知提醒的模块,便是通过这种方式执行的。而要引入这个通知流程,我只需要在原有的 gitpush.sh 的最后加上 | npx @xxx 即可,感觉方便了不少。

以上便是 npx 的常见使用场景。


个人公众号「黯晓」,微信搜索或扫这个二维码,交个朋友吧。

知乎专栏「初级前端工程师」,前端技术博客,欢迎投稿与关注。

生活中难免犯错,请多多指教!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK