[學(xué)習(xí)筆記] npx使用

  • npm5.2 版本開始,增加了 npx 命令
  • Node 自帶 npm 模塊,所以可以直接使用 npx 命令

1 - 調(diào)用項目安裝的模塊


(這是 npx 想要解決的主要問題)
比如,項目內(nèi)部安裝了測試工具 Mocha:

$ npm install -D mocha

一般來說,調(diào)用 Mocha 只能在項目腳本和 package.jsonscript 字段里,如果想要在命令行下調(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

npxcreate-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í)行時會報錯,原因是第一項 cowsaynpx 解釋,而第二行命令 lolcat jsShell 解釋,但是 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ò)日志

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

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

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