npm 全名为 Node Package Manage ,是 Node.js 的包管理工具, npm 让开发者更容易安装和管理项目中的依赖项,使得它在现代的前端开发工作中成为了一个得力的工具,而在 npm@5.2.0 版本之后,增加 npx 以提供来一些辅助的功能。本文主要来介绍 npx 的特性与其存在的意义。
寻址调用
如果一个 npm 包配置了 bin ,当这个包被安装的时候,在项目的 node_modules/.bin 下就有会相应的指令来方便执行。
例如:在项目中添加了 next 来构建 SSR 项目,那么node_modules/.bin 下就会有 next 的命令。

如果需要调用 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 服务,这相当于一次性的命令。

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

在这之前你是否有遇见过想要尝试一些CLI工具创建项目,但是却要进行全局安装然后在进行创建,如果这个CLI工具只使用一次呢?比如利用 create-react-app 来创建 React 项目,使用 npx 来创建就可以避免这个问题,而且不用担心使用时的升级问题,因为 npx 确保使用最新的生成器或者软件包。
npx create-react-app my-react-repo
这样 npx 会自动从注册表中安装 create-react-app 软件包,并调用它,调用完成后又不会保存在全局文件中没,因此不会污染全局安装或需要多个步骤。这个特性非常适合生成器之类的软件包,比如 create-react-app , vue-cli , yeoman 等。
# 使用npx创建vue项目
npx -p @vue/cli vue create hello-word
切换node版本
在一些场景下使用npx 切换 Node 版本,比用像 nvm 、 nave 、 n 这样的 Node 版本管理工具会方便很多。
$ npx node@0.12.8 -v
v0.12.8
执行远程模块
npx 从URL执行程序包,但前提是URL上的远程代码必须是一个模块,即必须包含 package.json 和入口脚本。

常用参数
-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 工具和托管的其他可执行文件。解决了之前没有便捷的方式来交互式地调用本地二进制文件的问题,使得项目的开发管理提升了便捷性。
相关文章: