npx的主要作用

npm 從5.2版開(kāi)始,增加了 npx 命令。它有很多用處,本文介紹該命令的主要使用場(chǎng)景。

Node 自帶 npm 模塊,所以可以直接使用 npx 命令。萬(wàn)一不能用,就要手動(dòng)安裝一下。

 $ npm install -g npx

調(diào)用項(xiàng)目安裝的模塊

npx 想要解決的主要問(wèn)題,就是調(diào)用項(xiàng)目?jī)?nèi)部安裝的模塊。比如,項(xiàng)目?jī)?nèi)部安裝了測(cè)試工具 Mocha。

$ npm install -D mocha

一般來(lái)說(shuō),調(diào)用 Mocha ,只能在項(xiàng)目腳本和 package.json 的scripts字段里面, 如果想在命令行下調(diào)用,必須像下面這樣。

# 項(xiàng)目的根目錄下執(zhí)行
$ node-modules/.bin/mocha --version

npx 就是想解決這個(gè)問(wèn)題,讓項(xiàng)目?jī)?nèi)部安裝的模塊用起來(lái)更方便,只要像下面這樣調(diào)用就行了。

$ npx mocha --version

npx 的原理很簡(jiǎn)單,就是運(yùn)行的時(shí)候,會(huì)到node_modules/.bin路徑和環(huán)境變量$PATH里面,檢查命令是否存在。

由于 npx 會(huì)檢查環(huán)境變量$PATH,所以系統(tǒng)命令也可以調(diào)用。

# 等同于 ls
$ npx ls

注意,Bash 內(nèi)置的命令不在$PATH里面,所以不能用。比如,cd是 Bash 命令,因此就不能用npx cd。

避免全局安裝模塊

除了調(diào)用項(xiàng)目?jī)?nèi)部模塊,npx 還能避免全局安裝的模塊。比如,create-react-app這個(gè)模塊是全局安裝,npx 可以運(yùn)行它,而且不進(jìn)行全局安裝。

$ npx create-react-app my-react-app

上面代碼運(yùn)行時(shí),npx 將create-react-app下載到一個(gè)臨時(shí)目錄,使用以后再刪除。所以,以后再次執(zhí)行上面的命令,會(huì)重新下載create-react-app。

下載全局模塊時(shí),npx 允許指定版本。

$ npx uglify-js@3.1.0 main.js -o ./dist/main.js

上面代碼指定使用 3.1.0 版本的uglify-js壓縮腳本。

注意,只要 npx 后面的模塊無(wú)法在本地發(fā)現(xiàn),就會(huì)下載同名模塊。比如,本地沒(méi)有安裝http-server模塊,下面的命令會(huì)自動(dòng)下載該模塊,在當(dāng)前目錄啟動(dòng)一個(gè) Web 服務(wù)。

$ npx http-server

--no-install 參數(shù)和--ignore-existing 參數(shù)

如果想讓 npx 強(qiáng)制使用本地模塊,不下載遠(yuǎn)程模塊,可以使用--no-install參數(shù)。如果本地不存在該模塊,就會(huì)報(bào)錯(cuò)。

$ npx --no-install http-server

反過(guò)來(lái),如果忽略本地的同名模塊,強(qiáng)制安裝使用遠(yuǎn)程模塊,可以使用--ignore-existing參數(shù)。比如,本地已經(jīng)全局安裝了create-react-app,但還是想使用遠(yuǎn)程模塊,就用這個(gè)參數(shù)。

$ npx --ignore-existing create-react-app my-react-app

使用不同版本的 node

利用 npx 可以下載模塊這個(gè)特點(diǎn),可以指定某個(gè)版本的 Node 運(yùn)行腳本。它的竅門就是使用 npm 的 node 模塊。

$ npx node@0.12.8 -v
v0.12.8

上面命令會(huì)使用 0.12.8 版本的 Node 執(zhí)行腳本。原理是從 npm 下載這個(gè)版本的 node,使用后再刪掉。

某些場(chǎng)景下,這個(gè)方法用來(lái)切換 Node 版本,要比 nvm 那樣的版本管理器方便一些。

-p 參數(shù)

-p參數(shù)用于指定 npx 所要安裝的模塊,所以上一節(jié)的命令可以寫(xiě)成下面這樣。

$ npx -p node@0.12.8 node -v 
v0.12.8

上面命令先指定安裝node@0.12.8,然后再執(zhí)行node -v命令。

-p參數(shù)對(duì)于需要安裝多個(gè)模塊的場(chǎng)景很有用。

$ npx -p lolcatjs -p cowsay [command]

-c 參數(shù)

如果 npx 安裝多個(gè)模塊,默認(rèn)情況下,所執(zhí)行的命令之中,只有第一個(gè)可執(zhí)行項(xiàng)會(huì)使用 npx 安裝的模塊,后面的可執(zhí)行項(xiàng)還是會(huì)交給 Shell 解釋。

$ npx -p lolcatjs -p cowsay 'cowsay hello | lolcatjs'
# 報(bào)錯(cuò)

上面代碼中,cowsay hello | lolcatjs執(zhí)行時(shí)會(huì)報(bào)錯(cuò),原因是第一項(xiàng)cowsay由 npx 解釋,而第二項(xiàng)命令localcatjs由 Shell 解釋,但是lolcatjs并沒(méi)有全局安裝,所以報(bào)錯(cuò)。

-c參數(shù)可以將所有命令都用 npx 解釋。有了它,下面代碼就可以正常執(zhí)行了。

$ npx -p lolcatjs -p cowsay -c 'cowsay hello | lolcatjs'

-c參數(shù)的另一個(gè)作用,是將環(huán)境變量帶入所要執(zhí)行的命令。舉例來(lái)說(shuō),npm 提供當(dāng)前項(xiàng)目的一些環(huán)境變量,可以用下面的命令查看。

$ npm run env | grep npm_

-c參數(shù)可以把這些 npm 的環(huán)境變量帶入 npx 命令。

$ npx -c 'echo "$npm_package_name"'

上面代碼會(huì)輸出當(dāng)前項(xiàng)目的項(xiàng)目名。

執(zhí)行 GitHub 源碼

npx 還可以執(zhí)行 GitHub 上面的模塊源碼。

# 執(zhí)行 Gist 代碼
$ npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32

# 執(zhí)行倉(cāng)庫(kù)代碼
$ npx github:piuccio/cowsay hello

注意,遠(yuǎn)程代碼必須是一個(gè)模塊,即必須包含package.json和入口腳本。

參考鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容