PlusMagi's Blog By Pitt Phunsanit JavaScript npm: Node Package Manager

npm: Node Package Manager

ในโลกของการพัฒนาเว็บแอปพลิเคชันด้วย JavaScript และ Node.js คงไม่มีใครไม่รู้จัก npm หรือ Node Package Manager มันคือเครื่องมือจัดการแพ็กเกจ (Package Manager) ที่ใหญ่ที่สุดในโลก (และมีปัญหามากที่สุด ที่ต้องใช้) ซึ่งช่วยให้เราสามารถหยิบยืมโค้ด โครงสร้าง หรือเครื่องมือที่นักพัฒนาคนอื่นเขียนไว้มาใช้งานในโปรเจกต์ของเราได้อย่างง่ายดาย โดยไม่ต้องนั่งเขียนใหม่ทั้งหมดตั้งแต่ศูนย์

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


ทำความรู้จักกับ npm และสถาปัตยกรรมภายใน

เมื่อเราพูดถึง npm มักจะหมายถึง 3 สิ่งหลัก ๆ ร่วมกัน

  • The Website: เว็บไซต์ npmjs.com ที่เอาไว้ค้นหาแพ็กเกจ ดูเอกสารการใช้งาน (Documentation) และจัดการโปรไฟล์ของคุณ
  • The Registry: ฐานข้อมูลขนาดใหญ่ที่เก็บโค้ดและแพ็กเกจสาธารณะ (และส่วนตัว) เอาไว้
  • The Command Line Interface (CLI): เครื่องมือที่เราพิมพ์สั่งการผ่าน Terminal/Command Prompt เพื่อติดตั้ง อัปเดต หรือลบแพ็กเกจ

การเริ่มต้นใช้งาน (Initialization)

ก่อนที่เราจะติดตั้งแพ็กเกจใด ๆ ลงในโปรเจกต์ เราจำเป็นต้องสร้างไฟล์ที่เปรียบเสมือน “สำมะโนครัว” ของโปรเจกต์ขึ้นมาก่อน นั่นคือไฟล์ package.json

ให้เปิด Terminal เข้าไปที่โฟลเดอร์โปรเจกต์ของคุณแล้วพิมพ์คำสั่ง
npm init
ระบบจะถามคำถามต่าง ๆ เช่น ชื่อโปรเจกต์, เวอร์ชัน, คำอธิบาย (Description), และ Git repository เพื่อนำไปสร้างไฟล์ package.json

💡 Tip: หากคุณต้องการข้ามขั้นตอนการตอบคำถาม และใช้ค่าเริ่มต้น (Default) ทั้งหมดทันที ให้ใช้คำสั่ง
npm init -y


โครงสร้างของไฟล์ package.json ที่สำคัญ

เมื่อสร้างเสร็จ คุณจะได้ไฟล์หน้าตาประมาณนี้

{
  "name": "my-awesome-project",
  "version": "1.0.0",
  "description": "เรียนรู้การใช้งาน npm แบบละเอียด",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "Your Name",
  "license": "ISC",
  "dependencies": {},
  "devDependencies": {}
}

การติดตั้งแพ็กเกจ (Installing Packages)

การติดตั้งแพ็กเกจผ่าน npm แบ่งออกเป็น 3 รูปแบบหลัก ๆ ตามวัตถุประสงค์การใช้งาน

การติดตั้งภายในโปรเจกต์ (Local Installation)

ใช้สำหรับแพ็กเกจที่ระบบของโปรเจกต์จำเป็นต้องใช้ในการรัน (Runtime) เช่น React, Express, หรือ Lodash
npm install package-name
หรือใช้ตัวย่อ
npm i package-name

ตัวอย่าง:
npm i express

แพ็กเกจนี้จะถูกบันทึกไว้ในช่อง "dependencies" ของไฟล์ package.json และตัวโค้ดจะถูกดาวน์โหลดมาเก็บไว้ในโฟลเดอร์ node_modules


การติดตั้งสำหรับขั้นตอนพัฒนาเท่านั้น (Development Dependencies)

ใช้สำหรับเครื่องมือที่ช่วยเหลือนักพัฒนาในระหว่างเขียนโค้ด แต่ไม่ได้ถูกนำไปรันบนระบบจริง (Production) เช่น Webpack, Babel, Jest, หรือ ESLint

npm install package-name --save-dev
หรือใช้ตัวย่อ
npm i package-name -D
ตัวอย่าง:
npm i jest -D
แพ็กเกจนี้จะถูกบันทึกไว้ในช่อง "devDependencies"


การติดตั้งแบบทั่วทั้งเครื่อง (Global Installation)

npm install -g package-name


ความเข้าใจเรื่อง node_modules และ package-lock.json

เมื่อคุณรันคำสั่งติดตั้ง คุณจะพบโฟลเดอร์และไฟล์เพิ่มขึ้นมาสองสิ่ง

  • node_modules/: โฟลเดอร์ที่เก็บซอร์สโค้ดจริง ๆ ของแพ็กเกจที่คุณโหลดมา รวมถึงแพ็กเกจอื่น ๆ ที่แพ็กเกจนั้น ๆ จำเป็นต้องใช้ (Nested Dependencies) ห้ามนำโฟลเดอร์นี้ขึ้น Git (ให้ใส่ไว้ใน .gitignore) เพราะมันมีขนาดใหญ่มากและสามารถดาวน์โหลดใหม่เมื่อไหร่ก็ได้
  • package-lock.json: ไฟล์นี้จะถูกสร้างขึ้นมาโดยอัตโนมัติ มันทำหน้าที่บันทึกโครงสร้างและเวอร์ชันที่แท้จริงของ node_modules แบบละเอียดสุด ๆ (รวมถึงเลข Hash เพื่อความปลอดภัย) เพื่อให้มั่นใจว่า ไม่ว่าเพื่อนในทีม หรือเซิร์ฟเวอร์จะสั่งติดตั้งโค้ดตอนไหน จะได้เวอร์ชันที่ ตรงกัน 100% เสมอ

