- npm 從 5.2 版本開始,增加了 npx 命令
- Node 自帶 npm 模塊,所以可以直接使用 npx 命令
1 - 調(diào)用項目安裝的模塊
(這是 npx 想要解決的主要問題)
比如,項目內(nèi)部安裝了測試工具 Mocha:
$ npm install -D mocha
一般來說,調(diào)用 Mocha 只能在項目腳本和 package.json 的 script 字段里,如果想要在命令行下調(diào)用:
# 項目的根目錄下執(zhí)行
$ node-modules/.bin/mocha --version
這種情況就是 npx 要解決的問題,讓項目內(nèi)部安裝的模塊用起來更方便:
$ npx mocha --version
npx 的原理:在運行的時候,會到 node_modules/.bin 路徑和環(huán)境變量 $PATH 里,檢查命令是否存在。
由于 npx 會檢查環(huán)境變量 $PATH,所以系統(tǒng)命令也可以調(diào)用:
# 等同于 ls
$ npx ls
注意,Bash 內(nèi)置的命令不在 $PATH 里面,所以 npx 不可以調(diào)用 Bash 命令,因此不能使用 npx cd 。
2 - 避免全局安裝模塊
比如,npx 運行 create-react-app 這個模塊,但不進行全局安裝:
$ npx create-react-app my-app
npx 將 create-react-app 模塊下載到一個臨時文件,使用以后再刪除。所以,若再次執(zhí)行以上代碼,create-react-app 會重新被下載。
下載全局模塊時,npx 允許指定版本:
$ npx uglify-js@3.1.0 main.js -o ./dist/main.js
以上代碼意思是指定使用 3.1.0 版本的 uglify-js 壓縮腳本。
注意,只要 npx 后面的模塊無法在本地發(fā)現(xiàn),就會下載同名模塊。比如,本地沒有安裝 http-server 模塊,下面的命令會自動下載該模塊,在當(dāng)前目錄啟動一個 web 服務(wù):
$ npx http-server
--no-install 參數(shù)和 --ignore-existing 參數(shù)
如果想讓 npx 強制使用本地模塊,不下載遠(yuǎn)程模塊,可以使用 --no--install 參數(shù)。如果本低不存在該模塊,就會報錯。
$ npx --no-install http-server
如果想要忽略本地的同名模塊,強制安裝使用遠(yuǎn)程模塊,可以使用 --ignore-existing 參數(shù)。比如,本地已經(jīng)全局安裝了 create-react-app,但是想要使用遠(yuǎn)程模塊:
$ npx --ignore-existing create-react-app my-app
使用不同版本的 node
利用 npx 可以下載模塊這個特點,可以指定某個版本的 Node 運行腳本:
$ npx node@0.12.8 -v
上面命令會使用 0.12.8 版本的 Node 執(zhí)行腳本。原理是從 npm 下載這個版本的 node ,使用后再刪除。
在某些場景下,這個方法可以用來切換 Node 版本,要比 nvm 那樣的版本管理器方便一些。
(nvm 是???)
-p 參數(shù)
-p 參數(shù)用于指定 npx 所要安裝的模塊,所以上一節(jié)的命令可以寫成這樣:
$ npx -p node@0.12.8 node -v
上面命令先指定安裝 node@0.12.8,然后再執(zhí)行 node -v 命令。
-p 參數(shù)對于需要安裝多個模塊的場景很有用:
$ npx -p lolcat js -p cowsay [command]
-c 參數(shù)
如果 npx 安裝多個模塊,默認(rèn)情況下,所執(zhí)行的命令之中,只有第一個可執(zhí)行項會使用 npx 安裝的模塊,后面的可執(zhí)行項是會交給 Shell 解釋。
$ npx -p lolcat js -p cowsay 'cowsay hello | lolcat js'
上面代碼中,cowsay hello | lolcat js 執(zhí)行時會報錯,原因是第一項 cowsay 由 npx 解釋,而第二行命令 lolcat js 由 Shell 解釋,但是 lolcat js 并沒有全局安裝,所以報錯。
-c 參數(shù)可以將所有命令都用 npx 解釋:
$ npx -p lolcat js -p cowsay -c 'cowsay hello | lolcat js'
-c 參數(shù)的另一個作用,是將環(huán)境變量帶入所要執(zhí)行的命令。舉例來說,npm 提供當(dāng)前項目的一些環(huán)境變量,可以用下面的命令查看:
$ npm run env | grep npm_
-c 參數(shù)可以把這些 npm 的環(huán)境變量帶入 npx 命令:
$ npx -c 'echo "$npm_package_name"'
上面代碼會輸出當(dāng)前項目的項目名。
執(zhí)行 GitHub 源碼
npx 還可以執(zhí)行 GitHub 上面的模塊源碼:
# 執(zhí)行 Gist 代碼
$ npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32
# 執(zhí)行倉庫代碼
$ npxx github:piuccio/cowsay hello
注意,遠(yuǎn)程代碼必須是一個模塊,即必須包含 package.json 和入口腳本。
(完)
參考 npx 使用教程 - 阮一峰網(wǎng)絡(luò)日志