คุณสามารถโหลดรูปภาพที่ปรับเปลี่ยนตามอุปกรณ์ล่วงหน้า ซึ่งจะทำให้รูปภาพโหลดได้
ทำงานได้เร็วขึ้นอย่างมากด้วยการช่วยเบราว์เซอร์ระบุรูปภาพที่ถูกต้อง
จาก srcset
ก่อนจะแสดงแท็ก img
ภาพรวมของรูปภาพที่ปรับเปลี่ยนตามอุปกรณ์
การรองรับเบราว์เซอร์
สมมติว่าคุณกำลังท่องเว็บบนหน้าจอที่กว้าง 300 พิกเซลและหน้าเว็บ ขอรูปภาพที่มีความกว้าง 1500 พิกเซล หน้าดังกล่าวสูญเสียอุปกรณ์เคลื่อนที่ไปเป็นจำนวนมาก เพราะหน้าจอของคุณไม่สามารถทำอะไรได้เลยด้วยความละเอียดที่เกินมานี้ โดยหลักการแล้ว เบราว์เซอร์จะดึงเวอร์ชันที่รูปภาพน้อย กว้างกว่าขนาดหน้าจอ เช่น 325 พิกเซล วิธีนี้ช่วยให้มั่นใจว่า ภาพความละเอียดสูงโดยไม่สูญเสียข้อมูลและช่วยให้รูปภาพโหลดเร็วขึ้น
รูปภาพที่ปรับเปลี่ยนตามอุปกรณ์
ให้เบราว์เซอร์ดึงทรัพยากรรูปภาพที่แตกต่างกันสำหรับอุปกรณ์ต่างๆ หากไม่
ใช้ CDN รูปภาพ แล้วบันทึกหลายขนาดสำหรับแต่ละรายการ
และระบุรูปภาพในแอตทริบิวต์ srcset
ค่า w
จะบอก
ความกว้างของแต่ละเวอร์ชัน เพื่อให้เลือกเวอร์ชันที่เหมาะสมสำหรับ
อุปกรณ์ใดก็ได้:
<img src="small.jpg" srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 1500w" alt="…">
ภาพรวมการโหลดล่วงหน้า
การโหลดล่วงหน้าช่วยให้คุณบอกเบราว์เซอร์เกี่ยวกับ ทรัพยากรสำคัญที่ต้องการโหลดโดยเร็วที่สุดก่อน ที่พบใน HTML ซึ่งจะเป็นประโยชน์อย่างยิ่งสำหรับทรัพยากรที่ไม่พร้อมทำงาน ค้นพบได้ เช่น แบบอักษรที่อยู่ในสไตล์ชีต ภาพพื้นหลัง หรือ ที่โหลดจากสคริปต์
<link rel="preload" as="image" href="important.png">
imagesrcset
และ imagesizes
องค์ประกอบ <link>
ใช้แอตทริบิวต์ imagesrcset
และ imagesizes
เพื่อ
โหลดรูปภาพที่ปรับเปลี่ยนตามอุปกรณ์ล่วงหน้า ใช้คู่กัน
<link rel="preload">
โดยใช้ไวยากรณ์ srcset
และ sizes
ใน
องค์ประกอบ <img>
ตัวอย่างเช่น หากคุณต้องการโหลดรูปภาพที่ปรับเปลี่ยนตามอุปกรณ์ล่วงหน้าที่ระบุไว้ด้วยสิ่งต่อไปนี้
<img src="wolf.jpg" srcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w" sizes="50vw" alt="A rad wolf">
ซึ่งทำได้โดยการเพิ่มโค้ดต่อไปนี้ลงใน <head>
ของ HTML
<link rel="preload" as="image" href="wolf.jpg" imagesrcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w" imagesizes="50vw">
การดําเนินการนี้จะเริ่มต้นคําขอโดยใช้ตรรกะการเลือกทรัพยากรเดียวกันกับที่
ใช้ srcset
และ sizes
กรณีการใช้งาน
ต่อไปนี้เป็นกรณีการใช้งานสำหรับการโหลดรูปภาพที่ตอบสนองตามอุปกรณ์ล่วงหน้า
โหลดรูปภาพที่ตอบสนองแบบแทรกแบบไดนามิกไว้ล่วงหน้า
ลองจินตนาการว่าคุณกำลังโหลดรูปภาพหลักแบบไดนามิกเป็นส่วนหนึ่งของการแสดงภาพสไลด์ และคุณ ให้ทราบว่ารูปภาพใดจะแสดงก่อน ในกรณีนี้ คุณอาจต้องการ แสดงรูปภาพนั้นโดยเร็วที่สุด และไม่ต้องรอให้สคริปต์สไลด์โชว์ โหลดขึ้นมา
คุณตรวจสอบปัญหานี้ได้ในเว็บไซต์ที่มีแกลเลอรีรูปภาพที่โหลดแบบไดนามิก โดยทำดังนี้
- เปิดการสาธิตสไลด์โชว์นี้ ในแท็บใหม่
- กด
Control+Shift+J
(หรือCommand+Option+J
ใน Mac) เพื่อเปิดเครื่องมือสำหรับนักพัฒนาเว็บ - คลิกแท็บเครือข่าย
- ในรายการแบบเลื่อนลงการควบคุม ให้เลือก 3G ที่รวดเร็ว
- ปิดใช้ช่องทำเครื่องหมายปิดใช้แคช
- โหลดหน้าเว็บซ้ำ
การใช้ preload
ในจุดนี้ช่วยให้รูปภาพเริ่มโหลดล่วงหน้าได้
พร้อมแสดงเมื่อเบราว์เซอร์จำเป็นต้องแสดงผล
หากต้องการดูความแตกต่างที่เกิดขึ้นระหว่างการโหลดล่วงหน้า ให้ตรวจสอบข้อความเดียวกันที่โหลดแบบไดนามิก แกลเลอรีรูปภาพแต่มีการโหลดรูปภาพแรกไว้ล่วงหน้า โดยทำตามขั้นตอนจากตัวอย่างแรก
โหลดภาพพื้นหลังล่วงหน้าโดยใช้ชุดรูปภาพ
หากมีภาพพื้นหลังที่แตกต่างกันตามความหนาแน่นของหน้าจอที่แตกต่างกัน คุณจะทำสิ่งต่อไปนี้ได้
ให้ระบุใน CSS ด้วยไวยากรณ์ image-set
จากนั้นเบราว์เซอร์จะ
ให้เลือกแอปที่จะแสดงตามหน้าจอ
DPR
background-image: image-set( "cat.png" 1x, "cat-2x.png" 2x);
ปัญหาของภาพพื้นหลัง CSS คือ เบราว์เซอร์จะค้นพบภาพเหล่านั้น
หลังจากที่ดาวน์โหลดและประมวลผล CSS ทั้งหมดใน <head>
ของหน้าเท่านั้น
คุณตรวจสอบปัญหานี้ได้ในเว็บไซต์ตัวอย่างที่มี ภาพพื้นหลังที่ปรับเปลี่ยนตามอุปกรณ์
การโหลดรูปภาพที่ปรับเปลี่ยนตามอุปกรณ์ล่วงหน้าจะช่วยให้คุณโหลดรูปภาพเหล่านั้นได้เร็วขึ้น
<link rel="preload" as="image" imagesrcset="cat.png 1x, cat-2x.png 2x">
การไม่ระบุแอตทริบิวต์ href
จะช่วยให้มั่นใจได้ว่าเบราว์เซอร์จะไม่
รองรับ imagesrcset
ในองค์ประกอบ <link>
แต่รองรับ image-set
ใน
CSS ดาวน์โหลดแหล่งที่มาที่ถูกต้อง อย่างไรก็ตาม พวกเขาจะไม่ได้รับประโยชน์จากการโหลดล่วงหน้าใน
สำหรับกรณีนี้
คุณตรวจสอบลักษณะการทำงานของตัวอย่างก่อนหน้าได้โดยใช้ฟีเจอร์ที่ปรับเปลี่ยนตามอุปกรณ์ที่โหลดไว้ล่วงหน้า ภาพพื้นหลังในการสาธิตการโหลดพื้นหลังล่วงหน้าที่ปรับเปลี่ยนตามอุปกรณ์
ผลกระทบในทางปฏิบัติของการโหลดรูปภาพที่ตอบสนองตามอุปกรณ์ล่วงหน้า
ในทางทฤษฎี การโหลดรูปภาพที่ตอบสนองตามอุปกรณ์ล่วงหน้าจะทำให้เร็วขึ้นได้อย่างไร ในทางปฏิบัติได้อย่างไร
เพื่อตอบคำถามว่า เราได้สร้างสำเนาของร้านค้า PWA สาธิตไว้ 2 ชุด ดังนี้ แบบที่ไม่โหลดรูปภาพล่วงหน้า และURL ที่โหลด บางส่วนไว้ล่วงหน้า เนื่องจากไซต์แบบ Lazy Loading จะโหลดรูปภาพโดยใช้ JavaScript จึงจะได้ประโยชน์จาก โหลดรายการที่ปรากฏในวิวพอร์ตเริ่มต้นไว้ล่วงหน้า
ที่ทำให้เกิดผลลัพธ์ต่อไปนี้สำหรับ ไม่ต้องโหลดล่วงหน้า และสำหรับการโหลดรูปภาพล่วงหน้า
- เริ่มแสดงผล เหมือนเดิม
- ดัชนีความเร็ว ปรับปรุงเล็กน้อย (273 มิลลิวินาที เนื่องจากรูปภาพที่แสดงเร็วขึ้นไม่ได้กินพื้นที่จำนวนมาก ของพื้นที่พิกเซล)
- Last Painted Hero ดีขึ้นอย่างเห็นได้ชัด คือ 1.2 วินาที
การโหลดล่วงหน้าและ <picture>
คณะทำงานด้านประสิทธิภาพเว็บไซต์กำลังหารือเกี่ยวกับการเพิ่มการโหลดล่วงหน้าที่เทียบเท่าสำหรับ
srcset
และ sizes
แต่ไม่ใช่ <picture>
ซึ่งจะจัดการ"ทิศทางศิลปะ"
Use Case
ยังมีปัญหาทางเทคนิคที่ต้องตรวจสอบอีกหลายประการสำหรับการโหลด <picture>
ล่วงหน้า
แต่ในระหว่างนี้ก็มีวิธีแก้ไขเบื้องต้นดังนี้
<picture>
<source srcset="small_cat.jpg" media="(max-width: 400px)">
<source srcset="medium_cat.jpg" media="(max-width: 800px)">
<img src="large_cat.jpg">
</picture>
ตรรกะการเลือกแหล่งที่มาของรูปภาพขององค์ประกอบ <picture>
ไปทับ media
ของเอลิเมนต์ <source>
ตามลำดับ ให้หารายการแรกที่
ตรงกัน และใช้แหล่งข้อมูลที่แนบมา
เนื่องจากการโหลดล่วงหน้าแบบตอบสนองตามอุปกรณ์จะไม่มีคำว่า "คำสั่งซื้อ" หรือ "การจับคู่รายการแรก" คุณจะ ต้องแปลเบรกพอยท์ให้เป็นดังนี้
<link rel="preload" href="small_cat.jpg" as="image" media="(max-width: 400px)">
<link rel="preload" href="medium_cat.jpg" as="image" media="(min-width: 400.1px) and (max-width: 800px)">
<link rel="preload" href="large_cat.jpg" as="image" media="(min-width: 800.1px)">
การโหลดล่วงหน้าและ type
องค์ประกอบ <picture>
ยังรองรับการจับคู่ใน type
รายการแรกด้วย คุณจึง
ให้รูปแบบรูปภาพที่แตกต่างกันเพื่อให้เบราว์เซอร์สามารถเลือกรูปแบบภาพแรก
ที่รองรับ การโหลดล่วงหน้าไม่รองรับกรณีการใช้งานนี้
สำหรับเว็บไซต์ที่ใช้การจับคู่ประเภท เราขอแนะนำให้หลีกเลี่ยงการโหลดล่วงหน้า และ
เครื่องมือสแกนการโหลดล่วงหน้าจะดึงรูปภาพจาก
<picture>
และ <source>
แทน อย่างไรก็ดีนี่เป็นแนวทางปฏิบัติที่ดีที่สุด
โดยเฉพาะเมื่อใช้ Fetch Priority เพื่อช่วยในการจัดลำดับความสำคัญ
รูปภาพที่เหมาะสม
ผลต่อ Largest Contentful Paint (LCP)
เนื่องจากรูปภาพอาจเป็นตัวเลือก Largest Contentful Paint (LCP) ได้ การโหลดการโหลดล่วงหน้าจะช่วยเพิ่ม LCP ของเว็บไซต์ของคุณได้
ไม่ว่ารูปภาพที่โหลดล่วงหน้าจะปรับเปลี่ยนตามอุปกรณ์หรือไม่ การโหลดล่วงหน้าจะทำงานได้ จะดีที่สุดเมื่อไม่พบทรัพยากรอิมเมจในเพย์โหลดมาร์กอัปเริ่มต้น คุณยังจะได้รับการปรับปรุง LCP เพิ่มขึ้นในเว็บไซต์ที่แสดงมาร์กอัปในไคลเอ็นต์ด้วย มากกว่าเว็บไซต์ที่ส่งมาร์กอัปที่สมบูรณ์จากเซิร์ฟเวอร์