วิธีติดตั้ง Node.js บนเครื่องที่ใช้ CPU Apple Silicon M1
Table of contents
Intro
สวัสดีปีใหม่ครับ นี่เป็นบทความแรกของปี 2022 จากการห่างหายการเขียน Blog ไปนานเลย เพราะผมเองก็เพิ่งจะทำให้ตัวเองว่างได้ และมีเว ลามาเขียนจริงจังครับ 😄
เนื่องจากผมเพิ่งได้รับ Macbook Pro เครื่องใหม่ที่ใช้ CPU ที่เปลี่ยนสถาปัตยกรรมใหม่เป็น ARM หรือ ที่เรียกคุ้น ๆ กันคือ Apple Silicon M1 🎉
ผมมีความตื่นเต้นมากที่จะได้ทดสอบเครื่องใหม่หลาย ๆ อย่างเกี่ยวกับ CPU Apple M1 นี้ และจะพยายามเอามาเขียนลงไว้ใน Blog นี้ให้ได้อ่านกันครับ 😊
โดยเนื้อหานี้หวังว่าจะช่วยให้ Dev ที่เขียนภาษา JavaScript ให้มีความเข้าใจ และการตั้งค่าเครื่องที่ควรรู้ครับ
Apple MacBook Pro (14-inch, 2021) on Chip Apple M1 Pro
ที่มาของเรื่องยุ่ง ๆ การเปลี่ยนผ่านจากเครื่องเก่าไป M1
Apple Macbook Pro เครื่องใหม่ที่ใช้ Chip M1 Pro มีความน่าตื่นเต้นที่เปลี่ยนสถาปัตยกรรมไปใช้แบบ ARM จากเครื่องเดิมของผมที่เป็น Macbook Pro ที่ใช้สถาปัตยกรรมที่เป็นของ Intel x86 ทำให้ต้องหา Apps ที่ใช้กับ M1 ได้เพื่อประสิทธิภาพที่ดีที่สุด
จนกระทั่งผมเองมีเวลาได้ทดสอบเครื่องและหาข้อมูลหลายอย่าง ตอนนี้การเปลี่ยนผ่านจากเครื่องเก่าไป M1 ก็ค่อนข้างลงตัวแล้ว โดยพวกเครื่องมือที่เป็น Developer tools หลาย ๆ ตัวก็ได้รับการปรับปรุงเพื่อให้การทำงานกับ M1 เพื่อให้มีความ Natively กับ M1 (รวมถึง Docker ด้วย เดี๋ยวเอาไว้เขียนแยกอีกบทความ) เลยขอเอามาบันทึกเขียนบทความไว้สักหน่อย 🚀
การติดตั้ง Node.js บน M1
การติดตั้ง Node.js บน M1 นั้นทำได้หลายวิธี แต่!
ผมแนะนำให้ใช้ Node Version Manager (nvm) เพราะว่า nvm นั้นสามารถสลับ Node.js versions ได้ง่ายกว่า และไม่จำเป็นต้องติดตั้ง Node.js ก่อนใช้ nvm (หมายถึงว่าติดตั้งแค่ nvm ก็พอ)
พวก Macbook ตัวเดิมที่ใช้ Chip Intel ก็สามารถติดตั้ง Node.js ด้วยวิธีแบบ nvm ได้เหมือนกัน
ถ้าหากคุณมี Node.js ในเครื่องอยู่แล้วควร Uninstall ออกก่อนนะครับ
เปิด Terminal จากนั้น Run คำสั่งนี้
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
คำสั่งด้านบนจะติดตั้งรุ่นล่าสุดในตอนนี้คือ v0.39.1 หากต้องการให้เป็นรุ่นใหม่สามารถอ้างอิงได้ตามลิงก์นี้ https://github.com/nvm-sh/nvm/releases
ติดตั้ง Node.js รุ่น latest version
nvm install node
รีสตาร์ท Terminal จากนั้น Run คำสั่งนี้
nvm use node
ตรวจสอบ Version ที่ติดตั้งดูหน่อยสิ
node -v && npm -v
> v17.4.0
> 8.3.1
โอเค เมื่อถึงขั้นตอนนี้แล้ว ก็แสดงว่าติดตั้ง Node.js สำเร็จไม่มีปัญหาใด ๆ และโดยทั่วไป nvm จะติดตั้ง Node.js รุ่นล่าสุดให้เรา แต่ถ้าหากคุณต้องการติดตั้งรุ่นอื่น ๆ คุณจำเป็นต้องระบุรุ่นเอง เช่น
nvm install 14.7.0 # or 16.3.0, 12.22.1, etc
nvm alias default 21
nvm use default
ส่วนรายละเอียดและการใช้ nvm อื่น ๆ สามารถอ่านได้จากลิงก์นี้ https://github.com/nvm-sh/nvm#usage
วิธีสลับ Architecture
โดยปกติถ้าเป็นเครื่องที่เป็น M1 และถ้ารันคำสั่งตรวจสอบสถาปัตยกรรมที่ใช้กับ Node.js จะได้ arm64
node -p process.arch
> arm64
ตรงนี้จะอ้างอิงกับ Architecture environment ขณะที่เราเปิด Terminal
ทีนี้บางครั้ง ถ้าคุณจำเป็นต้องใช้สถาปัตยกรรมที่เป็น x86 (เพราะว่าบางครั้งพวก Libraries หรือพวก npm packages ที่ต้องรันแบบ Binary ไม่สามารถทำงานกับ M1 native ได้) สามารถทำได้ดังนี้
สลับไป x86 architecture environment
arch -x86_64 zsh
ตรวจสอบ Architecture ดูซิว่าถูกต้องหรือเปล่า
node -p process.arch
> x64
และหากต้องการกลับไป Environment ที่ใช้สถาปัตยกรรมที่เป็น arm64 บน zsh สามารถทำได้ดังนี้
exit
เมื่อกลับ Native shell แล้วก็ตรวจสอบ Architecture ดูซิว่าถูกต้องหรือเปล่า
arch
> arm64
หากต้องการใช้ Rosetta บน Terminal เสมอ
หากคุณต้องการใช้ x86
เสมอ (โดยไม่ต้องเสียเวลามาสลับ Architecture ไปมาทุกครั้ง) สามารถทำได้ดังนี้
- Click ขวาที่ (Terminal, iTerm, etc.) ใน โน Folder Applications
- เลือก "Get Info"
- ใน General Section เลือก "Open using Rosetta"
- Restart terminal
แต่สำหรับผมขอใช้วิธีแบบเดิมดีกว่า (วิธีสลับ Architecture ไปมา) เพราะไม่ค่อยอยากใช้ Rosetta เพราะชอบให้ Terminal รันบน Native มากกว่า 😄
สรุป
จบไปแล้วสำหรับการติดตั้ง Node.js บน M1 และการทำความเข้าใจสถาปัตยกรรม ARM และ x86_64
ส่วนตัวจากการใช้งาน Node.js บน M1 ที่เป็น ARM แล้วพบว่าทำงานได้เร็วมาก ๆ โดยเฉพาะตอน Build (เครื่องเดิมที่เป็น Intel i9 ที่ทำงานบน WSL2 ยังไม่เร็วขนาดนี้เลย) เป็นอะไรที่น่าพอใจมาก ๆ ครับ ได้ลองใช้แล้วสมกับที่คนอวย M1 นักหนา 😄 👍
แล้วตอนนี้ก็เริ่มมีหลาย Applications ที่รองรับการทำงานรวมกับ M1 Native บน Apple Silicon แต่คุณก็สามารถติดตั้งพวก Applications ที่เป็น x86_64 versions และนั ่นก็หมายความว่าจะเป็นการใช้ Rosetta ที่เป็นตัวจำลองให้ App x86_64 ทำงานได้บน ARM
โดยการทำงานของ Rosetta จะทำงานเป็นเบื้องหลังเพื่อกระบวนการแปลง Application ให้ทำงานร่วมกับ M1 ได้ แต่ต้องเข้าใจด้วยว่าในกระบวนการทำงานด้วย Rosetta ก็จะสูญเสียประสิทธิภาพเครื่องที่เป็น ARM แบบ Native ด้วยเช่นกัน
แถมนิดนึงคุณสามารถดู https://doesitarm.com และ https://isapplesiliconready.com สำหรับค้นหา Apps และ Libs ที่รอบรับกับ M1 เพื่อประสิทธิภาพการทำงานสูงสุดของเครื่องคุณ