ดูว่าความล่าช้าของอินพุตคืออะไร และเรียนรู้เทคนิคในการลดความล่าช้าดังกล่าวเพื่อการโต้ตอบที่เร็วขึ้น
การโต้ตอบบนเว็บเป็นเรื่องที่ซับซ้อน โดยมีกิจกรรมทุกประเภทเกิดขึ้นในเบราว์เซอร์เพื่อขับเคลื่อนการโต้ตอบเหล่านั้น อย่างไรก็ตาม สิ่งที่การโต้ตอบทั้งหมดมีเหมือนกันคือการเกิดความล่าช้าของอินพุตก่อนที่การเรียกกลับของเหตุการณ์จะเริ่มทำงาน ในคู่มือนี้ คุณจะได้เรียนรู้ว่าความล่าช้าของอินพุตคืออะไร และคุณทำอะไรได้บ้างเพื่อลดความล่าช้าดังกล่าวเพื่อให้การโต้ตอบของเว็บไซต์ทำงานได้เร็วขึ้น
ความล่าช้าของอินพุตคืออะไร
ความล่าช้าของอินพุต คือระยะเวลาตั้งแต่ผู้ใช้โต้ตอบกับหน้าเว็บเป็นครั้งแรก เช่น แตะหน้าจอ คลิกด้วยเมาส์ หรือกดปุ่ม จนถึงตอนที่การเรียกกลับของเหตุการณ์สำหรับการโต้ตอบเริ่มทำงาน การโต้ตอบทุกครั้งจะเริ่มต้นด้วยความล่าช้าของอินพุตจำนวนหนึ่ง
ความล่าช้าของอินพุตบางส่วนหลีกเลี่ยงไม่ได้ เนื่องจากระบบปฏิบัติการต้องใช้เวลาจำนวนหนึ่งในการจดจำเหตุการณ์อินพุตและส่งไปยังเบราว์เซอร์ อย่างไรก็ตาม ความล่าช้าของอินพุตส่วนนั้นมักจะสังเกตเห็นได้ยาก และมีสิ่งอื่นๆ ที่เกิดขึ้นในหน้าเว็บเองซึ่งอาจทำให้ความล่าช้าของอินพุตนานพอที่จะก่อให้เกิดปัญหา
วิธีพิจารณาความล่าช้าของอินพุต
โดยทั่วไปแล้ว คุณควรทำให้ทุกส่วนของการโต้ตอบสั้นที่สุดเท่าที่จะทำได้ เพื่อให้เว็บไซต์มีโอกาสที่ดีที่สุดในการเป็นไปตามเกณฑ์ "ดี" ของเมตริก Interaction to Next Paint (INP) ไม่ว่าอุปกรณ์ของผู้ใช้จะเป็นอุปกรณ์ใดก็ตาม การควบคุมความล่าช้าของอินพุตเป็นเพียงส่วนหนึ่งของการเป็นไปตามเกณฑ์ดังกล่าว
ดังนั้น คุณจึงควรตั้งเป้าหมายให้ความล่าช้าของอินพุตสั้นที่สุดเท่าที่จะทำได้เพื่อให้เป็นไปตามเกณฑ์ "ดี" ของ INP อย่างไรก็ตาม คุณควรทราบว่าคุณไม่สามารถกำจัดความล่าช้าของอินพุตออกไปได้ทั้งหมด ตราบใดที่คุณหลีกเลี่ยงงานในเทรดหลักที่มากเกินไปขณะที่ผู้ใช้พยายามโต้ตอบกับหน้าเว็บ ความล่าช้าของอินพุตควรจะต่ำพอที่จะไม่ก่อให้เกิดปัญหา
วิธีลดความล่าช้าของอินพุต
ดังที่กล่าวไว้ก่อนหน้านี้ ความล่าช้าของอินพุตบางส่วนหลีกเลี่ยงไม่ได้ แต่ในทางกลับกัน ความล่าช้าของอินพุตบางส่วนก็หลีกเลี่ยงได้ คุณควรพิจารณาสิ่งต่อไปนี้หากพบว่าความล่าช้าของอินพุตนานเกินไป
หลีกเลี่ยงตัวจับเวลาที่เกิดซ้ำซึ่งทำให้เกิดงานในเทรดหลักมากเกินไป
มีฟังก์ชันตัวจับเวลา 2 รายการที่ใช้กันโดยทั่วไปใน JavaScript ซึ่งอาจทำให้เกิดความล่าช้าของอินพุต ได้แก่ setTimeout และ setInterval ความแตกต่างระหว่างฟังก์ชันทั้ง 2 รายการนี้คือ setTimeout จะกำหนดเวลาให้การเรียกกลับทำงานหลังจากเวลาที่ระบุ setInterval ในทางกลับกัน จะกำหนดเวลาให้การเรียกกลับทำงานทุกๆ n มิลลิวินาทีอย่างต่อเนื่อง หรือจนกว่าจะหยุดตัวจับเวลาด้วย clearInterval
setTimeout ไม่ได้ก่อให้เกิดปัญหาในตัวของมันเอง ในความเป็นจริงแล้ว ฟังก์ชันนี้อาจเป็นประโยชน์ในการหลีกเลี่ยงงานที่ใช้เวลานาน อย่างไรก็ตาม ฟังก์ชันนี้ขึ้นอยู่กับ เวลา ที่หมดเวลา และขึ้นอยู่กับว่าผู้ใช้พยายามโต้ตอบกับหน้าเว็บหรือไม่เมื่อการเรียกกลับที่หมดเวลาทำงาน
นอกจากนี้ setTimeout ยังสามารถทำงานในลูปหรือแบบเรียกซ้ำ ซึ่งจะทำงานคล้ายกับ setInterval มากขึ้น แม้ว่าโดยปกติแล้วจะไม่กำหนดเวลาให้ทำซ้ำครั้งถัดไปจนกว่าจะทำซ้ำครั้งก่อนหน้าเสร็จสมบูรณ์ แม้ว่าการทำเช่นนี้จะหมายความว่าลูปจะส่งงานไปยังเทรดหลักทุกครั้งที่เรียกใช้ setTimeout แต่คุณควรระมัดระวังไม่ให้การเรียกกลับของฟังก์ชันนี้ทำงานมากเกินไป
setInterval จะเรียกใช้การเรียกกลับตามช่วงเวลาที่กำหนด ดังนั้นจึงมีแนวโน้มที่จะขัดขวางการโต้ตอบมากกว่า เนื่องจากลักษณะการทำงานที่เกิดซ้ำของ setInterval ทำให้มีแนวโน้มที่จะขัดขวางการโต้ตอบมากกว่าการเรียกใช้ setTimeout เพียงครั้งเดียว ซึ่งเป็นการเรียกกลับแบบครั้งเดียวที่ อาจ ขัดขวางการโต้ตอบของผู้ใช้ ดังนั้นจึงทำให้เกิดความล่าช้าของอินพุตในการโต้ตอบมากขึ้น
setInterval ครั้งก่อนซึ่งทำให้เกิดความล่าช้าของอินพุตตามที่แสดงในแผงประสิทธิภาพของเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome ความล่าช้าของอินพุตที่เพิ่มขึ้นทำให้การเรียกกลับของเหตุการณ์สำหรับการโต้ตอบทำงานช้ากว่าที่ควรจะเป็น
หากตัวจับเวลาเกิดขึ้นในโค้ดของบุคคลที่หนึ่ง คุณจะควบคุมตัวจับเวลาเหล่านั้นได้ ประเมินว่าคุณจำเป็นต้องใช้ตัวจับเวลาหรือไม่ หรือพยายามลดงานในตัวจับเวลาให้มากที่สุดเท่าที่จะทำได้ อย่างไรก็ตาม ตัวจับเวลาในสคริปต์ของบุคคลที่สามเป็นเรื่องที่แตกต่างออกไป คุณมักจะควบคุมสิ่งที่สคริปต์ของบุคคลที่สามทำไม่ได้ และการแก้ไขปัญหาด้านประสิทธิภาพในโค้ดของบุคคลที่สามมักจะต้องทำงานร่วมกับผู้มีส่วนได้ส่วนเสียเพื่อพิจารณาว่าจำเป็นต้องใช้สคริปต์ของบุคคลที่สามที่กำหนดหรือไม่ และหากจำเป็น ให้ติดต่อผู้ให้บริการสคริปต์ของบุคคลที่สามเพื่อพิจารณาว่าสามารถทำอะไรได้บ้างเพื่อแก้ไขปัญหาด้านประสิทธิภาพที่สคริปต์เหล่านั้นอาจก่อให้เกิดในเว็บไซต์ของคุณ
หลีกเลี่ยงงานที่ใช้เวลานาน
วิธีหนึ่งในการลดความล่าช้าของอินพุตที่นานเกินไปคือการหลีกเลี่ยงงานที่ใช้เวลานาน เมื่อคุณมีงานในเทรดหลักมากเกินไปซึ่งบล็อกเทรดหลักระหว่างการโต้ตอบ งานเหล่านั้นจะทำให้เกิดความล่าช้าของอินพุตสำหรับการโต้ตอบก่อนที่งานที่ใช้เวลานานจะเสร็จสิ้น
นอกเหนือจากการลดปริมาณงานที่คุณทำในงานหนึ่งๆ (และคุณควร พยายามทำงานในเทรดหลักให้น้อยที่สุดเท่าที่จะทำได้เสมอ) คุณยังปรับปรุงการตอบสนองต่อข้อมูลจากผู้ใช้ได้ด้วยการ แบ่งงานที่ใช้เวลานานออกเป็นงานที่เล็กลง
ระมัดระวังการโต้ตอบที่ทับซ้อนกัน
ส่วนที่ท้าทายเป็นพิเศษในการเพิ่มประสิทธิภาพ INP อาจเกิดขึ้นได้หากคุณมีการโต้ตอบที่ทับซ้อนกัน การโต้ตอบที่ทับซ้อนกันหมายความว่าหลังจากที่คุณโต้ตอบกับองค์ประกอบหนึ่งแล้ว คุณจะโต้ตอบกับหน้าเว็บอีกครั้งก่อนที่การโต้ตอบครั้งแรกจะมีโอกาสแสดงผลเฟรมถัดไป
สาเหตุของการโต้ตอบที่ทับซ้อนกันอาจเป็นเรื่องง่ายๆ เช่น ผู้ใช้โต้ตอบหลายครั้งในระยะเวลาอันสั้น ซึ่งอาจเกิดขึ้นเมื่อผู้ใช้พิมพ์ในช่องแบบฟอร์ม ซึ่งอาจมีการโต้ตอบด้วยแป้นพิมพ์หลายครั้งในระยะเวลาอันสั้นมาก หากงานในเหตุการณ์สำคัญใช้ทรัพยากรมากเป็นพิเศษ เช่น ในกรณีทั่วไปของช่องเติมข้อความอัตโนมัติที่มีการส่งคำขอเครือข่ายไปยังแบ็กเอนด์ คุณจะมีตัวเลือก 2 ตัวเลือกดังนี้
- พิจารณาการดีบาวซ์อินพุตเพื่อจำกัดจำนวนครั้งที่การเรียกกลับของเหตุการณ์ทำงานในช่วงเวลาที่กำหนด
- ใช้
AbortControllerเพื่อยกเลิกคำขอfetchขาออก เพื่อไม่ให้เทรดหลักทำงานมากเกินไปในการจัดการการเรียกกลับfetchหมายเหตุ: คุณยังใช้พร็อพเพอร์ตี้signalของอินสแตนซ์AbortControllerเพื่อ ยกเลิกเหตุการณ์ ได้ด้วย
อีกสาเหตุหนึ่งที่ทำให้ความล่าช้าของอินพุตเพิ่มขึ้นเนื่องจากการโต้ตอบที่ทับซ้อนกันอาจเป็นภาพเคลื่อนไหวที่ใช้ทรัพยากรมาก โดยเฉพาะอย่างยิ่ง ภาพเคลื่อนไหวใน JavaScript อาจเรียกใช้ requestAnimationFrame หลายครั้ง ซึ่งอาจขัดขวางการโต้ตอบของผู้ใช้ หากต้องการหลีกเลี่ยงปัญหานี้ ให้ใช้ภาพเคลื่อนไหว CSS ทุกครั้งที่ทำได้เพื่อหลีกเลี่ยงการจัดคิวเฟรมภาพเคลื่อนไหวที่อาจใช้ทรัพยากรมาก แต่หากทำเช่นนี้ ให้ตรวจสอบให้แน่ใจว่าคุณได้หลีกเลี่ยงภาพเคลื่อนไหวที่ไม่ใช่แบบคอมโพสิต เพื่อให้ภาพเคลื่อนไหวทำงานบน GPU และเทรดคอมโพสิตเป็นหลัก ไม่ใช่บนเทรดหลัก
บทสรุป
แม้ว่าความล่าช้าของอินพุตอาจไม่ใช่เวลาส่วนใหญ่ที่การโต้ตอบใช้ในการทำงาน แต่คุณต้องเข้าใจว่าทุกส่วนของการโต้ตอบใช้เวลาจำนวนหนึ่งซึ่งคุณสามารถลดได้ หากคุณพบว่าความล่าช้าของอินพุตนานเกินไป คุณก็มีโอกาสที่จะลดความล่าช้าดังกล่าวได้ การหลีกเลี่ยงการเรียกกลับของตัวจับเวลาที่เกิดซ้ำ การแบ่งงานที่ใช้เวลานานออกเป็นงานที่เล็กลง และการตระหนักถึงการโต้ตอบที่อาจทับซ้อนกัน ทั้งหมดนี้จะช่วยลดความล่าช้าของอินพุต ซึ่งจะทำให้ผู้ใช้เว็บไซต์โต้ตอบได้เร็วขึ้น
ภาพหลักจาก Unsplash โดย Erik Mclean