轉自阮一峯http://www.ruanyifeng.com/blog/2019/02/npx.htmlhtml
npm 從5.2版開始,增長了 npx 命令。它有不少用處,本文介紹該命令的主要使用場景。node
Node 自帶 npm 模塊,因此能夠直接使用 npx 命令。萬一不能用,就要手動安裝一下。react
$ npm install -g npx
npx 想要解決的主要問題,就是調用項目內部安裝的模塊。好比,項目內部安裝了測試工具 Mocha。git
$ npm install -D mocha
通常來講,調用 Mocha ,只能在項目腳本和 package.json 的scripts
字段裏面, 若是想在命令行下調用,必須像下面這樣。github
# 項目的根目錄下執行 $ node-modules/.bin/mocha --version
npx 就是想解決這個問題,讓項目內部安裝的模塊用起來更方便,只要像下面這樣調用就好了。npm
$ npx mocha --version
npx 的原理很簡單,就是運行的時候,會到node_modules/.bin
路徑和環境變量$PATH
裏面,檢查命令是否存在。json
因爲 npx 會檢查環境變量$PATH
,因此係統命令也能夠調用。bash
# 等同於 ls $ npx ls
注意,Bash 內置的命令不在$PATH
裏面,因此不能用。好比,cd
是 Bash 命令,所以就不能用npx cd
。app
除了調用項目內部模塊,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
利用 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]
若是 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"'
上面代碼會輸出當前項目的項目名。
npx 還能夠執行 GitHub 上面的模塊源碼。
# 執行 Gist 代碼 $ npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32 # 執行倉庫代碼 $ npx github:piuccio/cowsay hello
注意,遠程代碼必須是一個模塊,即必須包含package.json
和入口腳本。