- หัวข้อเปรียบเทียบหลัก: การรองรับข้ามแพลตฟอร์ม, การตั้งค่าเริ่มต้น, แหล่งที่มาของเวอร์ชัน Node, การใช้งานในชีวิตประจำวัน
Node Version Manager (NVM)
- มีดาวบน GitHub 75.2k เป็นโซลูชันยอดนิยมที่สุดสำหรับการจัดการเวอร์ชัน Node
- เปิดตัวมาตั้งแต่ช่วงแรกและได้รับความนิยมอย่างมากในชุมชน
- ยังไม่รองรับ Windows แบบสมบูรณ์ และทำงานผ่าน GitBash, Cygwin, WSL เป็นต้น
- มีแพ็กเกจแยกสำหรับ Windows ชื่อ nvm-windows แต่ไม่ใช่ NVM เอง
- รองรับเฉพาะ POSIX shell (
bash, zsh) เท่านั้น ผู้ใช้ Fish และเชลล์อื่นจึงไม่ถูกรองรับ
- ติดตั้งได้ด้วยคำสั่งง่าย ๆ
- สามารถอ่านเวอร์ชัน Node.js ที่จะใช้งานได้จากไฟล์
.nvmrc
- คำสั่ง
nvm use จะตั้งค่าเวอร์ชัน Node.js เฉพาะในเชลล์ปัจจุบันเท่านั้น ดังนั้นแม้ออกจากโฟลเดอร์โปรเจ็กต์แล้ว เวอร์ชันก็ยังคงเดิม
- จึงมีภาระที่ต้องคอยรับรู้ตลอดว่า Node.js เวอร์ชันในเชลล์ปัจจุบันคืออะไร และโปรเจ็กต์ต้องการเวอร์ชันใด
- ดีกว่าการจัดการทุกเวอร์ชันของ Node.js ด้วยตัวเอง แต่ก็ยังห่างไกลจากคำว่าผสานรวมอย่างสมบูรณ์
N
- เป็นตัวจัดการเวอร์ชัน Node.js ยอดนิยม โดยมีดาวบน GitHub 18.5k
- ไม่ใช่เครื่องมือข้ามแพลตฟอร์ม และมีข้อจำกัดมากกว่า NVM
- ไม่ทำงานบน Windows native shell, Git for Windows Bash และ Cygwin DLL
- สามารถติดตั้งได้โดยตรงผ่าน NPM หรือ Brew หรือดาวน์โหลดสคริปต์ sh มาติดตั้ง
- สามารถตรวจจับเวอร์ชัน Node ได้โดยตรงจากส่วน
"engines" ใน package.json
- หากต้องการใช้ Node.js เวอร์ชันที่ถูกต้องกับโปรเจ็กต์อื่น ก็ยังมีปัญหาที่ต้องคอยติดตามเอง
- เพราะมันจัดการเวอร์ชัน Node.js แบบ "global" ทำให้แม้ปิดเชลล์ไปแล้ว เวอร์ชัน Node ที่ใช้กับโปรเจ็กต์ล่าสุดก็ยังคงอยู่
Fast Node Manager (FNM)
- เป็นตัวจัดการเวอร์ชัน Node ที่เขียนด้วย Rust และมีดาวบน GitHub 15.2k
- เป็นตัวจัดการเวอร์ชัน Node ข้ามแพลตฟอร์มตัวแรกในรายการนี้
- รันบน Windows ได้โดยไม่ต้องติดตั้งแพ็กเกจอื่นเพิ่ม
- กระบวนการติดตั้งชัดเจนและเข้าใจง่าย
- จัดการเวอร์ชัน Node.js แยกตามแต่ละเชลล์ และถ้าโปรเจ็กต์ไม่ได้ระบุเวอร์ชันไว้ ก็จะใช้เวอร์ชัน "ค่าเริ่มต้น"
- มีฟีเจอร์สลับเวอร์ชัน Node.js อัตโนมัติตามโฟลเดอร์ แต่ต้องตั้งค่าก่อน
- เพื่อให้การสลับอัตโนมัติทำงานได้อย่างถูกต้อง ต้องติดตั้งเวอร์ชัน Node.js ที่ต้องใช้ไว้ล่วงหน้า
- ตรวจจับเวอร์ชัน Node ได้จากไฟล์
.node-version หรือ .nvmrc เท่านั้น
Volta
- มีดาวบน GitHub 10k และเป็นดาวรุ่งในโลกของตัวจัดการเวอร์ชัน
- เขียนด้วย Rust และรองรับข้ามแพลตฟอร์ม
- กระบวนการติดตั้งบนระบบตระกูล Unix ลื่นไหล
- ไม่ต้องมีไฟล์เพิ่มเติมเมื่อตั้งค่าเวอร์ชัน Node.js
- ดึงการตั้งค่าได้โดยตรงจาก
package.json
- ส่วน
"engines" อยู่ถัดจากการตั้งค่า Volta ทำให้ซิงก์เวอร์ชันได้ง่าย
- สามารถจัดการ toolchain ได้ จึงสลับได้แบบไดนามิกไม่เพียงแค่เวอร์ชัน Node.js แต่รวมถึงเวอร์ชัน Yarn ด้วย
- ทุกครั้งที่รันคำสั่งติดตั้ง จะรับประกันว่าเวอร์ชัน Node.js และ Yarn ตรงกับที่ประกาศไว้
PNPM
- แม้มักถูกมองว่าเป็นทางเลือกแทน NPM หรือ Yarn แต่ก็สามารถจัดการเวอร์ชัน Node.js ได้เช่นกัน
- รองรับข้ามแพลตฟอร์ม และมอบประสบการณ์จัดการเวอร์ชัน Node.js ที่เหมือนกันบนทุกแพลตฟอร์ม
- เนื่องจากการจัดการเวอร์ชัน Node ไม่ใช่ฟีเจอร์หลัก จึงใช้งานร่วมกับ NPM หรือ Yarn ได้ยาก
- Node.js ที่ติดตั้งด้วย PNPM จะไม่มี Corepack รวมมาให้
- จัดการเวอร์ชัน Node.js ได้แบบ global เท่านั้น ไม่สามารถตั้งค่าแยกตามเชลล์ได้
- ไม่สลับเวอร์ชัน Node.js แบบไดนามิกเมื่อย้ายระหว่างโปรเจ็กต์ จึงต้องคอยติดตามเอง
บทสรุป
- ตัวจัดการเวอร์ชัน Node.js ได้พัฒนามาอย่างมากต่อเนื่อง
- NVM เป็นโซลูชันที่เก่าแก่ที่สุดและได้รับความนิยมสูงสุด และยังคงเป็นเช่นนั้น
- แต่ ecosystem กำลังพัฒนา และมีเครื่องมือหลากหลายอย่าง N, FNM, Volta ปรากฏขึ้นมา
- ณ ตอนนี้ Volta ดูจะเป็นตัวจัดการเวอร์ชัน Node.js ที่ครบเครื่องและสมบูรณ์ที่สุด
- Volta รองรับข้ามแพลตฟอร์ม มอบประสบการณ์ใช้งานที่ลื่นไหลในชีวิตประจำวัน และยังช่วยจัดการเครื่องมืออื่นที่ใช้ในโปรเจ็กต์ได้ด้วย
4 ความคิดเห็น
เพราะการต้องมาเรียนรู้เพื่อจัดการแยกเป็นแพ็กเกจมันยุ่งยาก เลยใช้แค่
brew unlink && brew link node@14แบบนี้อยู่ครับมีทุกอย่างเยอะเกินไปจนความตั้งใจที่จะเรียนรู้อย่างจริงจังกลับ "เลือนราง"
พอนึกถึงเมื่อก่อนที่เคยคุ้ยหาไฟล์รันบนวินโดวส์ใน FileForge ก็รู้สึกว่า ถึงจะสะดวกแล้ว แต่มันจะสะดวกได้ขนาดนี้เลยหรือเนี่ย.
สำหรับผม สิ่งที่คาดหวังจากตัวจัดการเวอร์ชันไม่ใช่ประสิทธิภาพ แต่เป็นความอเนกประสงค์มากกว่า และในแง่นั้นก็ใช้งาน https://github.com/asdf-vm/asdf ได้อย่างตอบโจทย์เพียงพอครับ ขึ้นอยู่กับปลั๊กอินแล้ว มันจัดการได้ไม่ใช่แค่ node แต่รวมถึง python, ruby, golang และอื่น ๆ ได้ทั้งหมดด้วย ตอนนี้ก็ใช้งาน direnv plugin อยู่ได้ดีเหมือนกันครับ
Nodenv ก็เป็นทางเลือกที่ค่อนข้างดีเหมือนกัน แต่เสียดายที่ไม่มีการกล่าวถึง คงถูกตัดออกเพราะมี GitHub star 2.2k เลยอาจถูกมองว่าไม่ได้เป็นที่รู้จักมากนัก
เนื่องจากทำงานบนพื้นฐานของเชลล์สคริปต์ ความเข้ากันได้กับ Windows จึงค่อนข้างอ่อนเหมือนกับ NVM หรือ N แต่ข้อดีก็คือสามารถกำหนดเวอร์ชัน Node.js แบบอิงตามโฟลเดอร์แยกจากเวอร์ชัน Node.js แบบ global ได้ และยังสามารถเปิดเชลล์สภาพแวดล้อมใหม่ที่ใช้ Node.js เวอร์ชันที่กำหนดไว้ได้ด้วย