ปัญหาด้านประสิทธิภาพที่สำคัญ

ในปัจจุบัน รูปภาพเป็นเนื้อหาที่ใหญ่ที่สุดของเว็บในแง่ของขนาดการโอนทั้งหมด และ จำนวนคำขอ ต่อหน้า ค่ามัธยฐานของขนาดการโอนทั้งหมดของหน้าเว็บคือ 2 MB ข้อมูล ณ เดือนมิถุนายน 2022 โดยมีรูปภาพเพียงอย่างเดียวคิดเป็นเกือบครึ่งหนึ่ง ไม่ใช่การเกินจริง การเพิ่มประสิทธิภาพคำขอรูปภาพอาจเป็นการเพิ่มประสิทธิภาพที่ใหญ่ที่สุดเพียงอย่างเดียวที่ทำได้

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

กำลังเลื่อนคำขอรูปภาพ

ในขณะที่คุณกำลังเรียนรู้เกี่ยวกับวิธีการต่างๆ ที่ทำให้คำขอรูปภาพมีขนาดเล็กและมีประสิทธิภาพมากที่สุด คำขอรูปภาพที่รวดเร็วที่สุด จะเป็นสิ่งที่ไม่เคยมีใครทำได้ ก่อนอื่นเลย ฉันอยากจะแบ่งปันสิ่งที่อาจส่งผลกระทบมากที่สุดต่อการเปลี่ยนแปลงนี้ คุณส่งชิ้นงานรูปภาพให้กับผู้ใช้: แอตทริบิวต์ loading="lazy"

<img src="image.jpg" loading="lazy" alt="…">

แอตทริบิวต์นี้ทำให้ไม่มีการสร้างคำขอรูปภาพจนกว่าจะตกอยู่ใกล้กับวิวพอร์ตของผู้ใช้ โดยเลื่อนเวลาคำขอไปไว้ตั้งแต่ต้น การโหลดหน้าเว็บ ซึ่งก็คือเวลาที่เบราว์เซอร์กำลังทำงานมากที่สุด และนำคำขอเหล่านั้นออกจากเส้นทางการแสดงผลวิกฤติ

ไม่ซับซ้อนเหมือนในทางปฏิบัติ การใช้แอตทริบิวต์นี้สามารถส่งผลดีต่อประสิทธิภาพเป็นอย่างมาก ซึ่งก็คือรูปภาพที่ไม่อยู่ภายใน ระบบจะไม่ขอวิวพอร์ตของผู้ใช้และจะไม่สูญเสียแบนด์วิดท์ไปกับรูปภาพที่ผู้ใช้จะไม่เห็น

แต่ก็มีข้อจำกัดอยู่เช่นกัน การเลื่อนเวลาคำขอเหล่านี้ออกไปจะทำให้ไม่มีการใช้ประโยชน์จากเบราว์เซอร์ กระบวนการที่เพิ่มประสิทธิภาพขั้นสูงสำหรับการขอ รูปภาพต่างๆ ให้เร็วที่สุดเท่าที่จะทำได้ หากใช้ loading="lazy" ในองค์ประกอบ img ที่ด้านบนสุดของเลย์เอาต์ ดังนั้นจึงมีแนวโน้มมากขึ้น อยู่ในวิวพอร์ตของผู้ใช้เมื่อโหลดหน้าเว็บครั้งแรก ผู้ใช้ปลายทางอาจรู้สึกว่ารูปภาพเหล่านี้ทำงานช้าลงอย่างมาก

ลำดับความสำคัญของการดึงข้อมูล

แอตทริบิวต์ loading เป็นตัวอย่างของความพยายามในการสร้างมาตรฐานเว็บที่ใหญ่ขึ้นเพื่อให้นักพัฒนาแอปมีอำนาจมากขึ้นในการควบคุมเว็บเบราว์เซอร์ จัดลำดับความสำคัญของคำขอ

