Coding Gun

pnpm ดีกว่า npm ยังไง?

pnpm(Performant NPM) คือ Package Manager ที่ถูกออกแบบมาให้ทำงานได้เร็วกว่าและใช้พื้นที่จัดเก็บน้อยกว่า NPM และ Yarn นั่นจึงเป็นสาเหตุที่ทำให้ pnpm ได้รับความนิยมมากขึ้นเรื่อยๆ

ทำไมต้องใช้ pnpm?

  1. ประหยัดพื้นที่จัดเก็บ (Disk Space Efficient)

    • pnpm ใช้แนวคิดของ Content Addressable Storage ที่ทำให้แพ็กเกจที่เหมือนกันถูกเก็บเพียงชุดเดียว และใช้ symbolic link ไปยังโฟลเดอร์โปรเจกต์ที่ต้องการใช้งาน
    • ต่างจาก NPM และ Yarn ที่คัดลอกแพ็กเกจไปยังแต่ละโปรเจกต์ ทำให้สิ้นเปลืองพื้นที่จัดเก็บมากขึ้น
  2. ติดตั้งแพ็กเกจได้รวดเร็ว (Faster Installations)

    • ด้วยระบบการจัดเก็บแพ็กเกจแบบแคชที่มีประสิทธิภาพ ทำให้การติดตั้งแพ็กเกจที่เคยติดตั้งไปแล้วสามารถทำได้เกือบจะทันที
    • ใช้โครงสร้างของ Hard Link และ Symbolic Link เพื่อลดความซ้ำซ้อนของไฟล์
  3. ป้องกันปัญหาข้อผิดพลาดของ dependency (Less Dependency Issues)

    • pnpm ใช้ strict node_modules structure ซึ่งช่วยลดปัญหาของการพึ่งพาแพ็กเกจที่ไม่ถูกต้อง
    • Dependency tree ของ pnpm จัดการให้แต่ละแพ็กเกจได้รับเวอร์ชันที่ถูกต้อง และลดปัญหาการเกิด dependency conflicts
  4. รองรับการทำงานแบบ Monorepo ได้ดีขึ้น

    • pnpm รองรับการจัดการ Package แบบ workspaces ทำให้การพัฒนาแอปพลิเคชันที่มีหลายโมดูลเป็นเรื่องง่ายขึ้น

    Monorepo(Mono Repository) คือแนวทางการจัดเก็บ Code หลาย Projet หรือหลาย Package ไว้ใน Repository เดียวกัน แทนที่จะใช้หลาย Repository แยกกัน(Polyrepo) ซึ่งการที่จะทำงานกับ Monorepo จะต้องใช้ workspaces ของ Package manager เป็นตัวแบ่งแยก Code ซึ่ง pnpm จะมาพร้อมกับ feature นี้ ดูขั้นตอนการสร้าง workspace ต่อด้านล่าง

การติดตั้งและใช้งาน pnpm

การติดตั้ง pnpm

หากคุณยังไม่มี pnpm สามารถติดตั้งได้ผ่าน npm หรือ corepack:

npm install -g pnpm

หรือใช้ corepack (สำหรับ Node.js เวอร์ชันใหม่ ๆ):

corepack enable pnpm

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

การใช้งาน pnpm นั้นมีความใกล้เคียงกับ npm และ yarn มาก โดยจะใช้คำสั่งต่างๆดังต่อไปนี้

เปรียนเทียบคำสั่งของ pnpm, npm และ yarn

เราสามารถเทียบเคียงคำสั่งพื้นฐานของ pnpm, npm และ yarn ได้ดังตารางนี้

npm yarn pnpm
npm init yarn init corepack use pnpm@latest
npm install yarn pnpm install
npm install [pkg] yarn add [pkg] pnpm add [pkg]
npm uninstall [pkg] yarn remove [pkg] pnpm remove [pkg]
npm update yarn upgrade pnpm update
npm list yarn list pnpm list
npm run [scriptName] yarn [scriptName] pnpm [scriptName]
npx [command] yarn dlx [command] pnpm dlx [command]
npm exec [commandName] yarn exec [commandName] pnpm exec [commandName]
npm init [initializer] yarn create [initializer] pnpm create [initializer]

