AskCleanAskClean

วิธีลบ node_modules บน Mac โดยไม่ทำให้โปรเจกต์เสียหาย

ทีม AskClean · อัปเดตเมื่อ 2026-08-05

ลบ node_modules ได้เมื่อ package.json, lockfile ที่ถูกต้อง, การตั้งค่า workspace และแหล่งดาวน์โหลด dependency ยังอยู่ครบ ตรวจทีละโปรเจกต์ หยุดโปรเซสที่ใช้งานโฟลเดอร์นี้ แล้วจึงย้ายเฉพาะ node_modules ไปถังขยะ ติดตั้งใหม่ด้วย package manager และเวอร์ชันที่รีโพซิทอรีกำหนด จากนั้นบิลด์และทดสอบให้ผ่านก่อนล้างถังขยะ อย่าสับสน node_modules กับแคช npm ที่ใช้ร่วมกันใน ~/.npm

แขนกลยกบล็อกโมดูลหนึ่งก้อนจากเครือข่ายไปยังกล่องรีไซเคิล ขณะที่บล็อกสีน้ำเงิน แผนผังโปรเจกต์ และกุญแจยังอยู่ครบ
ลบเฉพาะโฟลเดอร์ dependency ที่สร้างใหม่ได้ โดยเก็บ package.json, lockfile, การตั้งค่า และซอร์สโค้ดไว้

แยก node_modules ออกจากไฟล์โปรเจกต์และแคช npm

<project>/node_modules คือชุด dependency ที่ติดตั้งแล้วสำหรับโปรเจกต์นั้น เมื่อลบ โปรเจกต์จะรัน บิลด์ หรือทดสอบไม่ได้จนกว่าจะติดตั้งใหม่ ส่วนซอร์สโค้ด, package.json, package-lock.json หรือ lockfile ชนิดอื่น, pnpm-workspace.yaml, .npmrc, ไฟล์ patch, สคริปต์บิลด์ และประวัติ Git คือข้อมูลต้นทางที่ต้องเก็บไว้ แคช ~/.npm ใช้เก็บไฟล์ดาวน์โหลดร่วมกันหลายโปรเจกต์ จึงเป็นคนละขอบเขตกับ node_modules และต้องตัดสินใจล้างแยกกัน

ยืนยันก่อนว่า dependencies สร้างใหม่ได้จริง

lockfile ช่วยให้ติดตั้ง dependency ชุดเดิมได้อย่างคาดเดาได้ แต่ไม่ได้เก็บตัวแพ็กเกจไว้ ตรวจให้พร้อมทั้ง registry ส่วนตัว, ข้อมูลรับรอง, VPN, Git และ file: dependencies, ซอร์สของ workspace, ไฟล์ที่สคริปต์ติดตั้งต้องดาวน์โหลด และชุดเครื่องมือสำหรับคอมไพล์ native module หากแก้ไฟล์ใน node_modules ด้วยมือ ให้ย้ายการแก้ไขไปไว้ใน fork หรือไฟล์ patch ที่เก็บกับโปรเจกต์ก่อนลบ สำหรับ npm v12 ระบบจะไม่อ่าน npm-shrinkwrap.json อีกต่อไป หากไฟล์นี้เป็น lockfile เพียงไฟล์เดียวและยังไม่มี package-lock.json ให้สำรองหรือ commit ก่อน แล้วเปลี่ยนชื่อเป็น package-lock.json ซึ่งใช้รูปแบบเดียวกัน ห้ามเขียนทับ package-lock.json ที่มีอยู่

  1. จาก root ของโปรเจกต์ ให้รัน pwd และ du -sh ./node_modules แล้วจดพื้นที่ว่างของ macOS
  2. ตรวจ package.json, lockfile, การตั้งค่า workspace และ git status พร้อมสำรองงานที่ยังไม่ได้ commit; หาก npm-shrinkwrap.json เป็น lockfile เพียงไฟล์เดียว ให้เปลี่ยนชื่อเป็น package-lock.json ก่อนใช้ npm v12 โดยห้ามเขียนทับ package-lock.json ที่มีอยู่
  3. ยืนยัน package manager กับเวอร์ชัน รวมถึงการเข้าถึง registry ส่วนตัว, Git, file: dependencies, แหล่งดาวน์โหลดภายนอก และชุดเครื่องมือคอมไพล์
  4. หยุด dev server, test watcher และส่วนขยายของเอดิเตอร์ที่กำลังติดตั้งแพ็กเกจ จากนั้นย้ายเฉพาะ node_modules ที่ตรวจแล้วไปถังขยะและติดตั้งใหม่จาก root ที่ถูกต้อง
  5. รันขั้นตอนบิลด์ ทดสอบ lint และเปิดแอป เมื่อทุกอย่างผ่านจึงล้างถังขยะและวัดพื้นที่จริงอีกครั้ง

