ดูวิธีเพิ่มประสิทธิภาพ Interaction to Next Paint ของเว็บไซต์
เผยแพร่: 19 พฤษภาคม 2023, อัปเดตล่าสุด: 2 กันยายน 2025
Interaction to Next Paint (INP) เป็นเมตริก Core Web Vital ที่เสถียรซึ่งประเมินการตอบสนองโดยรวมของหน้าเว็บต่อการโต้ตอบของผู้ใช้ โดยสังเกตเวลาในการตอบสนองของการโต้ตอบที่มีสิทธิ์ทั้งหมดที่เกิดขึ้นตลอดอายุการเข้าชมหน้าเว็บของผู้ใช้ ค่า INP สุดท้ายคือการโต้ตอบที่ยาวที่สุดที่สังเกตได้ (บางครั้งอาจไม่สนใจค่าผิดปกติ)
เพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดี เว็บไซต์ควรพยายามให้มี Interaction to Next Paint 200 มิลลิวินาทีหรือน้อยกว่า หากต้องการบรรลุเป้าหมายนี้สำหรับผู้ใช้ส่วนใหญ่ เกณฑ์ที่ดีในการวัดคือเปอร์เซ็นไทล์ที่ 75 ของการโหลดหน้าเว็บ ซึ่งแบ่งกลุ่มตามอุปกรณ์เคลื่อนที่และเดสก์ท็อป
เว็บไซต์บางแห่งอาจมีการโต้ตอบน้อยหรือไม่มีเลย เช่น หน้าเว็บที่มีข้อความและรูปภาพเป็นส่วนใหญ่โดยมีองค์ประกอบแบบอินเทอร์แอกทีฟน้อยหรือไม่มีเลย หรือในกรณีของเว็บไซต์ เช่น โปรแกรมแก้ไขข้อความหรือเกม อาจมีการโต้ตอบหลายร้อยหรือหลายพันครั้ง ไม่ว่าในกรณีใดก็ตาม หากมี INP สูง ประสบการณ์ของผู้ใช้ก็จะมีความเสี่ยง
การปรับปรุง INP ต้องใช้เวลาและความพยายาม แต่ผลตอบแทนคือประสบการณ์ของผู้ใช้ที่ดียิ่งขึ้น ในคู่มือนี้ เราจะมาดูเส้นทางในการปรับปรุง INP กัน
ค้นหาสาเหตุที่ทำให้ INP ต่ำ
ก่อนที่จะแก้ไขการโต้ตอบที่ช้าได้ คุณจะต้องมีข้อมูลที่บอกว่า INP ของเว็บไซต์ไม่ดีหรือต้องปรับปรุง เมื่อมีข้อมูลดังกล่าวแล้ว คุณจะไปยังห้องทดลองเพื่อเริ่มวินิจฉัยการโต้ตอบที่ช้าและหาวิธีแก้ปัญหาได้
ค้นหาการโต้ตอบที่ช้าในฟิลด์
ในอุดมคติแล้ว การเพิ่มประสิทธิภาพ INP จะเริ่มต้นด้วยข้อมูลภาคสนาม ข้อมูลภาคสนามจากผู้ให้บริการการตรวจสอบผู้ใช้จริง (RUM) จะให้ค่า INP ของหน้าเว็บแก่คุณ รวมถึงข้อมูลเชิงบริบทที่ไฮไลต์การโต้ตอบที่เฉพาะเจาะจงซึ่งรับผิดชอบต่อค่า INP เอง ไม่ว่าการโต้ตอบจะเกิดขึ้นระหว่างหรือหลังการโหลดหน้าเว็บ ประเภทของการโต้ตอบ (คลิก กดแป้น หรือแตะ) และข้อมูลอื่นๆ ที่มีประโยชน์
หากคุณไม่ได้ใช้ผู้ให้บริการ RUM เพื่อรับข้อมูลภาคสนาม คำแนะนำเกี่ยวกับข้อมูลภาคสนามของ INP จะแนะนำให้ใช้ PageSpeed Insights เพื่อดูข้อมูลรายงานประสบการณ์ของผู้ใช้ Chrome (CrUX) เพื่อช่วยเติมเต็มช่องว่าง CrUX เป็นชุดข้อมูลอย่างเป็นทางการของโปรแกรม Core Web Vitals และให้ข้อมูลสรุปเมตริกระดับสูงสำหรับเว็บไซต์หลายล้านเว็บไซต์ รวมถึง INP อย่างไรก็ตาม CrUX มักจะไม่มีข้อมูลตามบริบทที่คุณจะได้รับจากผู้ให้บริการ RUM เพื่อช่วยวิเคราะห์ปัญหา ด้วยเหตุนี้ เราจึงยังคงแนะนําให้เว็บไซต์ใช้ผู้ให้บริการ RUM เมื่อเป็นไปได้ หรือใช้โซลูชัน RUM ของตนเองเพื่อเสริมสิ่งที่พร้อมใช้งานใน CrUX
วินิจฉัยการโต้ตอบที่ช้าในห้องทดลอง
หากทำได้ คุณควรเริ่มทดสอบในห้องทดลองเมื่อมีข้อมูลภาคสนามที่บ่งชี้ว่าคุณมีการโต้ตอบที่ช้า หากไม่มีข้อมูลภาคสนาม คุณสามารถใช้กลยุทธ์บางอย่างเพื่อระบุการโต้ตอบที่ช้าในห้องทดลองได้ กลยุทธ์ดังกล่าวรวมถึงการทำตามโฟลว์ของผู้ใช้ทั่วไปและการทดสอบการโต้ตอบตลอดเส้นทาง รวมถึงการโต้ตอบกับหน้าเว็บในระหว่างการโหลด ซึ่งเป็นช่วงที่เทรดหลักมักจะทำงานหนักที่สุด เพื่อระบุการโต้ตอบที่ช้าในช่วงเวลาสำคัญของประสบการณ์ของผู้ใช้
เพิ่มประสิทธิภาพการโต้ตอบ
เมื่อระบุการโต้ตอบที่ช้าและจำลองการโต้ตอบนั้นในห้องทดลองได้ด้วยตนเองแล้ว ขั้นตอนถัดไปคือการเพิ่มประสิทธิภาพ
การโต้ตอบแบ่งออกเป็น 3 ส่วนย่อยได้ดังนี้
- ความล่าช้าในการป้อนข้อมูล ซึ่งจะเริ่มเมื่อผู้ใช้เริ่มโต้ตอบกับหน้าเว็บ และสิ้นสุดเมื่อการเรียกกลับของเหตุการณ์สำหรับการโต้ตอบเริ่มทํางาน
- ระยะเวลาการประมวลผล ซึ่งประกอบด้วยระยะเวลาที่ใช้ในการเรียกกลับของเหตุการณ์จนเสร็จสมบูรณ์
- ความล่าช้าในการนำเสนอ ซึ่งเป็นเวลาที่เบราว์เซอร์ใช้ในการนำเสนอเฟรมถัดไปซึ่งมีผลลัพธ์ด้านภาพของการโต้ตอบ
ผลรวมของส่วนย่อยทั้ง 3 นี้คือเวลาในการตอบสนองต่อการโต้ตอบทั้งหมด ส่วนย่อยทุกส่วนของการโต้ตอบจะใช้เวลาในการตอบสนองรวมของการโต้ตอบ ดังนั้นคุณจึงควรทราบวิธีเพิ่มประสิทธิภาพการโต้ตอบแต่ละส่วนเพื่อให้ใช้เวลาน้อยที่สุด
ระบุและลดความล่าช้าของอินพุต
เมื่อผู้ใช้โต้ตอบกับหน้าเว็บ ส่วนแรกของการโต้ตอบนั้นคือความล่าช้าในการป้อนข้อมูล การป้อนข้อมูลอาจล่าช้าเป็นเวลานาน ทั้งนี้ขึ้นอยู่กับกิจกรรมอื่นๆ ในหน้าเว็บ ซึ่งอาจเกิดจากกิจกรรมที่เกิดขึ้นในชุดข้อความหลัก (อาจเกิดจากการโหลด แยกวิเคราะห์ และคอมไพล์สคริปต์) การจัดการการดึงข้อมูล ฟังก์ชันตัวจับเวลา หรือแม้แต่จากการโต้ตอบอื่นๆ ที่เกิดขึ้นอย่างรวดเร็วและทับซ้อนกัน
ไม่ว่าแหล่งที่มาของความล่าช้าในการป้อนข้อมูลของการโต้ตอบจะเป็นอะไร คุณก็ควรลดความล่าช้าในการป้อนข้อมูลให้เหลือน้อยที่สุด เพื่อให้การโต้ตอบเริ่มเรียกใช้แฮนเดิลการเรียกกลับของเหตุการณ์ได้โดยเร็วที่สุด
ความสัมพันธ์ระหว่างการประเมินสคริปต์และ Long Task ระหว่างการเริ่มต้น
แง่มุมที่สำคัญของการโต้ตอบในวงจรหน้าเว็บคือช่วงเริ่มต้น เมื่อหน้าเว็บโหลด ระบบจะแสดงผลหน้าเว็บในตอนแรก แต่สิ่งสำคัญที่ต้องจำไว้คือการที่หน้าเว็บแสดงผลไม่ได้หมายความว่าหน้าเว็บจะโหลดเสร็จแล้ว ผู้ใช้อาจพยายามโต้ตอบกับหน้าเว็บขณะที่หน้าเว็บยังโหลดอยู่ ทั้งนี้ขึ้นอยู่กับจำนวนทรัพยากรที่หน้าเว็บต้องใช้เพื่อให้ทำงานได้อย่างเต็มที่
สิ่งหนึ่งที่อาจทำให้เวลาในการตอบสนองต่ออินพุตของการโต้ตอบนานขึ้นขณะที่หน้าเว็บโหลดคือการประเมินสคริปต์ หลังจากดึงข้อมูลไฟล์ JavaScript จากเครือข่ายแล้ว เบราว์เซอร์ยังคงต้องทำงานก่อนที่จะเรียกใช้ JavaScript ได้ ซึ่งรวมถึงการแยกวิเคราะห์สคริปต์เพื่อตรวจสอบว่าไวยากรณ์ถูกต้องหรือไม่ คอมไพล์เป็นไบต์โค้ด และสุดท้ายคือการเรียกใช้
งานนี้อาจทำให้เกิดงานที่ใช้เวลานานในเทรดหลัก ซึ่งจะทำให้เบราว์เซอร์ตอบสนองต่อการโต้ตอบอื่นๆ ของผู้ใช้ได้ช้าลง ทั้งนี้ขึ้นอยู่กับขนาดของสคริปต์ เพื่อให้หน้าเว็บตอบสนองต่ออินพุตของผู้ใช้ในระหว่างการโหลดหน้าเว็บ คุณควรทำความเข้าใจสิ่งที่คุณทำได้เพื่อลดโอกาสที่จะเกิดงานที่ใช้เวลานานในระหว่างการโหลดหน้าเว็บ เพื่อให้หน้าเว็บทำงานได้อย่างรวดเร็ว
เพิ่มประสิทธิภาพ Callback ของเหตุการณ์
ความล่าช้าในการป้อนข้อมูลเป็นเพียงส่วนแรกของสิ่งที่ INP วัด นอกจากนี้ คุณยังต้องตรวจสอบว่าการเรียกกลับของเหตุการณ์ที่ทํางานเพื่อตอบสนองต่อการโต้ตอบของผู้ใช้สามารถทําให้เสร็จสมบูรณ์ได้โดยเร็วที่สุด
ส่งต่อให้เทรดหลักบ่อยๆ
คำแนะนำทั่วไปที่ดีที่สุดในการเพิ่มประสิทธิภาพการเรียกกลับของเหตุการณ์คือการทำงานให้น้อยที่สุดในการเรียกกลับ อย่างไรก็ตาม ตรรกะการโต้ตอบอาจซับซ้อน และคุณอาจลดงานที่โมเดลทำได้เพียงเล็กน้อยเท่านั้น
หากพบว่าเว็บไซต์ของคุณเป็นเช่นนี้ สิ่งที่คุณลองทำได้ต่อไปคือการแบ่งงานในการเรียกกลับของเหตุการณ์ออกเป็นงานต่างๆ ซึ่งจะช่วยป้องกันไม่ให้งานร่วมกันกลายเป็นงานที่ใช้เวลานานจนบล็อกเทรดหลัก ทำให้การโต้ตอบอื่นๆ ที่รอเทรดหลักทำงานได้เร็วขึ้น
setTimeout
เป็นวิธีหนึ่งในการแบ่งงาน เนื่องจาก Callback ที่ส่งไปยังฟังก์ชันนี้จะทำงานในงานใหม่ คุณใช้ setTimeout
ด้วยตัวมันเองหรือแยกการใช้งานเป็นฟังก์ชันอื่นได้เพื่อให้ได้ผลลัพธ์ที่ดียิ่งขึ้น
การยอมให้ทำงานในเธรดหลักโดยไม่เลือกเป็นการดีกว่าการไม่ยอมให้ทำงานเลย อย่างไรก็ตาม มีวิธีที่ละเอียดกว่าในการยอมให้ทำงานในเธรดหลัก ซึ่งเกี่ยวข้องกับการยอมให้ทำงานทันทีหลังจากเรียกกลับเหตุการณ์ที่อัปเดตอินเทอร์เฟซผู้ใช้ เพื่อให้ตรรกะการแสดงผลทำงานได้เร็วขึ้น
Yield เพื่อให้งานการแสดงผลเกิดขึ้นได้เร็วขึ้น
เทคนิคการสร้างรายได้ขั้นสูงกว่านั้นเกี่ยวข้องกับการจัดโครงสร้างโค้ดในการเรียกกลับของเหตุการณ์เพื่อจำกัดสิ่งที่เรียกใช้ให้เหลือเพียงตรรกะที่จำเป็นในการใช้การอัปเดตภาพสำหรับเฟรมถัดไป ส่วนอื่นๆ สามารถเลื่อนไปทำในงานถัดไปได้ ซึ่งไม่เพียงทำให้การเรียกกลับมีขนาดเล็กและรวดเร็วเท่านั้น แต่ยังช่วยปรับปรุงเวลาในการแสดงผลสำหรับการโต้ตอบด้วยการไม่อนุญาตให้อัปเดตภาพบล็อกโค้ดการเรียกกลับของเหตุการณ์
ตัวอย่างเช่น ลองนึกถึงโปรแกรมแก้ไขข้อความที่จัดรูปแบบข้อความขณะที่คุณพิมพ์ แต่ยังอัปเดตองค์ประกอบอื่นๆ ของ UI เพื่อตอบสนองต่อสิ่งที่คุณเขียนด้วย (เช่น จำนวนคำ การไฮไลต์คำที่สะกดผิด และความคิดเห็นที่สำคัญอื่นๆ ที่มองเห็นได้) นอกจากนี้ แอปพลิเคชันอาจต้องบันทึกสิ่งที่คุณเขียนไว้ด้วย เพื่อให้คุณกลับมาทำงานต่อได้โดยไม่สูญเสียข้อมูลใดๆ
ในตัวอย่างนี้ จะต้องเกิดสิ่งต่อไปนี้ 4 อย่างเพื่อตอบสนองต่ออักขระที่ผู้ใช้พิมพ์ อย่างไรก็ตาม คุณต้องดำเนินการกับรายการแรกก่อนจึงจะแสดงเฟรมถัดไปได้
- อัปเดตกล่องข้อความด้วยสิ่งที่ผู้ใช้พิมพ์และใช้การจัดรูปแบบที่จำเป็น
- อัปเดตส่วนของ UI ที่แสดงจำนวนคำปัจจุบัน
- เรียกใช้ตรรกะเพื่อตรวจสอบการสะกดคำที่ผิด
- บันทึกการเปลี่ยนแปลงล่าสุด (ทั้งในเครื่องหรือในฐานข้อมูลระยะไกล)
โค้ดที่ใช้ดำเนินการนี้อาจมีลักษณะดังนี้
textBox.addEventListener('input', (inputEvent) => {
// Update the UI immediately, so the changes the user made
// are visible as soon as the next frame is presented.
updateTextBox(inputEvent);
// Use `setTimeout` to defer all other work until at least the next
// frame by queuing a task in a `requestAnimationFrame()` callback.
requestAnimationFrame(() => {
setTimeout(() => {
const text = textBox.textContent;
updateWordCount(text);
checkSpelling(text);
saveChanges(text);
}, 0);
});
});
ภาพต่อไปนี้แสดงให้เห็นว่าการเลื่อนการอัปเดตที่ไม่สําคัญออกไปจนกว่าจะถึงเฟรมถัดไปจะช่วยลดระยะเวลาการประมวลผลและเวลาในการตอบสนองโดยรวมของการโต้ตอบได้อย่างไร