npm 從5.2版開始,增加了 npx 命令。它有很多用處,本文介紹該命令的主要使用場景。
Node 自帶 npm 模組,所以可以直接使用 npx 命令。萬一不能用,就要手動安裝一下。
$ npm install -g npx
呼叫專案安裝的模組
npx 想要解決的主要問題,就是呼叫專案內部安裝的模組。比如,專案內部安裝了測試工具 Mocha。
$ npm install -D mocha
一般來說,呼叫 Mocha ,只能在專案指令碼和 package.json 的scripts
欄位裡面, 如果想在命令列下呼叫,必須像下面這樣。
# 專案的根目錄下執行 $ node-modules/.bin/mocha --version
npx 就是想解決這個問題,讓專案內部安裝的模組用起來更方便,只要像下面這樣呼叫就行了。
$ npx mocha --version
npx 的原理很簡單,就是執行的時候,會到node_modules/.bin
路徑和環境變數$PATH
裡面,檢查命令是否存在。
由於 npx 會檢查環境變數$PATH
,所以系統命令也可以呼叫。
# 等同於 ls $ npx ls
注意,Bash 內建的命令不在$PATH
裡面,所以不能用。比如,cd
是 Bash 命令,因此就不能用npx cd
。
避免全域性安裝模組
除了呼叫專案內部模組,npx 還能避免全域性安裝的模組。比如,create-react-app
這個模組是全域性安裝,npx 可以執行它,而且不進行全域性安裝。
$ npx create-react-app my-react-app
上面程式碼執行時,npx 將create-react-app
下載到一個臨時目錄,使用以後再刪除。所以,以後再次執行上面的命令,會重新下載create-react-app
。
下載全域性模組時,npx 允許指定版本。
$ npx uglify-js@3.1.0 main.js -o ./dist/main.js
上面程式碼指定使用 3.1.0 版本的uglify-js
壓縮指令碼。
注意,只要 npx 後面的模組無法在本地發現,就會下載同名模組。比如,本地沒有安裝http-server
模組,下面的命令會自動下載該模組,在當前目錄啟動一個 Web 服務。
$ npx http-server
--no-install
引數和--ignore-existing
引數
如果想讓 npx 強制使用本地模組,不下載遠端模組,可以使用--no-install
引數。如果本地不存在該模組,就會報錯。
$ npx --no-install http-server
反過來,如果忽略本地的同名模組,強制安裝使用遠端模組,可以使用--ignore-existing
引數。比如,本地已經全域性安裝了create-react-app
,但還是想使用遠端模組,就用這個引數。
$ npx --ignore-existing create-react-app my-react-app
使用不同版本的 node
利用 npx 可以下載模組這個特點,可以指定某個版本的 Node 執行指令碼。它的竅門就是使用 npm 的 node 模組。
$ npx node@0.12.8 -v v0.12.8
上面命令會使用 0.12.8 版本的 Node 執行指令碼。原理是從 npm 下載這個版本的 node,使用後再刪掉。
某些場景下,這個方法用來切換 Node 版本,要比 nvm 那樣的版本管理器方便一些。
-p
引數
-p
引數用於指定 npx 所要安裝的模組,所以上一節的命令可以寫成下面這樣。
$ npx -p node@0.12.8 node -v v0.12.8
上面命令先指定安裝node@0.12.8
,然後再執行node -v
命令。
-p
引數對於需要安裝多個模組的場景很有用。
$ npx -p lolcatjs -p cowsay [command]
-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_
-c
引數可以把這些 npm 的環境變數帶入 npx 命令。
$ npx -c 'echo "$npm_package_name"'
上面程式碼會輸出當前專案的專案名。
執行 GitHub 原始碼
npx 還可以執行 GitHub 上面的模組原始碼。
# 執行 Gist 程式碼 $ npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32 # 執行倉庫程式碼 $ npx github:piuccio/cowsay hello
注意,遠端程式碼必須是一個模組,即必須包含package.json
和入口指令碼。
參考連結
(完)