คุณอาจทราบแล้วว่าเบราว์เซอร์ วิธีการพื้นฐานในการดึงข้อมูลลำดับความสำคัญ ตัวอย่างเช่น คำขอไฟล์ CSS ภายนอกใน <head> ของเอกสารถือเป็นสิ่งจำเป็นมากพอที่จะบล็อกการแสดงผล ในขณะที่คำขอสำหรับ ระบบจะเลื่อนไฟล์ JavaScript ภายนอกที่สูงกว่า </body> จนกว่าการแสดงผลจะเสร็จสมบูรณ์ หากค่าของแอตทริบิวต์ loading ใน <img> เป็น "lazy" ระบบจะเลื่อนคำขอรูปภาพที่เกี่ยวข้องออกไปจนกว่าเบราว์เซอร์จะพิจารณาว่าจะแสดงต่อผู้ใช้ มิฉะนั้น รูปภาพดังกล่าวจะมี ลำดับความสำคัญกับรูปภาพอื่นๆ ในหน้าเว็บ

แอตทริบิวต์ fetchpriority มีไว้เพื่อให้ ควบคุมลำดับความสำคัญของเนื้อหาได้อย่างละเอียด ซึ่งช่วยให้คุณแจ้งทรัพยากรต่างๆ ได้ เป็น "high" และ "ต่ำ" ลำดับความสำคัญที่สัมพันธ์กับทรัพยากรในประเภทเดียวกัน กรณีการใช้งาน fetchpriority จะคล้ายกับ loading แม้ว่าจะกว้างกว่ามาก เช่น คุณอาจใช้ fetchpriority="low" ในรูปภาพที่แสดงหลังจากการโต้ตอบของผู้ใช้เท่านั้น (ไม่ว่ารูปภาพนั้นจะอยู่ในวิวพอร์ตของผู้ใช้หรือไม่ก็ตาม) เพื่อจัดลำดับความสำคัญของรูปภาพที่มองเห็นได้ในส่วนอื่นๆ ของหน้าเว็บ หรือfetchpriority="high" เพื่อจัดลำดับความสำคัญของรูปภาพที่คุณทราบว่าจะปรากฏในวิวพอร์ตทันทีที่มีการแสดงผลหน้าเว็บ

โปรดทราบว่า fetchpriority แตกต่างจาก loading ตรงที่ไม่ได้เปลี่ยนลักษณะการทำงานของเบราว์เซอร์โดยพื้นฐาน ไม่แจ้งให้เบราว์เซอร์ เพื่อโหลดเนื้อหาบางอย่างก่อนเนื้อหาอื่นๆ แต่ให้บริบทที่มีความสำคัญต่อการตัดสินใจเกี่ยวกับการขอเนื้อหาแทน

การวัดผลกระทบของรูปภาพ

เมื่อเพิ่มประสิทธิภาพชิ้นงานรูปภาพ ประสิทธิภาพที่รับรู้ได้มักจะมีความสำคัญและวัดผลได้ยากกว่าการโอนทั้งหมด ขนาดเดียวเท่านั้น

Web Vitals มอบเมตริกที่วัดผลได้และนำไปใช้ได้จริง รวมถึงคำแนะนำสำหรับการปรับปรุงผู้ใช้ เว็บด้วย เน้นถึงปัญหาต่างๆ เช่น เช่น เวลาตอบสนองช้าจากเว็บเซิร์ฟเวอร์ ปัญหาการแสดงผล และความล่าช้าของการโต้ตอบ Core Web Vitals เป็นชุดย่อยของเป้าหมายเหล่านี้ซึ่งมุ่งเน้นเลเซอร์ เกี่ยวกับประสบการณ์โดยตรงของผู้ใช้ในหน้าเว็บหนึ่งๆ ซึ่งเป็นชุดการวัดทางเทคนิคที่เมื่อใช้ร่วมกันแล้ว จะใช้เพื่อพิจารณาว่าประสบการณ์ความรู้สึกของผู้ใช้เร็วเพียงใด

การเปลี่ยนเลย์เอาต์สะสม

Cumulative Layout Shift (CLS) คือการวัดความเสถียรของภาพ เมตริกนี้คือเมตริกวัดปริมาณรายได้ เลย์เอาต์ของเนื้อหาในหน้าเว็บจะเปลี่ยนไปเมื่อเนื้อหาโหลดขึ้นและแสดงหน้าเว็บ ใครก็ตามที่ใช้จ่ายไปเป็นจำนวนมาก ของการใช้เว็บเสียเวลาไปกับข้อความยาวๆ เนื่องจากบนหน้า "กระโดด" เป็นเว็บฟอนต์หรือแหล่งที่มาของรูปภาพที่ล่าช้า แสดงผล หรือมีองค์ประกอบแบบอินเทอร์แอกทีฟย้ายออกห่างจากตัวชี้โดยทันที CLS ที่สูงจะทำให้เกิดความรำคาญมากที่สุด และทำให้ ข้อผิดพลาดของผู้ใช้ที่แย่ที่สุด เช่น "ยกเลิก" ปุ่มเลื่อนไปยังพื้นที่ที่ก่อนหน้านี้มีปุ่ม "ยืนยัน" เช่นเดียวกับที่ผู้ใช้คลิก เป็นต้น

