รู้จัก nvm (Node Version Manager) และการใช้งาน จบครบทุกอย่างในบล็อกเดียว
nvm หรือ Node Version Manager เป็นเครื่องมือสำหรับจัดการกับเวอร์ชันของ node ในเครื่องเรา เจ้า nvm มีความสามารถหลายอย่างมากเลยเช่น การติดตั้ง node.js เวอร์ชันต่าง ๆ โดยที่ไม่ต้องนั่งดาวน์โหลดเองและดับเบิ้ลคลิกติดตั้งทีละตัว การสลับเวอร์ชันของ node ไปใช้เวอร์ชันต่ำหรือใหม่กว่าแค่คำสั่งเดียวการรัน การสร้างนามแฝง(alias) เป็นต้น
การจะเข้าใจว่าสิ่งนี้ช่วยแก้ปัญหาชีวิตอะไร เราก็ต้องมาดูปัญหาก่อนว่าเราประสบพบเจออะไรมาบ้าง (ใครที่ไม่เจอปัญหาก็จะสามารถใช้แนวทางการแก้ปัญหานี้ไปแก้ไขกับตัวเองได้ในอนาคตครับ
บล็อกนี้ค่อนข้างที่จะยาวพอสมควรครับเพราะมีข้อมูลครบทุกอย่างที่จะสามารถไปต่อยอดใช้งานเองหรือไปสอนคนอื่นได้เลยแหล่ะ แต่ก็แลกด้วยการอ่านเยอะขึ้นนิดหน่อย ถึงตอนนี้ถ้าใครพร้อมก็ไปลุยกันเลยครับ
สารบัญ
- สถานการณ์ปัญหาที่พบ
- ล้วงลึกและรู้จักกับ nvm ให้มากขึ้น
- ติดตั้ง nvm บนระบบปฏิบัติการ linux
- ติดตั้ง nvm บนระบบปฏิบัติการ windows
- คำสั่งพื้นฐานของ nvm
- ติดตั้ง node.js ด้วย nvm
- ทดลองใช้ nvm ในโปรเจค
- รู้จักกับไฟล์ .nvmrc
- วิธีการสร้างไฟล์ .nvmrc
- สรุป
- ส่งท้าย(อันนี้ไร้สาระไม่น่าเอามาอยู่ในสารบัญ)
สถานการณ์และปัญหาที่พบ
คอมพิวเตอร์ของเรามีโปรเจค 3 โปรเจคคือ A, B และ C ซึ่งใช้ node เวอร์ชันแตกต่างกันคือ
Project A ใช้ node เวอร์ชัน 10.15.0
Project B ใช้ node เวอร์ชัน 8.15.0
Project C ใช้ node เวอร์ชัน 6.16.0
วันหนึ่งเราอยากจะทำ ProjectA ที่มี node v10.15.0 อยู่ก็ทำได้ก็แค่ลง node เวอร์ชันนี้ในเครื่องเรา แต่ถ้าหากอยากจะสลับไปทำ ProjectB ที่มี node เวอร์ชัน 8.15.0 จะทำอย่างไร ยิ่งถ้าอยากจะทำ ProjectC ที่จะต้องใช้เวอร์ชันของ node ที่เก่ามากกว่าอีกจะทำอย่างไร ?
“ใช้เวอร์ชันใหม่ครอบของเก่าไปเล๊ย” → จะรู้ได้อย่างไรว่ามันใช้ร่วมกันได้อย่างสมบูรณ์ 100%
“ลบลงใหม่สิ” → ก็ได้นะแต่เหนื่อยหน่อย … เบย์ลงให้หน่อยสิ (อันนี้ไม่เอานะครับ)
มันมีหลากหลายวิธีในการแก้ปัญหาครับซึ่งหนึ่งในวิธีที่สามารถใช้ได้ก็คือ container เอาล่ะท่านเทพทั้งหลายอย่างพึ่งด่าผมนะครับว่าทำไมไม่ใช้ จริง ๆ แล้วมันใช้ได้ครับแต่ผมอยากจะเสนอวิธีใหม่ ๆ ในการแก้ปัญหาในกรณีแบบนี้ และไม่เปลืองพื้นที่ในการเก็บ images เปลืองเวลาในการ build เท่า container ด้วยเอ๊อเอาสิ! ฉะนั้นเราจึงต้องมารู้จักกับ nvm ให้มากขึ้น
ล้วงลึกและรู้จักกับ nvm ให้มากขึ้น
หากใครต้องการที่อยากรู้วิธีการทำงานก็สามารถอ่านได้ที่หัวข้อนี้แต่ถ้าไม่อยากอ่านก็ข้าม ๆ ไปได้ครับ
nvm หรือ Node Version Manager ถูกสร้างขึ้นเพื่อแก้ไขปัญหาข้างต้นครับ เจ้า nvm สามารถทำให้เครื่องเราสามารถมีและใช้ node หลากหลายเวอร์ชันในเครื่องเดียว น่าสนใจมากที่มันถูกสร้างมาจาก bash script เท่านั้น หากใครสนใจก็สามารถเข้าไปดู source code ได้ที่ https://github.com/creationix/nvm โดยจะมีไฟล์ที่น่าสนใจก็คือไฟล์นี้ (อ๋อแล้วผมพึ่งเห็นมันมี Dockerfile ด้วย น่าสนใจมากแต่ผมยังไม่ได้ดูนะ)
หัวข้อนี้คงจบแค่นี้ครับเพราะมันต้องไปศึกษาต่อเอง 555 เราจะข้ามไปถึงวิธีติดตั้งและวิธีการใช้งานในหัวข้อหน้ากันเลยดีกว่า
ติดตั้ง nvm บนระบบปฏิบัติการ Linux
การติดตั้งบน linux สามารถทำได้ง่าย ๆ 2 วิธีการคือ (จริง ๆ แล้วชาว macOS สามารถลงด้วย brew ได้นะแต่เค้าไม่แนะนำผมพึ่งโดนจวกมาเอง 555)
1.) ใช้ curl
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
2.) ใช้ wget
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
เมื่อติดตั้งเสร็จเรียบร้อยแล้วเวลาพิมพ์ nvm จะได้ประมาณนี้
ติดตั้ง nvm บนระบบปฏิบัติการ windows
แต่เดิม nvm มีเฉพาะบน linux เท่านั้นนะครับแต่ชาว windows ก็อย่าพึ่งน้อยใจไปนะมีคนเค้า port ลงมาใน windows ให้ด้วยแหละ สามารถเข้าอ่านและดาวน์โหลดได้ที่นี่แล้วกด next … next ได้เลย แต่ถ้าหากใครใช้ choco ก็สามารถพิมพ์คำสั่งง่าย ๆ ได้เหมือน linux choco install nvm
หรือ choco install nvm.portable
แต่อย่างไรก็ตามเค้า port มาใน windows ก็ไม่ใช่ว่าจะใช้ได้ครบทุกฟังก์ชันนะครับ หากใครต้องการช่วยทำอะไรก็สามารถเข้าดูได้ที่
คำสั่งพื้นฐานของ nvm
หลังจากที่เราทำการลง nvm เสร็จแล้วเราก็จะมาดาวน์โหลดตัว node.js มาลงกันครับโดยเครื่องที่ผมสาธิตจะใช้เครื่อง mac นะครับ จะมีคำสั่งที่ใช้ประจำอยู่ไม่กี่คำสั่งหรอกครับมาดูกันดีกว่า
nvm ls
คำสั่งนี้จะเป็นการแสดงเวอร์ชันของ node.js ที่เราดาวน์โหลดลงมาในเครื่องแล้ว
nvm ls-remote
คำสั่งนี้เป็นการแสดงเวอร์ชัน node.js ออกมาทางหน้าจอ การแสดงผลทั้งหมดจะนานหน่อยถ้าใครลองแล้วอย่าพึ่งคิดว่าเครื่องค้างนะครับ เลขต่าง ๆ ที่แสดงออกมาทางหน้าจอคือเวอร์ชันที่เราสามารถดาวน์โหลดได้โดยใช้คำสั่ง nvm install <version>
nvm install <node version>
คำสั่งนี้จะเป็นดาวน์โหลด node และ dependencies ต่าง ๆ จากอินเทอร์เน็ตลงมาสู่เครื่องของเรา โดยเลขเวอร์ชันที่สามารถดาวน์โหลดได้จะมาจากคำสั่ง nvm ls-remote
นั่นเอง
nvm install v10.15.0
หมายความว่าให้ดาวน์โหลด node js v10.15.0 มาลงเครื่อง ข้อดีของวิธีนี้ก็คือสามารถดาวน์โหลดเฉพาะเวอร์ชันให้ตรงกับที่ต้องการได้ แต่ข้อเสียก็คือถ้ามีเวอร์ชันอัพเดทใหม่เราก็ต้องไปดูเลขเวอร์ชันใหม่เอง หรือมีอีกวิธีหนึ่งก็คือคำสั่งด้านล่างครับ
nvm install --lts
หมายความว่าดาวน์โหลด node เวอร์ชัน lts (lts คือเวอร์ชันที่มีการสนับสนุนยาว ๆ ครับเช่น การแก้บัค การเพิ่มฟีเจอร์ใหม่เป็นต้อน) ข้อดีของวิธีนี้ก็คือ สามารถลงเวอร์ชัน LTS ล่าสุดได้เลยโดยไม่ต้องมานั่งอัพเดทเลขเวอร์ชันเอง
nvm use <node version>
คำสั่งนี้เป็นการใช้ node version ใดใดก็ตามที่อยู่ในเครื่องของเรา(เวลาดูเวอร์ชันที่อยู่ในเครื่องของเรามาจากคำสั่ง nvm ls
)
nvm alias <alias name> <node version>
คำสั่งนี้จะเป็นการสร้าง alias ให้กับ node ของเรา (alias คือนามแฝงครับ เช่น เราเรียก “ตู่” ก็จะสื่อถึงคนที่ชื่อ … ถ้าเราตั้งชื่อ ProjectB เป็น alias ซึ่งใช้ node v8.15.0 เราก็จะสามารถใช้ nvm use ProjectC
ก็จะไปใช้คำสั่ง nvm use v8.15.0
วิธีการสร้างจะออกคำสั่งประมาณนี้ครับในที่นี้เราจะสร้างคำว่า ProjectB
ให้ไปใช้ node v8.15.0 เราก็จะสั่ง alias nvm alias ProjectC v8.15.0
nvm alias
เป็นการแสดงรายการ alias ทั้งหมดในเครื่องเรา(ดังภาพด้านบน)
nvm unalias <alias name>
ก่อนหน้านี้เราสร้าง alias ให้กับ ProjectB กัน ถ้าเราอยากลบ alias ล่ะ? คำสั่งง่าย ๆ สำหรับการลบ ProjectB ที่เป็น alias กับ v8.15.0 สาารถสั่งคำสั่ง nvm unalias ProjectB
nvm run <node version or alias> <file name>
คำสั่งสนี้น่าสนใจมากครับหากเรามีหลายเวอร์ชันติดตั้งอยู่และไม่อยากสลับโดยใช้ nvm use <version>
ไปมาเราก็เลยสามารถใช้คำสั่งนี้ในการรันเวอร์ชันที่ต้องการได้ครับ เช่น ผมมีไฟล์ app.js
ที่มีเนื้อหาแค่นี้
# app.js
console.log(process.version) # print running of node version
และทดสอบด้วยคำสั่ง nvm run v10.15.0
และ nvm run v8.15.0
จะได้ผลลัพธ์ดังนี้
ติดตั้ง node.js ด้วย nvm
เรามีความรู้พื้นฐานของคำสั่งต่าง ๆ กันแล้วต่อไปเราจะใช้คำสั่งต่าง ๆ ในการใช้งาน nvm จริง ๆ กันสักที ก่อนหน้านี้เราพูดไปแล้วว่าสามารถดาวน์โหลดได้โดยใช้เลขเวอร์ชันที่ได้มาจาก nvm ls-remote
ตอนที่ผมเขียนบล็อกอยู่นี้ node.js เวอร์ชัน lts ล่าสุดอยู่ที่ v10.15.0
ก็จะใช้คำสั่ง nvm install v10.15.0
และรอมันดาวน์โหลดและติดตั้งเพียงอึดใจเดียวทีนี้เครื่องเราก็จะมี node.js v10.15.0 ละครับ เมื่อดาวน์โหลดมาแล้วรู้สึกว่าเค้าจะ nvm use <เวอร์ชันที่ดาวน์โหลดมา>
ให้โดยอัตโนมัติ
ถึงตอนนี้ชาว macOS ถ้าใครจะใช้ yarn แทน npm ก็สามารถใช้คำสั่ง
$ brew install yarn --without-node
เพื่อลงแต่ yarn อย่างเดียวไม่เอา node เพราะ node เราลงด้วย nvm แล้ว
ทดลองใช้ nvm ในโปรเจค
รู้จักกับไฟล์ .nvmrc
ถ้าเกิดเราไปเห็นไฟล์ที่ชื่อ .nvmrc
ยกตัวอย่างที่ใกล้ ๆ ตัวเราเช่น Visual Studio Code นี่แหละ ถ้าเราเข้าไปจะเห็นไฟล์หนึ่งที่ชื่อ .nvmrc
เจ้าไฟล์นี้จะบ่งบอกว่า node.js ที่ใช้ในการ develop เป็นเวอร์ชันอะไร สิ่งที่เราสามารถทำได้ก็เปิด terminal แล้วพิมพ์คำสั่ง nvm use
(ปกติคำสั่งนี้จะต้องพิมพ์เลขเวอร์ชันใช่ไหมครับ แต่ถ้าเรามีไฟล์นี้เจ้าตัว nvm ก็จะมาอ่านที่ไฟล์นี้แล้วไปใช้ node เวอร์ชันนั้นครับ แต่ถ้าไม่มีมันก็จะบอกให้เราดาวน์โหลดมาโดยใช้คำสั่ง nvm install <version>
เราก็ดาวน์โหลดลงและพิมพ์คำสั่ง nvm use
ใหม่ก็จะใช้ได้แล้วล่ะ
วิธีการสร้างไฟล์ .nvmrc
ไฟล์ .nvmrc ทำให้เราทราบว่าโปรเจคนั้นใช้ node เวอร์ชันอะไรในการพัฒนา ถ้าเราไปใช้เวอร์ชันที่ไม่ตรงกันหรือเก่ากว่าอาจส่งผลให้โปรแกรมเราไม่เป็นไปตามที่คาดหวังครับ ฉะนั้นเราจึงจำเป็นต้องเรียนรู้วิธีการสร้างไฟล์ .nvmrc
การสร้างไฟล์มีสามารถสร้างได้หลายแบบ (อ้างอิงจาก document)
ถ้าคุณใช้ linux ดีใจด้วยครับเราคุยกันได้ ซึ่งหนึ่งในวิธีง่ายและแนะนำก็คือไปที่ folder นอกสุดของ project แล้วใช้คำสั่ง (ถ้าเป็น windows ก็สร้างไฟล์แล้วก็พิมพ์เอาเองนะ)
node -v > .nvmrc
หรือว่าถ้าอยากจะปรับเป็นเวอร์ชันอื่น
$ echo "5.9" > .nvmrc # ให้ใช้เวอร์ชันของ node เป็นเวอร์ชัน 5.9 เสมอ
$ echo "lts/*" > .nvmrc # ให้ใช้เวอร์ชัน lts ล่าสุดเสมอ
$ echo "node" > .nvmrc # ให้ใช้เวอร์ชันของ node เป็นเวอร์ชันล่าสุด
สรุป
nvm สามารถเข้ามาช่วยแก้ปัญหาสภาพแวดล้อมที่ต่างกันของโปรเจคที่ใช้ node ในการพัฒนาได้อย่างดีเยี่ยม แต่หากต้องอาศัยความรู้พื้นฐานในการใช้ cli และการลงโปรแกรมซักนิดหนึ่ง แต่หากใช้จนคล่องแล้วมันจะช่วยให้ชีวิตเราง่ายขึ้นเยอะมากครับ ไม่ต้องไปใช้คอนเทนเนอร์ให้เสียพื้นที่หน่วยความจำ harddisk และ ram ให้(อันนี้หยอกหยอกนะครับ ผมเป็น fc พี่ปลาวาฬเลยแหละ)
ส่งท้าย
ป.ล. ตอนแรกบล็อกนี้กะจะเขียนแค่เบื้องต้นแบบให้ไปงม ๆ กันเองแต่ผมเห็นคำสั่งบางอย่างที่น่าสนใจเยอะมากเข้า เฃบเขียนให้มันสุดไปเลยละกัน ขอให้สนุกกับการอ่านบทความต่อ ๆ ไปครับ