ซึ่งจะเห็นว่าคำสั่งของ pnpm, npm และ yarn นั้นคล้ายกันมากๆ นั่นจึงทำให้เราสามารถเปลี่ยนจาก npm หรือ yarn มาเป็น pnpm ได้ง่ายมากๆ โดยเฉพาะใครที่ใช้งาน yarn อยู่แล้วคำสั่งของ pnpm แทบจะเหมือนกับ yarn เลย

เปรียบเทียบ PNPM กับ NPM และ Yarn

คุณสมบัติ PNPM NPM Yarn
การใช้พื้นที่จัดเก็บ ประหยัดพื้นที่มาก ใช้พื้นที่เยอะ ปานกลาง
ความเร็วในการติดตั้งแบบ clean install เร็วมาก เร็วกว่า yarn ช้าที่สุด
การป้องกัน conflicts ดีมาก ปานกลาง ปานกลาง
การรองรับ monorepo รองรับดีเยี่ยม รองรับ รองรับ
การใช้งาน Cache มี Cache ที่เร็วที่สุด มี Cache แต่ใช้พื้นที่เยอะ มี Cache แต่ความเร็วพอๆกับ npm

Pnpm workspaces

เมื่อเราต้องทำงานแบบ Monorepo เราจะต้องแบ่งแยก Code ออกเป็นส่วนๆโดยใช้ workspaces ซึ่งการสร้าง workspaces ใน pnpm มีขั้นตอนต่างๆดังนี้

  1. สร้างไฟล์ pnpm-workspace.yml เพื่อกำหนดโครงสร้างของ workspace
    packages:
        - "packages/*"
        - "apps/*"
    
  2. สร้าง Folder ตามที่เรานิยามไว้ในขึ้นตอนก่อนหน้า
    mkdir -p packages/utils apps/web apps/api
    cd apps/web
    pnpm init
    

การจัดการ Package ในแต่ละ Workspace

หลังจากที่เราแบ่งแยก Workspace แล้วหลังจากนี้ถ้าเราต้องการ install, update หรือ remove package เราจะต้องเลือกว่าจะให้มีผลกับ workspace เดียวหรือทุก workspaces ซึ่งเราจะใช้คำสั่งต่างๆ ดังนี้

Install Package

ไปที่ Workspace ที่ต้องการติดตั้ง package และรันคำสั่ง

pnpm add lodash

หากต้องการให้ติดตั้งเฉพาะ package เดียว:

pnpm add react --filter ./apps/web

Share Package ระหว่าง Workspaces

หากต้องการให้ apps/web ใช้ packages/utils

pnpm add @myorg/utils --filter ./apps/web

Run ทุกๆ Workspaces

ใช้ pnpm run กับทุก Workspaces พร้อมๆกัน

pnpm run build --recursive

หรือจะเลือกรันเฉพาะ Workspace ใด Workspace หนึ่งให้ใช้คำสั่ง

pnpm run dev --filter ./apps/web

Remove Dependencies

ถ้าต้องการลบแพ็กเกจออกจาก workspace:

pnpm remove lodash --filter ./apps/web

Update Dependencies

pnpm update

หรืออัปเดตเฉพาะ Workspace ใด Workspace หนึ่ง

pnpm update --filter ./packages/utils

ข้อดีของการสร้าง pnpm Workspace

สรุป

pnpm เป็นตัว Package Manager ที่ทรงพลังและมีประสิทธิภาพสูง เหมาะสำหรับนักพัฒนาที่ต้องการลดเวลาในการติดตั้งแพ็กเกจและลดการใช้พื้นที่จัดเก็บ ด้วยการจัดการ Dependency ที่ดีกว่าและรองรับ Monorepo ได้ดี pnpm จึงเป็นทางเลือกที่ยอดเยี่ยมสำหรับการพัฒนาโปรเจกต์ขนาดใหญ่และเล็กอย่างมีประสิทธิภาพ

หากคุณยังไม่เคยลองใช้ pnpm ผมแนะนำให้ลองติดตั้งและใช้งานดู แล้วคุณจะพบว่ามันดีจริงๆ

Phanupong Permpimol
Follow me