อย่าเก็บ dependency หรือการแก้ไขด้วยมือไว้ใน node_modules เพียงแห่งเดียว แม้มี lockfile ก็ไม่ได้รับประกันว่าแพ็กเกจส่วนตัว ไฟล์ภายนอก หรือ dependency ในเครื่องจะยังหาได้เมื่อต้องติดตั้งใหม่

ลบเฉพาะโฟลเดอร์ที่ตรวจแล้วทีละโปรเจกต์

ที่ root ของโปรเจกต์ ให้รัน pwd และ du -sh ./node_modules ก่อน หากต้องการสำรวจในขอบเขตที่รู้จัก ใช้ find "$HOME/Projects" -type d -name node_modules -prune -exec du -sh {} + โดยเปลี่ยน $HOME/Projects ให้เป็นโฟลเดอร์จริงที่ต้องการตรวจ วิธีที่ย้อนกลับได้คือย้ายเฉพาะ node_modules เป้าหมายไปถังขยะ ส่วน rm -rf ./node_modules จะข้ามถังขยะและย้อนกลับไม่ได้ ห้ามนำผล find ที่ยังไม่ได้ตรวจ wildcard ตัวแปรว่าง หรือพาธจากสคริปต์ที่ไม่น่าเชื่อถือไปต่อเป็นคำสั่งลบวงกว้าง สำหรับ monorepo ให้ถือทั้งรีโพซิทอรีเป็นระบบเดียวและติดตั้งใหม่จาก root ที่ lockfile กำกับ

ติดตั้งด้วย package manager เดิมและตรวจทั้งโปรเจกต์

หากโปรเจกต์ npm ยึด package-lock.json เป็นหลัก ให้รัน npm ci จาก root ที่ lockfile กำกับ สำหรับ pnpm ใช้ pnpm install --frozen-lockfile, Yarn รุ่นใหม่ใช้ yarn install --immutable, Yarn Classic มักใช้ yarn install --frozen-lockfile และ Bun ใช้ bun install --frozen-lockfile การติดตั้งสำเร็จเพียงอย่างเดียวยังไม่ยืนยันว่าโปรเจกต์ใช้ได้ ให้รันขั้นตอนบิลด์ ทดสอบ lint และเปิดแอปตามที่รีโพซิทอรีระบุ หากล้มเหลว ให้เก็บ log กู้โฟลเดอร์จากถังขยะถ้ายังทำได้ แล้วตรวจเวอร์ชัน ข้อมูลรับรอง เครือข่าย ชุดเครื่องมือคอมไพล์ และความสอดคล้องของ lockfile ก่อนลบโปรเจกต์อื่น

ขอบเขตการล้างและต้นทุนการกู้คืน

ค้นหาและวัดขนาด node_modules บน Mac เก็บซอร์สโค้ดกับ lockfile ไว้ แล้วติดตั้ง dependency ใหม่อย่างปลอดภัยด้วย npm, pnpm, Yarn หรือ Bun