ด้วยเวลาโหลดสูงและเนื้อที่ที่ใช้ได้ในเลย์เอาต์ ก็ให้เหตุผลว่ารูปภาพเป็นสาเหตุที่พบบ่อยอย่างหนึ่ง ที่มีคะแนน CLS สูง

เนื่องจากการเปลี่ยนแปลงที่ค่อนข้างล่าสุดในเบราว์เซอร์สมัยใหม่ การเลี่ยงค่า CLS ที่สูงเนื่องจากรูปภาพจึงง่ายกว่าที่คุณคิด

หากใช้ฟรอนท์เอนด์มา 2-3 ปีแล้ว คุณจะคุ้นเคยกับแอตทริบิวต์ width และ height ใน <img> ก่อนที่จะมีการนำ CSS มาใช้อย่างแพร่หลาย นี่เป็นวิธีเดียวในการควบคุมขนาดของรูปภาพ

<img src="image.jpg" height="200" width="400" alt="…">

แอตทริบิวต์เหล่านี้เลิกใช้งานแล้วเพื่อพยายามแยกข้อกังวลด้านสไตล์ออกจากมาร์กอัป โดยเฉพาะอย่างยิ่งเนื้อหาที่ปรับเปลี่ยนตามอุปกรณ์ การออกแบบเว็บทำให้จำเป็นต้องระบุขนาดตามเปอร์เซ็นต์ผ่าน CSS ในช่วงแรกๆ ของการออกแบบเว็บที่ตอบสนองตามอุปกรณ์ "ลบ แอตทริบิวต์ width และ height ที่ไม่ได้ใช้" เป็นคำแนะนำทั่วไป ดังค่าที่เราระบุไว้ใน CSSmax-width: 100% และ height: auto จะลบล้าง

<img src="image.jpg" alt="…">
img {
  max-width: 100%;
  height: auto;
}

เนื่องจากได้นำแอตทริบิวต์ height และ width ออกตามที่แสดงในตัวอย่างก่อนหน้านี้ จึงเป็นวิธีเดียวที่เบราว์เซอร์มีไว้ใช้พิจารณา สำหรับความสูงของรูปภาพในกรณีนี้คือ การส่งคำขอแหล่งที่มา แยกวิเคราะห์ และแสดงผลรูปภาพตามสัดส่วนภาพตามจริง ความกว้างของพื้นที่ที่แทรกไว้ในเค้าโครงเมื่อมีการใช้สไตล์ชีต กระบวนการนี้มักเกิดขึ้นหลังจากที่หน้าเว็บ ด้วยความสูงที่คำนวณใหม่ซึ่งทำให้เลย์เอาต์เพิ่มเติม

ตั้งแต่ปี 2019 เราได้อัปเดตลักษณะการทำงานของเบราว์เซอร์เพื่อจัดการแอตทริบิวต์ width และ height ในลักษณะที่ต่างออกไป แทนที่จะใช้ค่าของแอตทริบิวต์เหล่านี้ เพื่อกำหนดขนาดคงที่ตามพิกเซลขององค์ประกอบ img ในเลย์เอาต์ สัดส่วนภาพของรูปภาพ แม้ว่าไวยากรณ์จะเหมือนกันก็ตาม เบราว์เซอร์สมัยใหม่จะแบ่งค่าเหล่านี้ออกจากกันเพื่อ กำหนดสัดส่วนภาพภายในขององค์ประกอบ img ก่อนที่หน้าจะแสดง ซึ่งช่วยให้รักษาพื้นที่ในรูปภาพขณะแสดงผลเลย์เอาต์

ตามกฎแล้ว คุณควรใช้แอตทริบิวต์ height และ width ใน <img> เสมอ ซึ่งมีค่าตรงกับขนาดที่แท้จริงของแหล่งที่มาของรูปภาพ ดังนั้น ตราบใดที่คุณแน่ใจว่าได้ระบุ height: auto ควบคู่ไปกับ max-width: 100% เพื่อลบล้างความสูงจากแอตทริบิวต์ HTML