การจัดการเวอร์ชันด้วย Semantic Versioning (SemVer)

npm ใช้ระบบการตั้งเลขเวอร์ชันที่เรียกว่า Semantic Versioning ซึ่งประกอบด้วยตัวเลข 3 ชุดหลัก: MAJOR.MINOR.PATCH (เช่น 4.17.1)

  • PATCH (ตัวเลขท้ายสุด): เปลี่ยนเมื่อมีการตามแก้ Bug เล็ก ๆ น้อย ๆ โดยไม่มีการเพิ่มฟีเจอร์
  • MINOR (ตัวเลขกลาง): เปลี่ยนเมื่อมีการเพิ่มฟีเจอร์ใหม่ แต่ยังคงทำงานร่วมกับโค้ดเวอร์ชันเก่าได้ (Backward-compatible)
  • MAJOR (ตัวเลขหน้าสุด): เปลี่ยนเมื่อมีการอัปเดตครั้งใหญ่ที่มีการเปลี่ยนแปลงเชิงโครงสร้าง ซึ่งอาจทำให้โค้ดเก่าพังได้ (Breaking changes)

ใน package.json คุณมักจะเห็นสัญลักษณ์นำหน้าตัวเลขเวอร์ชัน เช่น

  • ^1.2.3 (Caret): อนุญาตให้อัปเดตเป็นเวอร์ชันที่ใหม่กว่าได้ตราบใดที่ MAJOR ยังเป็นเลข 1 (เช่น อัปเดตเป็น 1.5.0 ได้ แต่จะไม่ไป 2.0.0) -> ปลอดภัยและนิยมที่สุด
  • ~1.2.3 (Tilde): อนุญาตให้อัปเดตได้เฉพาะตัวเลข PATCH เท่านั้น (เช่น อัปเดตเป็น 1.2.5 ได้ แต่จะไม่ไป 1.3.0)
  • 1.2.3 (Exact): ล็อคเวอร์ชันนี้เท่านั้น ห้ามอัปเดตเด็ดขาด

การใช้งาน npm Scripts

ฟีเจอร์ที่ทรงพลังมากใน package.json คือช่อง "scripts" ซึ่งช่วยให้เราสามารถสร้างคำสั่งลัด (Shortcuts) เพื่อรันคำสั่งยาว ๆ หรือซับซ้อนได้

ตัวอย่างการตั้งค่าใน package.json

"scripts": {
  "start": "node index.js",
  "dev": "nodemon index.js",
  "build": "webpack --config webpack.config.js"
}

วิธีการเรียกใช้งานผ่าน Terminal
npm run dev
npm run build

(พิเศษสำหรับ start และ test คุณสามารถพิมพ์คำสั่งสั้น ๆ ว่า npm start หรือ npm test ได้ทันทีโดยไม่ต้องมีคำว่า run)


คำสั่งอื่น ๆ ที่จำเป็นในชีวิตประจำวัน

คำสั่งคำอธิบาย
npm installรันคำสั่งนี้เดี่ยว ๆ เมื่อคุณ Clone โปรเจกต์มาจากที่อื่น เพื่อดาวน์โหลดแพ็กเกจทั้งหมดตามที่ระบุไว้ใน package.json
npm uninstall <package-name>ลบแพ็กเกจออกจากโปรเจกต์ และเคลียร์ออกจาก package.json อัตโนมัติ
npm outdatedตรวจสอบว่ามีแพ็กเกจไหนในโปรเจกต์ของเราที่เป็นเวอร์ชันเก่าและมีเวอร์ชันใหม่ออกมาแล้วบ้าง
npm updateอัปเดตแพ็กเกจทั้งหมดตามเงื่อนไข SemVer ที่เราใส่สัญลักษณ์ไว้ (^ หรือ ~)
npm auditตรวจสอบช่องโหว่ด้านความปลอดภัย (Vulnerabilities) ของแพ็กเกจทั้งหมดในโปรเจกต์
npm audit fixสั่งให้ npm แก้ไขช่องโหว่ด้านความปลอดภัยโดยอัตโนมัติ (หากทำได้)

สรุป

การใช้งาน npm ไม่ได้จำกัดอยู่เพียงแค่การรันคำสั่ง npm install เท่านั้น แต่การเข้าใจโครงสร้างของ package.json, ระบบเวอร์ชัน SemVer, การจัดการสคริปต์, และการรักษาความปลอดภัยด้วย npm audit จะช่วยให้คุณสามารถควบคุมสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ได้อย่างมืออาชีพ ลดปัญหา “โค้ดรันเครื่องฉันผ่าน แต่รันเครื่องเพื่อนพัง” ได้อย่างถาวรครับ


อ่านเพิ่มเติม

Leave a Reply