รู้จัก nvm (Node Version Manager) และการใช้งาน​ จบครบทุกอย่างในบล็อกเดียว

Ayuth Mangmesap
Ayuth’s Story
4 min readJan 19, 2019

--

http://seanamarasinghe.com/wp-content/uploads/2016/02/nvm-1050x360.jpg

nvm หรือ Node Version Manager เป็นเครื่องมือสำหรับจัดการกับเวอร์ชันของ node ในเครื่องเรา เจ้า nvm มีความสามารถหลายอย่างมากเลยเช่น การติดตั้ง node.js เวอร์ชันต่าง ๆ โดยที่ไม่ต้องนั่งดาวน์โหลดเองและดับเบิ้ลคลิกติดตั้งทีละตัว การสลับเวอร์ชันของ node ไปใช้เวอร์ชันต่ำหรือใหม่กว่าแค่คำสั่งเดียวการรัน การสร้างนามแฝง(alias) เป็นต้น

การจะเข้าใจว่าสิ่งนี้ช่วยแก้ปัญหาชีวิตอะไร เราก็ต้องมาดูปัญหาก่อนว่าเราประสบพบเจออะไรมาบ้าง (ใครที่ไม่เจอปัญหาก็จะสามารถใช้แนวทางการแก้ปัญหานี้ไปแก้ไขกับตัวเองได้ในอนาคตครับ

บล็อกนี้ค่อนข้างที่จะยาวพอสมควรครับเพราะมีข้อมูลครบทุกอย่างที่จะสามารถไปต่อยอดใช้งานเองหรือไปสอนคนอื่นได้เลยแหล่ะ แต่ก็แลกด้วยการอ่านเยอะขึ้นนิดหน่อย ถึงตอนนี้ถ้าใครพร้อมก็ไปลุยกันเลยครับ

สารบัญ

  1. สถานการณ์ปัญหาที่พบ
  2. ล้วงลึกและรู้จักกับ nvm ให้มากขึ้น
  3. ติดตั้ง nvm บนระบบปฏิบัติการ linux
  4. ติดตั้ง nvm บนระบบปฏิบัติการ windows
  5. คำสั่งพื้นฐานของ nvm
  6. ติดตั้ง node.js ด้วย nvm
  7. ทดลองใช้ nvm ในโปรเจค
  8. รู้จักกับไฟล์ .nvmrc
  9. วิธีการสร้างไฟล์ .nvmrc
  10. สรุป
  11. ส่งท้าย(อันนี้ไร้สาระไม่น่าเอามาอยู่ในสารบัญ)

สถานการณ์และปัญหาที่พบ

เครื่องคอมพิวเตอร์ที่มีโปรเจค A ใช้ node.js เวอร์ชัน 10.15.0 โปรเจค B ใช้ node.js เวอร์ชัน 8.15.0 และโปรเจค C ที่ใช้ node.js เวอร์ชัน 6.16.0

คอมพิวเตอร์ของเรามีโปรเจค 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 เพื่อทดสอบว่าเราลง nvm สำเร็จแล้วหรือไม่ ถ้าสำเร็จแล้วจะขึ้นรายละเอียดดังตัวอย่างดังนี้

ติดตั้ง nvm บนระบบปฏิบัติการ windows

แต่เดิม nvm มีเฉพาะบน linux เท่านั้นนะครับแต่ชาว windows ก็อย่าพึ่งน้อยใจไปนะมีคนเค้า port ลงมาใน windows ให้ด้วยแหละ สามารถเข้าอ่านและดาวน์โหลดได้ที่นี่แล้วกด next … next ได้เลย แต่ถ้าหากใครใช้ choco ก็สามารถพิมพ์คำสั่งง่าย ๆ ได้เหมือน linux choco install nvm หรือ choco install nvm.portable

https://chocolatey.org/packages?q=nvm

แต่อย่างไรก็ตามเค้า port มาใน windows ก็ไม่ใช่ว่าจะใช้ได้ครบทุกฟังก์ชันนะครับ หากใครต้องการช่วยทำอะไรก็สามารถเข้าดูได้ที่

คำสั่งพื้นฐานของ nvm

หลังจากที่เราทำการลง nvm เสร็จแล้วเราก็จะมาดาวน์โหลดตัว node.js มาลงกันครับโดยเครื่องที่ผมสาธิตจะใช้เครื่อง mac นะครับ จะมีคำสั่งที่ใช้ประจำอยู่ไม่กี่คำสั่งหรอกครับมาดูกันดีกว่า

ผลลัพธืการออกคำสั่ง nvm ls

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 หลังจากสร้างชื่อ ProjectB ให้ไปแมพกับ v8.15.0

nvm alias เป็นการแสดงรายการ alias ทั้งหมดในเครื่องเรา(ดังภาพด้านบน)

nvm unalias <alias name> ก่อนหน้านี้เราสร้าง alias ให้กับ ProjectB กัน ถ้าเราอยากลบ alias ล่ะ? คำสั่งง่าย ๆ สำหรับการลบ ProjectB ที่เป็น alias กับ v8.15.0 สาารถสั่งคำสั่ง nvm unalias ProjectB

ใช้คำสั่ง nvm unalias ในการลบ alias ที่ชื่อ 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 จะได้ผลลัพธ์ดังนี้

การรันไฟล์ app.js ด้วย node เวอร์ชันที่ต่างกันด้วยคำสั่ง nvm run

ติดตั้ง node.js ด้วย nvm

เรามีความรู้พื้นฐานของคำสั่งต่าง ๆ กันแล้วต่อไปเราจะใช้คำสั่งต่าง ๆ ในการใช้งาน nvm จริง ๆ กันสักที ก่อนหน้านี้เราพูดไปแล้วว่าสามารถดาวน์โหลดได้โดยใช้เลขเวอร์ชันที่ได้มาจาก nvm ls-remote

https://nodejs.org/en/

ตอนที่ผมเขียนบล็อกอยู่นี้ 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 ในโปรเจค

ภาพ gif แสดงถึงโปรเจค 3 โปรเจคคือ A, B และ C ที่ใช้ node เวอร์ชันต่างกันในการพัฒนาแต่สามารถสลับเวอร์ชันของ node ไปมาด้วยไฟล์ .nvmrc ที่บ่งบอกถึงเบอร์ชัน และใช้ nvm use ในการเปลี่ยนเวอร์ชัน

รู้จักกับไฟล์ .nvmrc

ถ้าเกิดเราไปเห็นไฟล์ที่ชื่อ .nvmrc ยกตัวอย่างที่ใกล้ ๆ ตัวเราเช่น Visual Studio Code นี่แหละ ถ้าเราเข้าไปจะเห็นไฟล์หนึ่งที่ชื่อ .nvmrc

https://github.com/Microsoft/vscode
https://github.com/Microsoft/vscode/blob/master/.nvmrc

เจ้าไฟล์นี้จะบ่งบอกว่า node.js ที่ใช้ในการ develop เป็นเวอร์ชันอะไร สิ่งที่เราสามารถทำได้ก็เปิด terminal แล้วพิมพ์คำสั่ง nvm use (ปกติคำสั่งนี้จะต้องพิมพ์เลขเวอร์ชันใช่ไหมครับ แต่ถ้าเรามีไฟล์นี้เจ้าตัว nvm ก็จะมาอ่านที่ไฟล์นี้แล้วไปใช้ node เวอร์ชันนั้นครับ แต่ถ้าไม่มีมันก็จะบอกให้เราดาวน์โหลดมาโดยใช้คำสั่ง nvm install <version> เราก็ดาวน์โหลดลงและพิมพ์คำสั่ง nvm use ใหม่ก็จะใช้ได้แล้วล่ะ

วิธีการสร้างไฟล์ .nvmrc

ไฟล์ .nvmrc ทำให้เราทราบว่าโปรเจคนั้นใช้ node เวอร์ชันอะไรในการพัฒนา ถ้าเราไปใช้เวอร์ชันที่ไม่ตรงกันหรือเก่ากว่าอาจส่งผลให้โปรแกรมเราไม่เป็นไปตามที่คาดหวังครับ ฉะนั้นเราจึงจำเป็นต้องเรียนรู้วิธีการสร้างไฟล์ .nvmrc

การสร้างไฟล์มีสามารถสร้างได้หลายแบบ (อ้างอิงจาก document)

ถ้าคุณใช้ linux ดีใจด้วยครับเราคุยกันได้ ซึ่งหนึ่งในวิธีง่ายและแนะนำก็คือไปที่ folder นอกสุดของ project แล้วใช้คำสั่ง (ถ้าเป็น windows ก็สร้างไฟล์แล้วก็พิมพ์เอาเองนะ)

หรือว่าถ้าอยากจะปรับเป็นเวอร์ชันอื่น

Create a .nvmrc file command from https://github.com/creationix/nvm#nvmrc
$ echo "5.9" > .nvmrc # ให้ใช้เวอร์ชันของ node เป็นเวอร์ชัน 5.9 เสมอ

$ echo "lts/*" > .nvmrc # ให้ใช้เวอร์ชัน lts ล่าสุดเสมอ

$ echo "node" > .nvmrc # ให้ใช้เวอร์ชันของ node เป็นเวอร์ชันล่าสุด

สรุป

Image result for node nvm
https://cdn-images-1.medium.com/max/1600/1*XeFELjfQfDkPL-s7dE9-CQ.png

nvm สามารถเข้ามาช่วยแก้ปัญหาสภาพแวดล้อมที่ต่างกันของโปรเจคที่ใช้ node ในการพัฒนาได้อย่างดีเยี่ยม แต่หากต้องอาศัยความรู้พื้นฐานในการใช้ cli และการลงโปรแกรมซักนิดหนึ่ง แต่หากใช้จนคล่องแล้วมันจะช่วยให้ชีวิตเราง่ายขึ้นเยอะมากครับ ไม่ต้องไปใช้คอนเทนเนอร์ให้เสียพื้นที่หน่วยความจำ harddisk และ ram ให้(อันนี้หยอกหยอกนะครับ ผมเป็น fc พี่ปลาวาฬเลยแหละ)

ส่งท้าย

ป.ล. ตอนแรกบล็อกนี้กะจะเขียนแค่เบื้องต้นแบบให้ไปงม ๆ กันเองแต่ผมเห็นคำสั่งบางอย่างที่น่าสนใจเยอะมากเข้า เฃบเขียนให้มันสุดไปเลยละกัน ขอให้สนุกกับการอ่านบทความต่อ ๆ ไปครับ

References

--

--