<img src="image.jpg" height="200" width="400" alt="…">
img {
  max-width: 100%;
  height: auto;
}

การใช้แอตทริบิวต์ width และ height ในองค์ประกอบ <img> จะช่วยให้คุณหลีกเลี่ยงคะแนน CLS ที่สูงเนื่องจากรูปภาพ

โปรดทราบว่าวิธีนี้ไม่มีข้อเสียเปรียบ เนื่องจากวิธีนี้ต้องอาศัยลักษณะการทำงานของเบราว์เซอร์ที่มีมาอย่างยาวนาน นั่นคือทุกเบราว์เซอร์ พร้อมการรองรับ CSS พื้นฐานจะทำงานได้ตามเดิม โดยมีแอตทริบิวต์ height และ width ในมาร์กอัปลบล้างโดยสไตล์ของคุณ

แม้ว่าแอตทริบิวต์ width และ height จะหลีกเลี่ยงปัญหา CLS ได้อย่างชาญฉลาดด้วยการจองพื้นที่เลย์เอาต์ที่จำเป็นสำหรับรูปภาพ และนำเสนอ ผู้ใช้ที่ไม่มีช่องว่างหรือมีตัวยึดตำแหน่งที่มีคุณภาพต่ำ พวกเขารอให้ภาพโอนและแสดงผลก็ไม่ค่อยดีเช่นกัน แม้ว่ายังมีสิ่งที่คุณทำได้เพื่อลดความสามารถในการวัดผลและการรับรู้ที่รับรู้ได้ ผลกระทบของรูปภาพที่โหลดช้า วิธีเดียวที่จะนำเสนอรูปภาพที่แสดงผลแบบเต็มแก่ผู้ใช้ได้เร็วขึ้นคือการลดขนาดการโอน

การแสดงผลเนื้อหาขนาดใหญ่ที่สุด

Largest Contentful Paint (LCP) จะวัดเวลาที่ใช้ในการแสดงผลองค์ประกอบ "contentful" ขนาดใหญ่ที่สุดที่มองเห็นได้ในวิวพอร์ตของผู้ใช้ องค์ประกอบที่ใช้พื้นที่มากที่สุดของหน้าที่มองเห็นได้ อาจจะดูเป็นเมตริกที่มีความเฉพาะเจาะจงมากเกินไป ทำหน้าที่เป็นพร็อกซีที่ใช้ได้จริงสำหรับจุดที่แสดงหน้าเว็บส่วนใหญ่ จากมุมมองของผู้ใช้ LCP มีความสำคัญอย่างยิ่ง การวัดประสิทธิภาพ (ที่รับรู้)

เมตริก เช่น DOMContentLoaded หรือเหตุการณ์ window.onload อาจเป็นประโยชน์ในการระบุกระบวนการโหลดหน้าเว็บปัจจุบัน ดำเนินการในทางเทคนิคแล้ว แต่อาจไม่ได้สอดคล้องกับประสบการณ์การใช้งานหน้าเว็บของผู้ใช้ ความล่าช้าเล็กน้อยในการแสดงผลองค์ประกอบ นอกวิวพอร์ตของผู้ใช้จะถูกนำไปเป็นปัจจัยในเมตริกเหล่านี้ แต่ก็เป็นไปได้ว่าผู้ใช้จริงจะตรวจไม่พบเลย LCP แบบยาวหมายถึงการแสดงผลหน้าเว็บครั้งแรกของผู้ใช้ ซึ่งเป็นเนื้อหาที่สำคัญที่สุดในวิวพอร์ตปัจจุบัน คือหน้าเว็บช้า หรือเสียไปเลย

การรับรู้ของผู้ใช้ที่ LCP รวบรวมได้จะมีผลต่อประสบการณ์ของผู้ใช้โดยตรง การทดสอบโดย Vodafone เมื่อปีที่แล้ว พบว่า LCP เพิ่มขึ้น 31% ไม่เพียงแต่ทำให้ยอดขายเพิ่มขึ้น 8% ซึ่งเป็นผลลัพธ์ที่ยอดเยี่ยมเพียงอย่างเดียว แต่จำนวนผู้ใช้ทั้งหมดยังพบ 15% เพิ่มขึ้นของผู้เข้าชมที่กลายเป็นผู้มีโอกาสเป็นลูกค้า ("อัตราผู้เข้าชมต่อผู้มีโอกาสเป็นลูกค้า") และเพิ่มขึ้น 11% ในจำนวนผู้ใช้ ผู้ที่เข้าชมรถเข็นของตน ("อัตราจากรถเข็นต่อการเข้าชม")

