npx使用教程
今晚在学习 Vue-Cli
时, 由于突发奇想想试试最新的 @4.x.x
版本, 但是本地全局安装的脚手架版本是 @2.x.x
的, 因为不想污染全局于是就想到用 npx
命令, 一路上踩坑不断, 为了以后能够更好的使用 npx
并区分其跟 npm
的指令, 就有了本篇笔记
npm 是从5.2版开始, 增加(自带)了 npx 命令。如果发现没安装请手动安装:
代码语言:javascript复制npm i -g npx
npm与npx的概念
- NPM(Node Package Manager) 是Node.js提供的一个包管理器, 可以使用 NPM 来安装 node.js 包
- NPX(Node Package E x cuted) 可以理解为用于 临时安装并执行 某个包的一个工具
总结的来说:
- npm专注于安装包
- npx专注于执行包, 并且是较特殊的执行
npx的使用场景(对比npm的一些优势)
从几个使用场景出发, 希望能够有对应您当前的场景, 这样就能直接套用了
使用场景1: 想用项目中已经安装好的某个包, 但是不能直接执行(因为没有全局安装, 涉及环境变量的问题)
对于这个场景, 有些笨方法:
- 到项目的根目录下执行:
node-modules/.bin/包对应的脚本
- 配置
npm script
: 在package.json
的scripts
中将方法1
添加进脚本, 然后就能在需要的时候执行"npm run 自定义指令"以快速执行啦, 本质上只是对方法1
的改进
更优雅的方法, 就是使用 npx命令啦
:
npx <包对应的命令>
# 以less编译为例:
npx lessc -v # 查看当前项目下less编译器的版本
使用场景2: 已全局安装某个包, 项目又已安装了不同版本的某个包, 想用项目的那个版本
以我今晚的踩坑作为第二个使用场景, 我本地已经全局安装了Vue脚手架的 @2.x.x
版本, 但是我想用并已经在本地项目文件目录中安装了最新的 @4.x.x
版本, 即:
# 已经执行过
npm i -g vue-cli@2
vue -V # vue@2.9.6
# 已经执行过
cd my-project
npm i -D @vue/cli@4
vue -V # vue-cli@4.5.13
这时, 如果使用 vue -V
会发现使用的是全局的版本, 因为npm默认会执行全局中的包。如果想使用项目已经安装的那个版本就直接执行如下命令:
npx <包对应的命令>
# 以vue-cli为例:
npx vue create my-project
使用场景3: 不想全局或在项目中安装某个包, 只想临时使用
对于这种场景, npx
就是必要的选择。 npx
会将要用的下载到一个临时目录, 使用完毕后自动删除, 还是以 Vue-Cli
为例: 这次的我突发奇想想看看 React脚手架
的项目文件结构,由于我还没学, 所以本地和全局都没有安装(只是临时想用脚手架创建一个React项目)
npx create-react-app my-react-project #react脚手架将会在项目搭建完后自动被删除掉
使用场景4: 临时使用特定版本的包(本地没有安装)
如题所示, 这里以我突发奇想想使用Vue脚手架的 @3.x.x
版本, 但是我全局已经安装了 @2.x.x
版本
cd my-vue-project # 进入我的vue项目
npx @vue/cli@3 create big-project # 利用vue-cli的3.x版本创建一个名为big-project的项目
关于npx的一些参数
- 安装并使用特定版本:
npx 包@版本号 包对应的命令
--no-install
强制使用本地包, 本地包如果没安装就会报错:npx --no-install vue create my-project
--ignore-existing
强制安装使用远程模块:npx --ignore-existing vue create my-project
-p
对于一次性安装多个包,使用参数-p
:npx -p @vue/cli -p less
切记: 安装多个包一定要使用 -p-c
在一次性安装并使用多个包的场景中: 在低版本下执行npx -p vue-cli -p less lessc -v & vue -V
命令, 有可能只有第一个命令项能正常执行, 即:只打印出less编辑器的版本。npx
的参数-c
就是为了告诉npx
执行指定的所有命令的范围:npx -p vue-cli -p less -c "lessc -v & vue -V"
, 这样就能保证绝对的安全了。注: &代表两个命令都执行, |代表前面执行成功后面命令就不执行
这一小节中最常用、重要的是第5点, 根据此总结: 不管安装的包、命令的个数个数是多少(哪怕只安装1个包), 严格遵守 npx -p 包1 -p 包2 -p 包n -c "命令1 & 命令2 & 命令n"
一定没错