npx 介紹
What
npx是一種在npm中安裝工具,也可以被單獨的下載使用
在npm 5.2.0 的時候發(fā)現(xiàn)會買一送一,自動安裝了npx。
pros
再也不需全局安裝任何工具只需要npx <commang>
全局安裝劣勢:
-
占用本機空間
npm會在machine上創(chuàng)建一個目錄(mac是
/usr/local/lib/node_modules)存放所有global安裝的包, 其實node_module占用的空間比較大的 -
版本問題:
假如一個項目中的某一個dependency是全局安裝的,也就意味著不同的開發(fā)人員使用的這個dependency版本完全基于本地的版本,也就會導致不同的開發(fā)人員使用不同的版本
使用npx的優(yōu)勢也就凸顯出來了:
- 當在執(zhí)行
npx <command>的時候,npx會做什么事情?- 幫你在本地(可以是項目中的也可以是本機的)尋找這個 command
- 找到了: 就用本地的版本
- 沒找到: 直接下載最新版本,完成命令要求
- 使用完之后不會在你的本機或者項目留下任何東西
- 幫你在本地(可以是項目中的也可以是本機的)尋找這個 command
因此優(yōu)勢總結:
- 不會污染本機
- 永遠使用最新版本的dependency
任何command都通過npx在machine任何位置使用
舉個例子,在某一個項目中使用
npm install --save-dev @babel/core @babel/cli安裝babel。此時:
你在命令行中使用babel script.js一定會報錯說babel不存在,即便你的node_module中babel靜靜的躺在那里,你只有兩種方式可以使用babel:你可以通過在
package.json的script中使用babel去compile某一個directory(用npm run-script的形式)你也可以通過使用
./node_modules/.bin/babel script.js用babel去compile某一個script文件(使用babel包中的可執(zhí)行文件)那么他的局限性就很大:
雖然你的node_module中有babel,等價于你的machine上有babel,但是你不能方便的在任何位置使用babel,只能通過以上的兩種方式。
-
但是有了npx在任何位置使用babel command似乎就不是難題了:
當你任何位置(根目錄下/項目根目錄下)運行
npx babel script.js不會再報錯說babel不存在了:- npx會幫你找到本機下的babel然后運行
幫助執(zhí)行one-off指令
對于一些工具,比如create-react-app,它們有些特性:
- 可能很久才會被使用一次
- 安裝包會很大
我們似乎真的沒必要將他們都安裝到電腦上,所以可以直接使用npx tool-command
幫助切換版本
npx的-p選項允許您指定要安裝的包,并將其添加到正在運行的$PATH中,那么實用的case是什么呢:
當你沒有nvm的時候,幫你方便的切換node版本,假設你本機安裝的node版本是node@8,但是你的項目可能需要使用使用node@6做測試,如果你有nvm,可以使用nvm use v8.11,其實npx也可以幫你做成。
使用npx -p node@6 npm run test:
- npx會幫助你下載node@6
- 將此時的環(huán)境變成node@6版本
- 使用node@6幫你執(zhí)行npm run test
- 命令執(zhí)行完畢之后不會修改你原來的node版本
指令可以理解為使用node@6版本運行npm run test
通過SHELL AUTO FALLBACK 將npx作為所有指令找不到時的fallback地址
在你的命令行配置文件中(~/.bashrc, ~/.zshrc, ~/.config/fish/config.fish)配置以下指令:

你會驚喜的發(fā)現(xiàn):
當你隨手在任何一個地方執(zhí)行某一個command比如happy-birthday -u pei此時你可能根本沒有這個happy-birthday:
- 配置了
npx fallback
image.png
- 沒有配置
npx fallback
image.png
也就是配置了npx fallback,說當你的指令在本機上找不到的時候,npx就會幫助你運行這個command