ในหน้าเว็บมากกว่า 70% ซึ่งเป็นองค์ประกอบที่ใหญ่ที่สุดในช่วงเริ่มต้น วิวพอร์ตเกี่ยวข้องกับรูปภาพ ไม่ว่าจะเป็นองค์ประกอบ <img> แบบแยกเดี่ยวหรือองค์ประกอบที่มีภาพพื้นหลัง กล่าวคือ 70% ของหน้าเว็บ คะแนน LCP จะอิงตามประสิทธิภาพของรูปภาพ ไม่จำเป็นต้องจินตนาการมากนักเพื่อหาเหตุผลว่าทำไมคุณถึงจะเห็นว่ายิ่งใหญ่และดึงดูดความสนใจ รูปภาพและโลโก้จึงมีแนวโน้มที่จะปรากฏที่ "ครึ่งหน้าบน"

LCP ที่ไฮไลต์ในคอนโซลของหน้า web.dev

คุณหลีกเลี่ยงความล่าช้าของ LCP ได้ด้วย 2-3 ขั้นตอนดังนี้ ก่อนอื่น อย่าระบุ loading="lazy" ใน "ครึ่งหน้าบน" รูปภาพ เนื่องจากการชะลอคำขอไปจนกว่าจะแสดงผลหน้าเว็บแล้วมีแนวโน้มที่จะส่งผลกระทบด้านลบอย่างมากต่อคะแนน LCP ของคุณ ข้อที่ 2 การใช้ fetchpriority="high" จะบอกให้เบราว์เซอร์ทราบว่าการโอนรูปภาพนี้ควรให้ความสำคัญกับการโอนรูปภาพเหนือรูปภาพส่วนอื่นๆ ในหน้าเว็บ

เมื่อคำนึงถึงกฎเหล่านั้นอย่างถ่องแท้ สิ่งสำคัญที่สุดที่คุณทำได้เพื่อปรับปรุงคะแนน LCP ของหน้าเว็บคือการลดระยะเวลา ที่ต้องใช้ในการโอนและแสดงภาพ ในการทำเช่นนั้น คุณจะต้องทำให้แหล่งที่มาของรูปภาพมีขนาดเล็กและมีประสิทธิภาพ (โดยไม่ลดคุณภาพ) และดูแลให้ผู้ใช้ได้รับเฉพาะชิ้นงานรูปภาพที่ใช้ประโยชน์สูงสุด ต่อบริบทการท่องเว็บของผู้ใช้ได้อย่างไร

บทสรุป

ชิ้นงานรูปภาพคือการระบายความรู้สึกของผู้ใช้มากที่สุด แบนด์วิดท์ - แบนด์วิดท์ที่ไม่ได้ใช้ในการโอนเนื้อหาอื่นๆ ทั้งหมดที่จำเป็น เพื่อแสดงผลหน้าเว็บ รูปภาพก่อให้เกิดปัญหาสำคัญในแง่ของประสิทธิภาพที่รับรู้ ทั้งในระหว่างและหลังหน้าเว็บโดยรอบ แสดงผลเลย์เอาต์แล้ว กล่าวโดยสรุปคือชิ้นงานรูปภาพเป็นความเสียหาย

เรื่องนี้อาจทำให้คุณกังวลใจ แต่ "การใช้เว็บจะดีกว่าหากรูปภาพน้อยลง" ก็จะต้องแสดงในเรื่องประสิทธิภาพเพียงอย่างเดียว และยังทำให้ผู้ใช้สูญเสียบริการอันมหาศาลด้วย รูปภาพเป็นส่วนสำคัญของเว็บ และคุณไม่ควรลดคุณภาพของ เนื้อหาที่มีความหมายเพื่อประสิทธิภาพเพียงอย่างเดียว

ในส่วนที่เหลือของหลักสูตรนี้ คุณจะได้เรียนรู้เกี่ยวกับเทคโนโลยีที่ขับเคลื่อนชิ้นงานรูปภาพและเทคนิคของเราในการบรรเทาปัญหา ผลกระทบด้านประสิทธิภาพ แต่ไม่กระทบต่อคุณภาพ