"ทำไมเว็บของเราได้แค่ 60?"
มีคำถามหนึ่งที่ไม่ควรถามทีมงานตอนก่อนเลิกงานวันศุกร์ นั่นคือ "ลองรัน Lighthouse บนเว็บเราหน่อยได้ไหม?"
เพราะเมื่อผลออกมา — ตัวเลขที่เห็นทำให้ต้องนั่งต่ออีกสักพัก
Performance Score: 60/100
ไม่ใช่คะแนนที่น่าภาคภูมิใจ โดยเฉพาะเมื่อเว็บไซต์นี้สร้างด้วย framework ชั้นนำ, static export, deploy บน CDN และผ่านการ optimize มาพอสมควร แต่นั่นคือจุดที่น่าสนใจ — ถ้าทุกอย่างดูดีบนกระดาษ แต่ Lighthouse บอกว่า 60 แสดงว่ามีบางอย่างซ่อนอยู่ที่เรายังไม่รู้
บทความนี้คือบันทึกการขุดหาต้นตอ วิเคราะห์ root cause และวางแผนแก้ไข — เขียนอย่างตรงไปตรงมา ไม่ปิดบังตัวเลขที่น่าเขินอาย เพราะเราเชื่อว่าการแชร์บทเรียนดีกว่าการซ่อนปัญหา
Filmstrip: เว็บโหลดยังไงในสายตา Lighthouse
ก่อนดูตัวเลข มาดูก่อนว่า Lighthouse "เห็น" อะไรระหว่างที่เว็บโหลด:

