你真的会用 npx 吗❓❓❓
Hello,大家好!
日常開發中大家應該經常使用 npm install xxx 來安裝包依賴,那是否注意到npm升級到 npm@5.2.0 之后,在 npm 二進制命令旁邊安裝了一個 npx 二進制文件呢?
沒有 npx 命令前
在沒有 npx 命令之前,我們想要執行項目中安裝的可執行腳本,以安裝 React 創建項目的腳手架 create-react-app 為例,通常使用下面的做法:
做法一,使用全局安裝然后再創建項目:
npm install create-react-app -g
create-react-app test-react
缺點
create-react-app安裝項目本身是一個低頻次操作,全局安裝不具備必要性,同時如果其它低頻次工具也全局安裝,勢必會造成全局 path 混亂和冗余。- npm 生態系統越來越傾向于將工具安裝為項目本地?
devDependencies?,讓每個項目獨立管理工具的版本,而不是都是用全局安裝的固定版本。
做法二,不全局安裝,需要先進入腳手架目錄,再調用這個命令:
npm install create-react-app -D
cd node-modules/.bin/
create-react-app test-react
或者將 create-react-app 命令添加到 package.json 的 scripts中
缺點
這樣做每個項目可以安裝不同的腳手架版本,但操作還是略微繁瑣,同時每個項目都安裝一遍腳手架工具也是不必要的。
npx 就是為了解決這些問題,下面我們來了解一下。
npx 基本用法
了解基本用法之前,我們先看看 npx 的安裝。
安裝
在安裝完 node 以及 npm 后,會默認安裝 npm 相同版本號的 npx 工具,當然也可以獨立安裝:
npm install -g npx
執行命令
npx create-react-app
使用 npx 執行一個工具非常簡單,不需要提前安裝 create-react-app ,直接使用 npx 就可以執行這個工具,這源于 npx 的查找流程:
- 先自動查找當前項目依賴包中的可執行文件,也就是
node-modules/.bin/; - 如果找不到,就會去全局
$PATH中查找,所以全局安裝的包不會重復安裝; - 如果依然找不到,就會幫你臨時安裝,執行完命令后再刪除包。
擁有 npx 后,當我們開發一個命令,就不用讓用戶先安裝再使用了,給用戶添加負擔。??
常用參數
同時,npx 還有一些常用的參數:
--no-install?和--ignore-existing?參數
如果想讓 npx 強制使用本地模塊,不下載遠程模塊,可以使用--no-install參數。如果本地不存在該模塊,就會報錯。
npx --no-install create-react-app
反過來,如果忽略本地的同名模塊,強制安裝使用遠程模塊,可以使用--ignore-existing參數。比如,本地已經全局安裝了create-react-app,但還是想使用遠程模塊,就用這個參數。
npx --ignore-existing create-react-app my-react-app
-p 參數
-p參數用于指定 npx 所要安裝的模塊版本。
npx -p node@18.16.1 node -v
上面命令先指定安裝node@18.16.1,然后再執行node -v命令。
-p參數對于需要安裝多個模塊的場景很有用。
npx -p lolcatjs -p cowsay 'cowsay hello'
cowsay 工具會在命令行中生成羊圖案和對象的文字,lolcatjs 工具會將這只羊上色
-c 參數
如果 npx 安裝多個模塊,默認情況下,所執行的命令之中,只有第一個可執行項會使用 npx 安裝的模塊,后面的可執行項還是會交給 Shell 解釋。
npx -p lolcatjs -p cowsay 'cowsay hello | lolcatjs'
# 報錯
上面代碼中,cowsay hello | lolcatjs執行時會報錯,原因是第一項cowsay由 npx 解釋,而第二項命令localcatjs由 Shell 解釋,但是lolcatjs并沒有全局安裝,所以報錯。
-c參數可以將所有命令都用 npx 解釋。有了它,下面代碼就可以正常執行了。
npx -p lolcatjs -p cowsay -c 'cowsay hello | lolcatjs'
-c參數的另一個作用,是將環境變量帶入所要執行的命令。舉例來說,npm 提供當前項目的一些環境變量,可以用下面的命令查看。
npm run env | grep npm_ # 查詢npm的環境變量,并篩選出以 npm_ 開頭的變量
-c參數可以把這些 npm 的環境變量帶入 npx 命令。
npx -c 'echo "$npm_package_name"'
上面代碼會輸出當前項目的項目名。
npx 其它用法
使用不同版本的 node
利用 npx 可以下載模塊這個特點,可以指定某個版本的 Node 運行腳本。它的竅門就是使用 npm 的?node 模塊。
npx node@18.16.1 -v
上面命令會使用 18.16.1 版本的 Node 執行腳本。原理是從 npm 下載這個版本的 node,使用后再刪掉。
使用這個包,可以直接在一個 node 環境下,使用不同版本的 node 測試開發的包是否正常運行,當然也可以使用 nvm 等 node 管理器,但是需要先切換再測試的方式效率明顯不如上面的命令。
執行 GitHub 源碼
npx 還可以執行 GitHub 上面的模塊源碼。
npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32
# 執行倉庫代碼
npx github:piuccio/cowsay hello
注意,遠程代碼必須是一個模塊,即必須包含package.json和入口腳本。
本文具體參考了以下文章:
- Introducing npx: an npm package runner | by Kat Marchán | Medium
- GitHub - npm/npx: npm package executor
- npx 使用教程 - 阮一峰的網絡日志
總結
以上是生活随笔為你收集整理的你真的会用 npx 吗❓❓❓的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构里的一棵树
- 下一篇: UE5: UpdateOverlap -