Tree Shaking คืออะไร? ความสำคัญต่อ Performance เว็บคุณ

Tree Shaking คือกระบวนการลบโค้ดที่ไม่ถูกใช้งานออกจากบันเดิล โดยพึ่งพา ES Modules ที่มีโครงสร้างสแตติก (import/export) เพื่อพิสูจน์การอ้างอิง ฟีเจอร์นี้มีใน Webpack, Rollup, esbuild และ Vite ช่วยลดขนาด JavaScript ส่งผลดีต่อความเร็วและ Core Web Vitals.
Tree Shaking ใน JavaScript คืออะไร? ใช้อย่างไรให้ได้ผลจริง
สรุปเร็ว หลักการคือ “นำเฉพาะสิ่งที่ใช้จริง” จากโมดูล ESM มาใส่บันเดิล และปล่อยให้มินิไฟเออร์กำจัดซากโค้ดที่เหลือ (dead code elimination) ขั้นสำคัญคือใช้ ES Modules, หลีกเลี่ยง side effects, และตั้งค่าเครื่องมือให้ถูกต้อง
ทำงานอย่างไร (ภาพรวม)
- Static analysis ของ ESM: ตัวบันเดิลอ่าน
import/exportแบบสแตติก รู้ตั้งแต่ build-time ว่าอะไรถูกใช้ - Mark as unused: export ที่ไม่ถูกอ้างอิงจะถูกทำเครื่องหมายเป็น “ไม่ได้ใช้”
- Minifier ตัดทิ้ง: ขั้น minify (เช่น Terser/ESBuild) จะลบโค้ดที่ไม่จำเป็น
โค้ดตัวอย่างพื้นฐาน
// utils.js (ESM)
export function sum(a, b){ return a + b }
export function mul(a, b){ return a * b } // ไม่ถูกใช้
// app.js
import { sum } from './utils.js'
console.log(sum(2,3))
// ผลที่คาดหวัง: mul จะถูกสั่น (ทิ้ง) ออก ถ้าตั้งค่าถูกต้อง
ตาราง: เครื่องมือยอดนิยมและหมายเหตุการตั้งค่า
| เครื่องมือ | สถานะ Tree Shaking | ต้องการอะไรเป็นพิเศษ | หมายเหตุ |
|---|---|---|---|
| Webpack | รองรับ | mode: "production", ใช้ ESM, sideEffects |
เปิด usedExports อัตโนมัติในโหมดโปรดักชัน |
| Rollup | รองรับ (ค่าเริ่มต้น) | ESM, หลีกเลี่ยง side effects | เน้น ESM-first ออกแบบมาดีเรื่อง treeshake |
| esbuild | รองรับ | format=esm หรืออินพุต ESM |
เร็วมาก ใช้ภายใน Vite |
| Vite | รองรับ | ESM, โปรดักชันใช้ Rollup ใต้ฝากระโปรง | พึ่ง Rollup treeshake ตอน build |
package.json: sideEffects
{
"name": "my-app",
"type": "module",
"sideEffects": false,
// ถ้ามีไฟล์ที่มีเอฟเฟกต์จริง (เช่น ใส่ global CSS) ระบุยกเว้น:
// "sideEffects": ["*.css", "src/polyfills/**"]
}
จุดที่ทำให้ “สั่นไม่ออก” (และวิธีแก้)
| อาการ | สาเหตุ | วิธีแก้ |
|---|---|---|
| ขนาดไม่ลด แม้ import เฉพาะฟังก์ชัน | ใช้ CommonJS (require) หรือ dynamic require |
ย้ายเป็น ESM (import/export) ให้มากที่สุด |
| ทิ้งโค้ดไม่ได้เพราะ side effects | โมดูลรันโค้ดระดับท็อป (เช่น แก้ global, สมัคร event) | ย้ายเอฟเฟกต์เข้า function/init, ตั้ง sideEffects ให้ถูก |
| “barrel file” รวม export ทั้งหมด | รูปแบบ export * from "./*" ทำให้วิเคราะห์ยาก |
export แบบเฉพาะเจาะจง หลีกเลี่ยงการรวมหยาบ ๆ |
Recent Blog

เคยรู้สึกว่าเว็บไซต์ของคุณไม่ดึงดูดลูกค้าไหม? มาดู 5 ขั้นตอนง่ายๆ ที่จะช่วยแก้ปัญหานี้และทำให้ยอดขายพุ่งสูงขึ้น! อ่านต่อ...

เว็บไซต์ของคุณช้าอยู่หรือเปล่า? หากใช่ นี่คือปัญหาที่คุณต้องแก้ไขเพื่อให้ลูกค้าไม่ออกจากเว็บไซต์ อ่านต่อเพื่อค้นพบเคล็ดลับการออกแบบที่ช่วยเพิ่มความเร็ว!

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