สังเกตว่า filmstrip มีแค่ 3 สถานะ — จอขาว, เริ่มเห็นเนื้อหา, แล้วก็โหลดเสร็จ ไม่มี intermediate state ระหว่างกลางเลย เพราะช่วง 12 วินาทีแรกที่เสียไปกับ redirect chain นั้น browser ไม่ได้ render อะไรเลยแม้แต่ pixel เดียว — นี่คือหลักฐานที่ชัดเจนว่าปัญหาไม่ได้อยู่ที่ rendering แต่อยู่ที่ network-level redirect
วิเคราะห์ Score แต่ละตัว
| Metric |
ค่าที่วัดได้ |
Score |
ระดับ |
| Performance Score |
— |
60 |
ต้องปรับปรุง |
| First Contentful Paint (FCP) |
1.6s |
0.95 |
ดีมาก |
| Largest Contentful Paint (LCP) |
9.1s |
0.01 |
แย่มาก |
| Total Blocking Time (TBT) |
570ms |
0.52 |
ต้องปรับปรุง |
| Cumulative Layout Shift (CLS) |
0 |
1.0 |
สมบูรณ์แบบ |
| Speed Index |
2.8s |
0.96 |
ดีมาก |
| Time to Interactive (TTI) |
9.6s |
0.29 |
แย่ |
ตัวเลขเหล่านี้บอกเรื่องราวที่น่าสนใจ — FCP และ Speed Index ดีมาก หมายความว่าเนื้อหาเริ่มแสดงผลเร็ว แต่ LCP แย่มากผิดปกติ สิ่งที่ทำให้ performance score พังทั้งหมดคือ LCP เพียงตัวเดียว
ความขัดแย้งระหว่าง FCP ดีแต่ LCP แย่ คือสัญญาณคลาสสิกของปัญหาที่เกิดขึ้น ก่อน ที่ browser จะเริ่ม render — และนั่นคือเส้นทางนำไปสู่ root cause
Root Cause #1: Redirect Chain 12.4 วินาที — ตัวการตัวจริง
นี่คือ ตัวการหลัก ที่ทำลาย performance ทั้งหมด:
Redirect Chain:
enersys.co.th/ → enersys.co.th/th
เวลาที่เสียไป: 12,400ms (12.4 วินาที!)
ใช่ ไม่ใช่ 1.2 วินาที — สิบสองจุดสี่วินาที
ทำไมถึงเกิด?
เว็บไซต์รองรับหลายภาษา โดยค่าเริ่มต้นคือภาษาไทย — เมื่อผู้ใช้เข้า / ระบบจะ redirect ไปที่ /th โดยอัตโนมัติ
ในกรณีปกติ redirect ใช้เวลาไม่กี่ millisecond แต่ปัญหาอยู่ที่ Lighthouse วัด LCP จาก URL ต้นทาง และนับเวลาตั้งแต่ navigation เริ่มต้นจนกว่า largest element จะ render — รวมเวลาที่เสียไปกับ redirect ทั้งหมด
ตัวเลข 12.4 วินาทีนั้นผิดปกติมาก redirect ปกติไม่ควรใช้เวลานานขนาดนี้ ซึ่งอาจเกิดจากหลายสาเหตุ:
- Cold start overhead — server ที่ handle redirect อาจมี startup latency สูง
- DNS / connection overhead — การ redirect ทำให้ browser ต้องสร้าง connection ใหม่
- Redirect ไม่ถูก cache — ทำให้ทุก request ต้องผ่าน origin server
ผลกระทบต่อ Score
LCP มีน้ำหนักสูงที่สุดใน Performance Score (~25%) และค่า 9.1s ให้ score เพียง 0.01 จากสูงสุด 1.0 — metric ตัวเดียวทำลาย performance score จาก 95+ ลงมาเหลือ 60
Root Cause #2: Unused JavaScript — 65KB ที่ไม่ได้ใช้
Lighthouse ตรวจพบ unused JavaScript ใน bundle กลางขนาดประมาณ 65KB คิดเป็น potential savings ราว 300ms
สิ่งที่มักซ่อนอยู่ใน bundle หลักโดยไม่รู้ตัว:
- Library ที่ import ทั้ง package แทนที่จะ import เฉพาะที่ใช้
- Component ที่โหลดตั้งแต่แรกแต่ผู้ใช้ยังไม่เห็น
- Code ที่ถูก compile ออกมาเพื่อรองรับ browser เก่าที่ไม่จำเป็น
Root Cause #3: Image Optimization — ยังส่ง PNG อยู่
Lighthouse ระบุรูปภาพหลายไฟล์ที่ยังเป็น PNG ทั้ง ๆ ที่แปลงเป็น format ที่เบากว่าได้ — potential savings รวม ~76KB
เว็บไซต์ใช้ static export ซึ่งไม่มี automatic image optimization ทำให้ต้องจัดการ format เองทั้งหมด
Main Thread Work: 3.1 วินาที
Lighthouse รายงาน main thread work รวม 3.1 วินาที แบ่งเป็น:
| งานที่ทำ |
เวลา |
| Style & Layout calculation |
1.1s |
| Other |
0.9s |
| Script Evaluation |
0.8s |
| Parse HTML & CSS |
0.3s |
TBT 570ms บอกว่า main thread ถูก block จาก JavaScript รวม 570ms — เกิน threshold "needs improvement" (200ms) แต่ยังไม่ถึง "poor" (600ms)
สิ่งที่ทำได้ดี — ไม่ใช่แค่ปัญหา
เพื่อความยุติธรรม Lighthouse ก็ให้คะแนนเต็มหลายจุด:
Server Response Time: สมบูรณ์แบบ (score 1.0) — server ตอบสนองเร็ว infrastructure ไม่ใช่ปัญหา
CLS: 0 — สมบูรณ์แบบ — ไม่มี layout shift เลย ผู้ใช้ไม่เจอปัญหาปุ่มกระโดดหนี
FCP 1.6s — ดีมาก — เนื้อหาแรกปรากฏเร็ว ไม่มี render-blocking resources
Speed Index 2.8s — ดีมาก — หน้าเว็บดูเหมือนโหลดเสร็จเร็ว (เมื่อเข้าโดยตรง)
สรุป: ถ้าเข้าหน้าเว็บโดยตรง (ไม่ผ่าน redirect) performance ดีมาก ปัญหาใหญ่ที่สุดซ่อนอยู่ใน redirect chain เดียว
แผนแก้ไข — เรียงตามความสำคัญ
| Priority |
ปัญหา |
แนวทาง |
Expected Impact |
| 1 |
Redirect chain 12.4s |
จัดการ redirect ที่ infrastructure layer |
LCP ลด 5+ วินาที |
| 2 |
Unused JS 65KB |
Code splitting, lazy load below-fold |
TBT ลด 200-300ms |
| 3 |
PNG images |
แปลงเป็น modern format |
ลด 76KB+ |
| 4 |
Style/Layout cost 1.1s |
Audit CSS usage |
Main thread ลด |
Target หลังแก้ไข:
| Metric |
ปัจจุบัน |
Target |
| Performance Score |
60 |
85+ |
| LCP |
9.1s |
< 2.5s |
| TBT |
570ms |
< 200ms |
| TTI |
9.6s |
< 5s |
บทเรียน: ทำไมต้องวัด Performance สม่ำเสมอ
ปัญหา redirect chain 12.4 วินาทีนี้น่าจะมีมาสักพักแล้ว แต่เราไม่รู้ เพราะไม่ได้วัด เมื่อไม่ได้วัด ก็ไม่รู้ว่ามีปัญหา
Core Web Vitals ที่ Google ใช้ใน Search ranking ตั้งแต่ปี 2021 คือ LCP, FID/INP, และ CLS — ถ้า LCP แย่ ไม่ใช่แค่ผู้ใช้ที่รู้สึก แต่ search ranking ก็ได้รับผลกระทบด้วย
สิ่งที่ทีมควรทำเป็นประจำ:
- รัน performance audit ใน CI/CD — ทุกครั้งที่ merge ควรมีรายงาน performance เปรียบเทียบ
- ตั้ง threshold alerts — กำหนดว่า LCP ต้องไม่เกิน 3 วินาที ถ้าเกินให้ build fail
- Monitor Real User Data — Lab test อย่างเดียวไม่พอ ต้องดูตัวเลขจาก user จริงด้วย
- ทดสอบ URL ที่ user จริง ๆ เข้า — รวม URL ที่มี redirect ด้วย ไม่ใช่แค่ URL ปลายทาง
บทสรุป
คะแนน 60 ที่ Lighthouse ให้มาไม่ใช่เรื่องน่าอาย แต่เป็นโอกาสที่ดีในการเรียนรู้:
- ปัญหาใหญ่ที่สุดไม่ได้อยู่ใน code — แต่อยู่ใน infrastructure configuration
- Metric เดียวที่แย่มากทำลาย overall score ไปมากกว่าครึ่ง
- CLS เป็น 0 สมบูรณ์แบบ — งานที่ทีมทำมาได้ผล
- ถ้าไม่ได้วัดวันนี้ เราจะยังไม่รู้เรื่องนี้อยู่
ที่ Enersys เราเชื่อว่า transparency ต่อตัวเองสำคัญกว่า image ที่ดูดี — การยอมรับว่าเว็บตัวเองได้คะแนน 60 และแชร์ root cause ออกมา คือก้าวแรกของการพัฒนาที่ยั่งยืน
เว็บไซต์ขององค์กรคุณได้คะแนนเท่าไหร่? ถ้าอยากรู้แต่ไม่รู้จะเริ่มยังไง — ให้ทีมเราช่วยวิเคราะห์ได้