npx: npm包执行工具

2,818 阅读3分钟

npm  全名为 Node Package Manage ,是 Node.js 的包管理工具, npm  让开发者更容易安装和管理项目中的依赖项,使得它在现代的前端开发工作中成为了一个得力的工具,而在 npm@5.2.0 版本之后,增加 npx  以提供来一些辅助的功能。本文主要来介绍 npx 的特性与其存在的意义。

寻址调用

如果一个 npm 包配置了 bin ,当这个包被安装的时候,在项目的 node_modules/.bin 下就有会相应的指令来方便执行。

例如:在项目中添加了 next 来构建 SSR 项目,那么node_modules/.bin 下就会有 next 的命令。

image.png

如果需要调用 next 相关的命令,比如查询 next 版本:

以往的方式:

node node_module/.bin/next -v

npm script 方式:

{
  "script": {
    "next-v": "node node_module/.bin/next -v"
  }
}
npm run next-v

npx 方式:

npx next -v

在调用一些安装包的内置命令时,比如在使用 Jest 进行测试单个文件的时候,对于写 npm script 和 手动调用 node_modules 下的命令就不太友好,使用 npx 会方便很多。

npx 在寻址调用的时候,会到项目的 node_modules/.bin 路径和系统的 path 中进行查找,检查命令是否存在。如果不存在则会临时下载或运行程序包或进行使用。

执行一次性命令

例如本地不存在 http-server 模块,则会自动临时下载安装,然后在当前目录进行启动一个 web 服务,这相当于一次性的命令。

image.png

再举个例子,检查网站的可访问性得分:

image.png

在这之前你是否有遇见过想要尝试一些CLI工具创建项目,但是却要进行全局安装然后在进行创建,如果这个CLI工具只使用一次呢?比如利用 create-react-app 来创建 React 项目,使用 npx 来创建就可以避免这个问题,而且不用担心使用时的升级问题,因为 npx 确保使用最新的生成器或者软件包。

npx create-react-app my-react-repo

这样 npx 会自动从注册表中安装 create-react-app 软件包,并调用它,调用完成后又不会保存在全局文件中没,因此不会污染全局安装或需要多个步骤。这个特性非常适合生成器之类的软件包,比如 create-react-appvue-cliyeoman 等。

# 使用npx创建vue项目
npx -p @vue/cli vue create hello-word

切换node版本

在一些场景下使用npx 切换 Node 版本,比用像 nvmnaven 这样的 Node 版本管理工具会方便很多。

$ npx node@0.12.8 -v
v0.12.8

执行远程模块

npx 从URL执行程序包,但前提是URL上的远程代码必须是一个模块,即必须包含 package.json 和入口脚本。

image.png

常用参数

-p

-p or --package <package> 定义要安装的软件包,并添加到正在运行的$PATH

--no-install

npx 强制使用本地模块,不下载远程模块,如果本地没有该模块则会出错。

--ignore-existing

--no-install 相反,让 npx 强制使用远程模块。

--cache

设置 npm 缓存的位置,否则为 npm 默认缓存位置。

-c

npm run-script类似外壳程序的环境中执行,并提供所有常用的环境变量。如果 NPX 安装了多个模块,只有 <string> 参数的第一个项会被当作命令执行,其他的就须要加上 -p 选项。

-q, --quiet

禁止npx本身的任何输出(进度条,错误消息,安装报告),子命令输出本身不会被禁止。

-n, --node-arg

当二进制是node脚本时,提供给node的额外参数。

-v, --version

查看 npx 版本

文章最后

通过以上我们知道 npx 是一种执行 npm 包的工具,它很好的提升了使用 npm 包的体验。 npm 使得在开发中方便的安装和管理注册表中托管的依赖项,而 npx  使得更容易使用注册表中 CLI 工具和托管的其他可执行文件。解决了之前没有便捷的方式来交互式地调用本地二进制文件的问题,使得项目的开发管理提升了便捷性。

相关文章: