JavaScript >> Javascript 文檔 >  >> Node.js

Node.js 環境管理器的比較

在處理 JavaScript 項目時經常出現的一個麻煩事與管理構建或運行項目所需的不同版本的工具有關。這基本上歸結為這樣一個事實,即不同的項目對其依賴項有不同的版本要求。例如,一個新建項目可能需要最新版本的 Node.js,因為它使用了一項實驗性功能,而一個舊項目可能依賴於已棄用的功能,使其無法在較新的版本上運行。

安裝不同版本的 Node.js 或其他包通常涉及卸載當前版本,然後安裝所需的版本,然後在項目之間切換時一遍又一遍地重複此過程。這就是虛擬環境管理器的價值主張變得顯而易見的地方。它們提供了一個隔離的環境,允許安裝多個版本的軟件包,以便在項目中輕鬆使用特定版本的軟件包,而不會影響依賴於同一軟件包不同版本的其他應用程序。

在本文中,我們將研究一些最常見的 Node.js 虛擬環境管理器,並描述它們的特性,以及每一個的優缺點。閱讀本文後,您將有足夠的上下文來選擇最適合您需求的正確環境管理器!

1.節點版本管理器 (NVM)

Node 版本管理器是在 Linux 或 macOS 系統上安裝、升級和管理 Node.js 版本的最流行方式。通過它的安裝腳本安裝NVM後,它會修改你的shell配置文件,比如.bashrc.zshrc , 在每個後續的 shell 調用中正確加載。一旦 nvm 命令可用,您可以通過輸入 nvm install node 使用它來安裝最新的 Node.js 版本 在終端上。

NVM 支持同時安裝多個版本的 Node.js,並且可以在您已安裝的不同版本之間輕鬆切換。您可以通過將版本號指定到 install 來安裝特定的 Node.js 版本 子命令,你可以通過use在安裝的版本之間切換 子命令。以下是一些您可能想要查看的有用 NVM 命令:

$ nvm install 16.6.2 # install Node.js v16.6.2
$ nvm use 16.5.0 # switch to version 16.5.0 on the current shell instance
$ nvm alias default 16.6.2 # set the default version for new shell instances
$ nvm ls-remote # list all available versions
$ nvm ls # list all installed versions
$ nvm # view nvm usage information

使用 NVM 在操作系統的包管理器上安裝 Node.js 的優勢之一是能夠在沒有提升權限的情況下全局安裝 npm 包。這意味著您不再需要使用 sudo 為全局安裝軟件包的命令添加前綴 .全局包的範圍為當前的 Node.js 版本並安裝到 $HOME/.nvm/versions/node/<version>/bin/ .當您切換到不同的 Node.js 版本時,這會使它們無法訪問。為了解決這個問題,NVM 提供了一種在安裝不同版本的同時遷移全局包的方法。

NVM 的功能非常出色,但也有一些缺點。例如,它只支持 POSIX 兼容的 shell,例如 bash 或 zsh,讓流行的 Fish shell 的用戶望而卻步。也缺乏對 Windows 的支持,除非您使用 Windows 子系統 for Linux (WSL) 或像 Cygwin 這樣的項目。還觀察到 NVM 將 shell 初始化減慢了幾毫秒,這在某些系統上可能很明顯。與此列表中的其他一些選項相比,這些都是不使用 NVM 的原因。

2. N

奇怪地命名的 n 項目是在單台機器上管理多個 Node.js 版本的另一種流行方式。 n 是一個node.js模塊,所以可以通過npm安裝 .這意味著從 npm 開始需要現有的 Node.js 安裝(可能由操作系統的包管理器提供)來安裝它 通常與 Node.js 一起提供。還有一些第三方安裝程序可以幫你安裝n 無需 Node.js 或 npm .

一旦你下載了 n ,您可以使用它來安裝、升級和管理 Node.js 版本。它通過將特定版本的預構建二進製文件下載(和緩存)到 n/versions/node 來工作 /usr/local 內的目錄 然後將其安裝到 /usr/local/bin 目錄,它具有覆蓋任何現有版本的效果。請注意,您可能需要使用 sudo 使用 n 時 安裝 Node.js 版本以避免權限錯誤。避免使用 sudo 的一些準則 對於 nnpm 項目的 README 文檔中提供了全局安裝。

與 NVM 相比,n 管理 Node.js 版本的方法的主要優點是全局 npm 在不同版本的 Node.js 之間切換時,包不受影響。另一方面,NVM 通過它的 nvm use 讓你可以在不同的終端使用不同的 Node.js 版本 命令,而 n 才不是。切換到不同的 Node.js 版本後,更改會在系統範圍內反映出來。您可以使用 n use 解決此問題 子命令來調用特定的 Node.js 二進製文件而不切換到該版本。這在執行一次性腳本執行時會派上用場。

$ cat index.js
console.log(`Current Node.js version is: ${process.version}`);
$ node --version
v16.7.0
$ node index.js
Current Node.js version is: v16.7.0
$ n use 16.6.2 index.js
Current Node.js version is: v16.6.2

3.快速節點管理器 (FNM)

Fast Node Manager 是一個用 Rust 編寫的跨平台 Node.js 版本管理器,聲稱比 NVM 快 40 倍,同時提供大部分相同的功能。與它的前身不同,也許由於它的 Rust 起源,它同時支持 Windows (Powershell) 和 Fish shell,使其適用於更廣泛的用戶。

安裝 FNM 後,其用法類似於 NVM。您可以在此 GitHub 文檔中查看該工具提供的所有可用命令。

$ fnm ls-remote # list remote Node.js versions
$ fnm install 16.5.0 # install a specific version
$ fnm use 14.17.5 # switch Node.js version
$ fnm ls # list installed versions
$ fnm default <version> # set a default version

FNM 在 $HOME/.fnm/node-versions 中安裝 Node.js 二進製文件 目錄並在 /tmp/fnm_multishells 中符號鏈接它們 shell 啟動時的目錄,以便您可以為每個 shell 使用不同的 Node.js 版本。全局包的行為也與 NVM 相同,這意味著它們與特定版本的 Node.js 綁定,一旦當前的 Node.js 版本更改為不同的版本,它們將無法訪問。

從 NVM 或其他版本管理器遷移到 FNM 應該是無縫的,因為它支持 .node-version 和 .nvmrc 文件格式,用於為項目設置正確的 Node.js 版本。一旦任一文件存在於目錄中,您就可以運行 fnm use 更改為指定的 Node.js 版本。如果沒有安裝該版本,系統會提示您安裝它。

更改目錄時自動切換 Node.js 版本也是可能的,儘管它涉及一些額外的設置。你需要運行 fnm env --use-on-cd 打印出設置自動切換所需的腳本,然後將其複製到相應的配置文件(.bashrc , config.fish 等)為您的外殼。之後,它應該可以無縫運行,沒有任何可察覺的開銷。

4.伏特

Volta 是一個相對較新的 JavaScript 工具管理器,它不僅僅是安裝和管理 Node.js 版本。和 FNM 一樣,它是用 Rust 編寫的,它同時支持 Unix 系統和 Windows。安裝 Volta 非常簡單;為 Unix 系統提供腳本,為 Windows 提供安裝程序。

Volta 的主要價值主張是它可以通過跟踪基於項目的 package.json 所需的確切包版本來管理整個 JavaScript 工具鏈 文件。在底層,Volta 使用 shim 路由到工具的正確版本,並使用適當的 Node.js 引擎執行它。例如,Node.js 包可以通過其 install 為當前用戶全局安裝 命令:

$ volta install [email protected]
success: installed and set [email protected] as default
$ volta install jest
success: installed [email protected] with executables: jest
$ volta install typescript
success: installed [email protected] with executables: tsc, tsserver

每個工具的二進製文件都下載到 .volta/bin Unix 系統上用戶主目錄中的目錄。在 Windows 上,下載的二進製文件的位置可能會因您安裝 Volta 的方式而異。使用 Volta 安裝軟件包後,您將能夠直接在終端中運行它,就像您通過 npm 全局安裝它一樣 .當您更改為與依賴包具有相同包的項目時,Volta會自動無縫切換到本地安裝的版本,以保證兼容性。

$ tsc --version
Version 4.3.5
$ cd node_project
$ cat package.json | grep 'typescript'
  "typescript": "^4.0.8",
$ tsc --version
Version 4.0.8

請注意我們如何在不更改正在運行的命令的情況下獲得正確的版本。這是 Volta 與之前研究過的環境管理器相比的主要優勢之一。如果您選擇通過 npm 全局安裝軟件包,此功能也同樣適用 或 yarn 而不是 volta install . Volta 將根據需要在全局和本地安裝的變體之間自動切換。

您還可以使用 Volta 安裝和管理 Node.js 版本。下面的命令將安裝最新版本的 Node.js。如果您省略 @latest 後綴,則將下載最新的 LTS 版本。

$ volta install node@latest
success: installed and set [email protected] (with [email protected]) as default

安裝指定的 Node.js 版本後,它也會隨後設置為全局默認值,如上面的命令輸出所示。如果您想保證針對項目使用特定的 Node.js 版本,可以使用 Volta 通過其 pin 指定所需的版本 子命令:

$ volta pin [email protected]
success: pinned [email protected] (with [email protected]) in package.json

這會將以下條目添加到項目的 package.json 文件:

"volta": {
  "node": "14.17.5"
}

有了上述條目,任何使用 Volta 的人都將自動獲得 package.json 中指定的正確 Node.js 版本 當他們 cd 進入項目目錄。如果本地沒有對應的Node.js版本,則直接下載安裝。

$ node --version
v16.7.0
$ cd node_project
$ cat package.json | grep 'volta' -A 2
  "volta": {
    "node": "14.17.5"
  },
$ node --version
v14.17.5

5.阿斯達夫

與迄今為止討論的所有其他工具不同,Asdf 並非特定於 Node.js 生態系統。它是一個基於每個項目管理多個語言運行時版本的工具,旨在替換特定語言的環境管理器,例如 nvm , rbenv , 和 pyenv .如果您用多種語言開發應用程序,並且需要一種更有效的方式來管理每種語言的環境,而不是同時使用幾種不相關的工具,那麼 Asdf 可能是您的正確選擇。

Asdf 僅支持 Linux 和 macOS,因此您將無法在 Windows 上使用它,除非通過 WSL。安裝核心 CLI 後,您需要為您感興趣的語言安裝插件。Asdf 為 Node.js、Ruby、Elixir 和 Erlang 提供第一方插件,而其他語言通過社區驅動支持插件。這是為 Asdf 安裝 Node.js 插件所需的命令:

$ asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

一旦你安裝了相關插件,你就可以安裝該工具的一個版本,例如最新版本的 Node.js:

$ asdf install nodejs latest

設置默認的Node.js版本可以通過Asdf的global來實現 子命令:

$ asdf global nodejs latest

這會將以下行添加到 $HOME/.tool-versions 文件:

$ cat ~/.tool-versions
nodejs 16.7.0
$ which node
/home/<user>/.asdf/shims/node

如果你依賴全局 npm 包,你可以在 $HOME/.default-npm-packages 中指定它們 以便在安裝每個 Node.js 版本後自動安裝它們:

$ cat ~/.default-npm-packages
create-react-app
eslint
@ayoisaiah/f2

要在項目中使用特定版本的 Node.js,您需要運行 asdf local nodejs <version> 在項目目錄中。如果沒有安裝版本,需要先用asdf install nodejs <version>安裝 .之後,一旦你 cd,Asdf 會自動切換到本地節點版本 進入項目目錄。

asdf 也理解 .nvmrc.node-version ,因此從其他環境管理器遷移應該是輕而易舉的事。您需要將以下行添加到您的 $HOME/.asdfrc 文件以確保 Asdf 可以從兩個文件中讀取:

legacy_version_file = yes

結論

我們在本文中介紹了許多環境管理器,很明顯它們都具有相似的功能集,但實現略有不同。無論您選擇哪個選項,您都可以根據需要在不同版本的 Node.js 之間輕鬆切換,升級到最新版本將變得輕而易舉。

我建議使用 Volta,因為它具有根據項目需求輕鬆在包的多個版本之間切換的獨特能力,並且它支持所有主要操作系統。如果您傾向於使用多種語言,Asdf 可能是一個更好的選擇,如果您想要一個更快的 NVM 替代方案,並且還支持 Windows,那麼 FNM 是一個不錯的選擇。還有其他選項,例如 nvs 和 nodeenv。如果本文中討論的選項都不適合您,請隨時查看它們。

如果您有任何關於 Node.js 環境管理器的其他提示,請隨時在 Twitter 上分享。感謝閱讀,祝您編碼愉快!


Tutorial JavaScript 教程
  1. 10 款適用於 Web 開發人員的免費 Android 應用

  2. 五分鐘可訪問性:輸入和標籤

  3. 帶有 Bootstrap4 和 Jquery 的響應式導航欄

  4. 使用 knockout.js 進入擂台:第 2 部分 - 複賽

  5. 開發者控制台

  6. React Formik 和 Yup 入門

  7. JS:數字和空格的正則表達式?

  1. 我如何使用帶有 GSAP 的滾動動畫來改進我的主頁

  2. 刷新頁面後div總是上移

  3. Webpack:如何創建動態輸入和輸出路徑

  4. 使用 Node-Webkit 和 AngularJS 創建一個選項卡式瀏覽器

  5. 如何在字符串數組中搜索字符串

  6. 在下拉選擇中隱藏或顯示輸入

  7. 在 React 中使用 Portal

  1. JavaScript:在解構中跳過值

  2. TypeScript 教程:學習 TypeScript 的分步指南

  3. JavaScript 參考指南:JS 模塊生態系統

  4. 這個簡單的數學技巧讓您無需任何 if 語句即可創建圖像輪播