รายการหรือการดำเนินการตรวจสอบได้ที่ผลที่ตามมา
แยก node_modules ออกจากไฟล์โปรเจกต์และแคช npm<project>/node_modules<project>/node_modules คือชุด dependency ที่ติดตั้งแล้วสำหรับโปรเจกต์นั้น เมื่อลบ โปรเจกต์จะรัน บิลด์ หรือทดสอบไม่ได้จนกว่าจะติดตั้งใหม่ ส่วนซอร์สโค้ด, package.json, package-lock.json หรือ lockfile ชนิดอื่น, pnpm-workspace.yaml, .npmrc, ไฟล์ patch, สคริปต์บิลด์ และประวัติ Git คือข้อมูลต้นทางที่ต้องเก็บไว้ แคช ~/.npm ใช้เก็บไฟล์ดาวน์โหลดร่วมกันหลายโปรเจกต์ จึงเป็นคนละขอบเขตกับ node_modules และต้องตัดสินใจล้างแยกกัน
ยืนยันก่อนว่า dependencies สร้างใหม่ได้จริงpackage.json + lockfile + การตั้งค่า workspacelockfile ช่วยให้ติดตั้ง dependency ชุดเดิมได้อย่างคาดเดาได้ แต่ไม่ได้เก็บตัวแพ็กเกจไว้ ตรวจให้พร้อมทั้ง registry ส่วนตัว, ข้อมูลรับรอง, VPN, Git และ file: dependencies, ซอร์สของ workspace, ไฟล์ที่สคริปต์ติดตั้งต้องดาวน์โหลด และชุดเครื่องมือสำหรับคอมไพล์ native module หากแก้ไฟล์ใน node_modules ด้วยมือ ให้ย้ายการแก้ไขไปไว้ใน fork หรือไฟล์ patch ที่เก็บกับโปรเจกต์ก่อนลบ สำหรับ npm v12 ระบบจะไม่อ่าน npm-shrinkwrap.json อีกต่อไป หากไฟล์นี้เป็น lockfile เพียงไฟล์เดียวและยังไม่มี package-lock.json ให้สำรองหรือ commit ก่อน แล้วเปลี่ยนชื่อเป็น package-lock.json ซึ่งใช้รูปแบบเดียวกัน ห้ามเขียนทับ package-lock.json ที่มีอยู่
ลบเฉพาะโฟลเดอร์ที่ตรวจแล้วทีละโปรเจกต์ถังขยะ / ติดตั้งใหม่ด้วย package managerที่ root ของโปรเจกต์ ให้รัน pwd และ du -sh ./node_modules ก่อน หากต้องการสำรวจในขอบเขตที่รู้จัก ใช้ find "$HOME/Projects" -type d -name node_modules -prune -exec du -sh {} + โดยเปลี่ยน $HOME/Projects ให้เป็นโฟลเดอร์จริงที่ต้องการตรวจ วิธีที่ย้อนกลับได้คือย้ายเฉพาะ node_modules เป้าหมายไปถังขยะ ส่วน rm -rf ./node_modules จะข้ามถังขยะและย้อนกลับไม่ได้ ห้ามนำผล find ที่ยังไม่ได้ตรวจ wildcard ตัวแปรว่าง หรือพาธจากสคริปต์ที่ไม่น่าเชื่อถือไปต่อเป็นคำสั่งลบวงกว้าง สำหรับ monorepo ให้ถือทั้งรีโพซิทอรีเป็นระบบเดียวและติดตั้งใหม่จาก root ที่ lockfile กำกับ
ติดตั้งด้วย package manager เดิมและตรวจทั้งโปรเจกต์บิลด์ + ทดสอบ + เปิดแอปหากโปรเจกต์ npm ยึด package-lock.json เป็นหลัก ให้รัน npm ci จาก root ที่ lockfile กำกับ สำหรับ pnpm ใช้ pnpm install --frozen-lockfile, Yarn รุ่นใหม่ใช้ yarn install --immutable, Yarn Classic มักใช้ yarn install --frozen-lockfile และ Bun ใช้ bun install --frozen-lockfile การติดตั้งสำเร็จเพียงอย่างเดียวยังไม่ยืนยันว่าโปรเจกต์ใช้ได้ ให้รันขั้นตอนบิลด์ ทดสอบ lint และเปิดแอปตามที่รีโพซิทอรีระบุ หากล้มเหลว ให้เก็บ log กู้โฟลเดอร์จากถังขยะถ้ายังทำได้ แล้วตรวจเวอร์ชัน ข้อมูลรับรอง เครือข่าย ชุดเครื่องมือคอมไพล์ และความสอดคล้องของ lockfile ก่อนลบโปรเจกต์อื่น

คำถามที่พบบ่อย

ลบ node_modules แล้วซอร์สโค้ดจะหายไหม?

ไม่หายถ้าลบเฉพาะ node_modules แต่การลบโฟลเดอร์โปรเจกต์แม่เป็นอีกเรื่องหนึ่งและทำให้ข้อมูลสูญหายได้ ต้องเก็บ package.json, lockfile, ซอร์สโค้ด, การตั้งค่า, ไฟล์ patch และประวัติ Git ไว้

node_modules เหมือนกับแคช npm ไหม?

ไม่เหมือนกัน node_modules คือ dependency ที่ติดตั้งไว้สำหรับโปรเจกต์หนึ่ง ส่วน ~/.npm โดยปกติคือแคชไฟล์ดาวน์โหลดที่ใช้ร่วมกันหลายโปรเจกต์ การลบอย่างหนึ่งไม่ได้ลบอีกอย่างหนึ่ง

ทำไม npm ci จึงล้มเหลวหลังลบ node_modules?

สาเหตุที่พบบ่อยคือ package.json ไม่ตรงกับ package-lock.json, เวอร์ชัน npm หรือ Node.js เปลี่ยน, ค่า .npmrc หาย, ข้อมูลรับรองหมดอายุ, แหล่ง dependency ใช้ไม่ได้ หรือขาดชุดเครื่องมือคอมไพล์ หากมีเพียง npm-shrinkwrap.json ต้องเปลี่ยนชื่อเป็น package-lock.json ก่อน เพราะ npm v12 ไม่อ่านชื่อเดิม และห้ามเขียนทับ package-lock.json ที่มีอยู่

แหล่งอ้างอิง

จัดการพื้นที่ของเครื่องมือนักพัฒนาต่อ