来源:Node.js

npx

npx是一个命令行工具,它是npm 5.2.0以上版本的功能

低版本需要手动安装npx:

1
npx install npx -g

它允许用户在不安装全局包的情况下,运行已安装在本地项目中的包或者远程仓库中的包的可执行文件

这使开发人员更轻松地管理包的依赖关系、避免全局污染的问题

它还可以帮助开发人员在项目中使用不同版本的包,而不会出现版本冲突的问题

npx的优点

  • 避免全局安装:npx允许在没有全局安装的情况下运行某个npm包
  • 总是使用最新版本:如果没有在本地安装相应的npm包,npx会从npm仓库中下载并使用最新版
  • 执行任意npm包:npx不仅可以执行在package.json的scripts部分定义的命令,还可以执行任何npm包
  • 执行GitHub gist:npx甚至可以执行GitHub gist或者其他公开的JavaScript文件

npm和npx的区别

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

运行规则

  1. 先在当前目录查找node_modules/.bin
  2. 如果没找到,就去全局的node_modules查找
  3. 如果还没找到,就去下载这个包、运行命令、然后删除这个包

npx参数

  • –no-install:不自动下载,如果本地没有该模块则无法执行命令

  • –ignore-existing:忽略本地模块,每次都进行运行规则的第三步

  • -p:指定npx安装的模块,它可以指定某一版本进行安装,还可以同时安装多个模块

    1
    2
    3
    4
    5
    6
    # 两行命令是等价的
    npx node@0.12.8 -v
    npx -p node@0.12.8 node -v

    # 可以安装多个模块
    npx -p lolcatjs -p cowsay [command]
  • c:告诉npx所有命令都用npx解释

    1
    2
    3
    4
    5
    # 报错,默认第一个可执行项会使用npx安装的模块,后面的可执行项还是会被Shell解释
    npx -p lolcatjs -p cowsay 'cowsay hello | lolcatjs'

    # 将所有命令都用npx解释
    npx -p lolcatjs -p cowsay -c 'cowsay hello | lolcatjs'

案例

案例1

Getting Started | Create React App 中文文档

react脚手架Create React App能仅靠一行命令构建react项目:

1
npx create-react-app my-app

如果不使用npx,而是使用npm

1
npm install -g create-react-app

然后执行

1
create-react-app my-app

就会出现两个问题:

  • 全局安装这个包会占用磁盘空间
  • 如果需要更新包还得执行更新命令

案例2

假设电脑并未全局安装Vite(使用npm ls -g查询全局安装可执行文件时找不到vite),现在要浏览一个Vite项目

然而并不能直接执行vite命令,会报错

但可以使用npx vite浏览项目