npx 入門使用

  • 2019 年 11 月 8 日
  • 筆記

今天在使用的 Gulp 時看到首頁的一段命令:

...  $ npx -p touch nodetouch gulpfile.js  ...

npx 是個啥?決定一探究竟。

調用項目安裝的模組

npx 是 npm 的自帶模組,可以直接使用,手動安裝為:

$ npm install -g npx

npx – execute npm package binaries. 它解決的問題是:更方便的從本地 node_modules/.bin 或中央快取中執行命令。

比如項目安裝了 gulp 需要執行命令時需要:

$ node_modules/.bin/gulp -v

如果使用 npx 只需要:

$ npx gulp -v

npx 的原理很簡單,就是運行的時候,會到 node_modules/.bin 路徑和環境變數 $PATH 裡面,檢查命令是否存在。由於 npx 會檢查環境變數 $PATH,所以系統命令也可以調用。

# 等同於 ls  $ npx ls

注意,Bash 內置的命令不在 $PATH 裡面,所以不能用。比如,cdBash 命令,因此就不能用 npx cd

避免全局安裝模組

create-react-app 這個模組是全局安裝,npx 可以運行它,而且不進行全局安裝:

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

上面程式碼運行時,npxcreate-react-app 下載到一個臨時目錄,使用以後再刪除。以後再次執行上面的命令,會重新下載 create-react-app

注意,只要 npx 後面的模組無法在本地發現,就會下載同名模組。比如,本地沒有安裝 http-server 模組,下面的命令會自動下載該模組,在當前目錄啟動一個 Web 服務。

$ npx http-server

--no-install--ignore-existing 參數

如果想讓 npx 強制使用本地模組,不下載遠程模組,可以使用 --no-install 參數。如果本地不存在該模組,就會報錯。

$ npx --no-install http-server

反過來,如果忽略本地的同名模組,強制安裝使用遠程模組,可以使用 --ignore-existing 參數。

使用不同版本的 Node

可以指定某個版本的 Node 運行腳本,某些場景下,這個方法用來切換 Node 版本,要比 nvm 那樣的版本管理器方便一些。

$ npx [email protected] -v  v0.12.8

-p 參數

-p 參數用於指定 npx 所要安裝的模組,所以上一節的命令可以寫成下面這樣。

$ npx -p [email protected] node -v  v0.12.8

上面命令先指定安裝 `[email protected],然後再執行node -v` 命令。

所以開頭時的疑問 $ npx -p touch nodetouch gulpfile.js 也就解答了,就是先安裝 touch 在執行 nodetouch gulpfile.js

執行 GitHub 源碼

# 執行 Gist 程式碼  $ npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32    # 執行倉庫程式碼  $ npx github:piuccio/cowsay hellos

注意,遠程程式碼必須是一個模組,即必須包含 package.json 和入口腳本。

References:

– EOF –