ทำให้การเลือกทรัพยากรทำงานโดยอัตโนมัติด้วยคำแนะนำสำหรับไคลเอ็นต์

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

  • กำหนดรูปแบบที่เหมาะสม (เวกเตอร์กับแรสเตอร์)
  • กำหนดรูปแบบการเข้ารหัสที่เหมาะสมที่สุด (jpeg, webp ฯลฯ)
  • กำหนดการตั้งค่าการบีบอัดที่เหมาะสม (แบบสูญเสียและไม่สูญเสียข้อมูล)
  • กำหนดว่าควรเก็บหรือตัดข้อมูลเมตาใด
  • สร้างตัวแปรหลายรายการสำหรับแต่ละจอแสดงผล + ความละเอียดของ DPR
  • ...
  • พิจารณาประเภทเครือข่าย ความเร็ว และค่ากำหนดของผู้ใช้

เมื่อพิจารณาแยกกันแล้ว สิ่งเหล่านี้เป็นปัญหาที่เข้าใจได้ เมื่อรวมกันแล้ว พวกเขาได้สร้างพื้นที่ขนาดใหญ่เพื่อการเพิ่มประสิทธิภาพที่เรา (นักพัฒนาซอฟต์แวร์) มักมองข้ามหรือละเลยไป มนุษย์ทำงานแย่ๆ คือการสำรวจพื้นที่ค้นหาเดิมซ้ำๆ โดยเฉพาะเมื่อต้องหลายขั้นตอน ในทางกลับกัน คอมพิวเตอร์ทำงานประเภทนี้ได้อย่างดีเยี่ยม

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

ตำนานของนักพัฒนาซอฟต์แวร์ที่คำนึงถึงประสิทธิภาพ

พื้นที่การเพิ่มประสิทธิภาพการค้นหาผ่านรูปภาพมี 2 ระยะ ได้แก่ เวลาบิลด์และรันไทม์

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

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

<img src="/image/thing" sizes="50vw"
        alt="image thing displayed at 50% of viewport width">

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

  1. เธอต้องการใช้รูปแบบรูปภาพที่เหมาะสมที่สุดกับแต่ละไคลเอ็นต์เพื่อให้ได้การบีบอัดที่ดีที่สุด โดย WebP สำหรับ Chrome, JPEG XR สำหรับ Edge และ JPEG กับส่วนอื่นๆ
  2. เพื่อให้ได้ภาพที่มีคุณภาพดีที่สุด เธอต้องสร้างรูปแบบต่างๆ สำหรับรูปภาพแต่ละรูปที่มีความละเอียดแตกต่างกัน ซึ่งได้แก่ 1x, 1.5x, 2x, 2.5x, 3 เท่า
  3. เพื่อหลีกเลี่ยงการแสดงพิกเซลที่ไม่จำเป็น เธอต้องเข้าใจว่า "50% ของวิวพอร์ตผู้ใช้หมายถึงอะไร" ความกว้างวิวพอร์ตมีมากมาย
  4. ซึ่งตามหลักแล้ว เธอยังต้องการมอบประสบการณ์ที่ยืดหยุ่น โดยผู้ใช้ในเครือข่ายที่ช้ากว่าจะดึงข้อมูลความละเอียดที่ต่ำกว่าโดยอัตโนมัติ ตอนนี้ก็ได้เวลาแก้วน้ำแล้ว
  5. แอปพลิเคชันยังแสดงการควบคุมของผู้ใช้บางอย่างที่มีผลต่อทรัพยากรรูปภาพที่ควรดึงข้อมูล ดังนั้นจึงต้องมีการควบคุมดังกล่าวด้วยเช่นกัน

แล้วนักออกแบบก็นึกขึ้นได้ว่าต้องแสดงรูปภาพอื่นที่มีความกว้าง 100% หากวิวพอร์ตมีขนาดเล็กเพื่อให้อ่านได้ง่ายขึ้น ซึ่งหมายความว่าตอนนี้เราต้องทำขั้นตอนเดิมซ้ำสำหรับเนื้อหาอีก 1 รายการ แล้วทำให้การดึงข้อมูลตามเงื่อนไขของขนาดวิวพอร์ต เคยบอกว่าเรื่องนี้ยากไหม งั้นเรามาเริ่มกันเลย องค์ประกอบ picture จะทำให้เราไปได้ไกล:

<picture>
    <!-- serve WebP to Chrome and Opera -->
    <source
    media="(min-width: 50em)"
    sizes="50vw"
    srcset="/image/thing-200.webp 200w, /image/thing-400.webp 400w,
        /image/thing-800.webp 800w, /image/thing-1200.webp 1200w,
        /image/thing-1600.webp 1600w, /image/thing-2000.webp 2000w"
    type="image/webp">
    <source
    sizes="(min-width: 30em) 100vw"
    srcset="/image/thing-crop-200.webp 200w, /image/thing-crop-400.webp 400w,
        /image/thing-crop-800.webp 800w, /image/thing-crop-1200.webp 1200w,
        /image/thing-crop-1600.webp 1600w, /image/thing-crop-2000.webp 2000w"
    type="image/webp">
    <!-- serve JPEGXR to Edge -->
    <source
    media="(min-width: 50em)"
    sizes="50vw"
    srcset="/image/thing-200.jpgxr 200w, /image/thing-400.jpgxr 400w,
        /image/thing-800.jpgxr 800w, /image/thing-1200.jpgxr 1200w,
        /image/thing-1600.jpgxr 1600w, /image/thing-2000.jpgxr 2000w"
    type="image/vnd.ms-photo">
    <source
    sizes="(min-width: 30em) 100vw"
    srcset="/image/thing-crop-200.jpgxr 200w, /image/thing-crop-400.jpgxr 400w,
        /image/thing-crop-800.jpgxr 800w, /image/thing-crop-1200.jpgxr 1200w,
        /image/thing-crop-1600.jpgxr 1600w, /image/thing-crop-2000.jpgxr 2000w"
    type="image/vnd.ms-photo">
    <!-- serve JPEG to others -->
    <source
    media="(min-width: 50em)"
    sizes="50vw"
    srcset="/image/thing-200.jpg 200w, /image/thing-400.jpg 400w,
        /image/thing-800.jpg 800w, /image/thing-1200.jpg 1200w,
        /image/thing-1600.jpg 1600w, /image/thing-2000.jpg 2000w">
    <source
    sizes="(min-width: 30em) 100vw"
    srcset="/image/thing-crop-200.jpg 200w, /image/thing-crop-400.jpg 400w,
        /image/thing-crop-800.jpg 800w, /image/thing-crop-1200.jpg 1200w,
        /image/thing-crop-1600.jpg 1600w, /image/thing-crop-2000.jpg 2000w">
    <!-- fallback for browsers that don't support picture -->
    <img src="/image/thing.jpg" width="50%">
</picture>

เราได้จัดการเกี่ยวกับทิศทางศิลปะ การเลือกรูปแบบ และจัดเตรียมรูปแบบ 6 แบบของแต่ละรูปภาพให้รองรับความแปรปรวนของ DPR และความกว้างของวิวพอร์ตของอุปกรณ์ไคลเอ็นต์ น่าประทับใจ

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

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

การเลือกทรัพยากรโดยอัตโนมัติพร้อมคำแนะนำสำหรับไคลเอ็นต์

สูดลมหายใจเข้าลึกๆ ระงับความเชื่อใจ แล้วลองพิจารณาตัวอย่างต่อไปนี้

<meta http-equiv="Accept-CH" content="DPR, Viewport-Width, Width">
...
<picture>
    <source media="(min-width: 50em)" sizes="50vw" srcset="/image/thing">
    <img sizes="100vw" src="/image/thing-crop">
</picture>

เชื่อหรือไม่ว่าตัวอย่างด้านบนก็เพียงพอแล้วสำหรับการแสดงความสามารถทั้งหมดเหมือนกับมาร์กอัปรูปภาพขนาดยาวด้านบนบวกอย่างที่เราเห็นอยู่แล้ว ซึ่งช่วยให้นักพัฒนาแอปควบคุมวิธีการ ดึงข้อมูลทรัพยากรรูปภาพ รวมถึงเวลาที่ดึงทรัพยากรรูปภาพได้อย่างเต็มที่ "เวทมนตร์" จะอยู่ในบรรทัดแรกที่ เปิดใช้การรายงานคำแนะนำของลูกค้า และบอกเบราว์เซอร์ให้โฆษณาอัตราส่วนพิกเซลของอุปกรณ์ (DPR), ความกว้างของ วิวพอร์ตของเลย์เอาต์ (Viewport-Width) และความกว้างของการแสดงผลที่ต้องการ (Width) ของ เซิร์ฟเวอร์

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

Chrome 46 จะรองรับในตัวสำหรับคำแนะนำ DPR, Width และ Viewport-Width ระบบจะปิดใช้คำแนะนำไว้โดยค่าเริ่มต้นและ <meta http-equiv="Accept-CH" content="..."> ด้านบนจะทำหน้าที่เป็นสัญญาณการเลือกใช้ที่บอกให้ Chrome เพิ่มส่วนหัวที่ระบุต่อท้ายคำขอขาออก เมื่อพร้อมแล้ว มาตรวจสอบส่วนหัวของคำขอและคำตอบสำหรับคำขอรูปภาพตัวอย่างกัน

แผนภาพการเจรจาต่อรองสําหรับคําแนะนําลูกค้า

Chrome โฆษณาการรองรับรูปแบบ WebP ผ่านส่วนหัวของคำขอ "ยอมรับ" ส่วนเบราว์เซอร์ Edge ใหม่จะโฆษณาการรองรับ JPEG XR ผ่านส่วนหัว "ยอมรับ" ในทำนองเดียวกัน

ส่วนหัวของคำขอ 3 รายการถัดไปคือส่วนหัวของคำแนะนำจากลูกค้าที่โฆษณาอัตราส่วนพิกเซลของอุปกรณ์ของลูกค้า (3 เท่า) ความกว้างของวิวพอร์ตของเลย์เอาต์ (460 พิกเซล) และความกว้างของการแสดงผลที่ต้องการของทรัพยากร (230 พิกเซล) ซึ่งจะเป็นการให้ข้อมูลที่จำเป็นทั้งหมดแก่เซิร์ฟเวอร์เพื่อเลือกรูปแบบรูปภาพที่ดีที่สุดโดยอิงตามชุดนโยบายของตัวเอง เช่น ความพร้อมใช้งานของทรัพยากรที่สร้างไว้ล่วงหน้า ค่าใช้จ่ายในการเข้ารหัสซ้ำหรือการปรับขนาดทรัพยากร ความนิยมของทรัพยากร โหลดของเซิร์ฟเวอร์ปัจจุบัน และอื่นๆ ในกรณีนี้ เซิร์ฟเวอร์จะใช้คำแนะนำ DPR และ Width และแสดงผลทรัพยากร WebP ตามที่ระบุโดยส่วนหัว Content-Type, Content-DPR และ Vary

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

<img src="/image/thing" sizes="50vw"
        alt="image thing displayed at 50% of viewport width">

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

ควบคุมการเลือกทรัพยากรด้วย Service Worker

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

self.onfetch = function(event) {
    var req = event.request.clone();
    console.log("SW received request for: " + req.url)
    for (var entry of req.headers.entries()) {
    console.log("\t" + entry[0] +": " + entry[1])
    }
    ...
}
โปรแกรมให้คำแนะนำไคลเอ็นต์

ServiceWorker ให้คุณควบคุมการเลือกทรัพยากรฝั่งไคลเอ็นต์ได้อย่างเต็มรูปแบบ เรื่องนี้สำคัญมาก ปล่อยให้มันจมลงเพราะความเป็นไปได้นั้น แทบไม่มีที่สิ้นสุดเลยทีเดียว

  • คุณจะเขียนค่าส่วนหัวของคำแนะนำไคลเอ็นต์ใหม่ที่ตั้งค่าโดย User Agent ได้
  • คุณเพิ่มค่าส่วนหัวคำแนะนำสำหรับไคลเอ็นต์ใหม่ต่อท้ายคำขอได้
  • คุณสามารถเขียน URL ใหม่และชี้คำขอรูปภาพไปที่เซิร์ฟเวอร์สำรอง (เช่น CDN)
    • คุณยังสามารถย้ายค่าคำแนะนำจากส่วนหัวไปยัง URL เองได้ด้วยหากการดำเนินการนี้ทำให้ทุกอย่างง่ายขึ้นในโครงสร้างพื้นฐานของคุณ
  • คุณสามารถแคชการตอบกลับและกำหนดตรรกะของตนเองสำหรับทรัพยากรที่จะแสดงได้
  • คุณปรับคําตอบได้ตามการเชื่อมต่อของผู้ใช้
  • คุณนำการลบล้างค่ากำหนดแอปพลิเคชันและค่ากำหนดของผู้ใช้มาพิจารณาได้
  • คุณสามารถสร้างได้ทุกอย่างที่หัวใจต้องการ

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

คำถามที่พบบ่อยเกี่ยวกับคำแนะนำสำหรับไคลเอ็นต์

  1. คำแนะนำสำหรับลูกค้ามีอยู่ที่ใดบ้าง จัดส่งแล้วใน Chrome 46 อยู่ระหว่างการพิจารณาใน Firefox และ Edge

  2. เหตุใดการเลือกใช้คำแนะนำจากลูกค้า เราต้องการลดค่าใช้จ่ายในการดำเนินการสำหรับเว็บไซต์ที่ไม่ใช้คำแนะนำสำหรับไคลเอ็นต์ หากต้องการเปิดใช้คำแนะนำสำหรับไคลเอ็นต์ เว็บไซต์ควรระบุส่วนหัว Accept-CH หรือคำสั่ง <meta http-equiv> ที่เทียบเท่าในมาร์กอัปหน้าเว็บ หากมีตัวเลือกข้างต้น User Agent จะเพิ่มคำแนะนำที่เหมาะสมต่อท้ายคำขอทรัพยากรย่อยทั้งหมด ในอนาคต เราอาจมีกลไกเพิ่มเติมให้คงค่ากำหนดนี้สำหรับต้นทางหนึ่งๆ ไว้ ซึ่งจะทำให้ระบบสามารถแสดงคำแนะนำเดียวกันนี้ในคำขอการนำทาง

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

  4. คำใบ้จากลูกค้ามีไว้สำหรับแหล่งข้อมูลรูปภาพเท่านั้นใช่ไหม กรณีการใช้งานหลักของคำแนะนำ DPR, ความกว้างของวิวพอร์ต และความกว้างคือการเปิดใช้การเลือกทรัพยากรสำหรับชิ้นงานรูปภาพ อย่างไรก็ตาม ระบบจะส่งคำแนะนำเดียวกันสำหรับทรัพยากรย่อยทั้งหมดโดยไม่คำนึงถึงประเภท เช่น คำขอ CSS และ JavaScript จะได้รับข้อมูลเดียวกันและสามารถใช้เพื่อเพิ่มประสิทธิภาพทรัพยากรเหล่านั้นด้วย

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

  6. แล้ว <แทรกคำแนะนำโปรดของฉัน> ล่ะ ServiceWorker ช่วยให้นักพัฒนาซอฟต์แวร์สามารถสกัดกั้นและแก้ไข (เช่น เพิ่มส่วนหัวใหม่) คำขอขาออกทั้งหมด ตัวอย่างเช่น คุณสามารถเพิ่มข้อมูลที่อิงตาม NetInfo เพื่อระบุประเภทการเชื่อมต่อปัจจุบันได้อย่างง่ายดาย โปรดดู "การรายงานความสามารถด้วย ServiceWorker" คำแนะนำ "เนทีฟ" ที่ส่งใน Chrome (DPR, ความกว้าง, ความกว้างทรัพยากร) มีการนำมาใช้ในเบราว์เซอร์เนื่องจากการใช้งานแบบ SW เพียงอย่างเดียวจะทำให้คำขอรูปภาพทั้งหมดล่าช้า

  7. ฉันจะดูข้อมูลเพิ่มเติม ดูตัวอย่างเพิ่มเติม และเนื้อหาที่เกี่ยวข้องได้ที่ใด โปรดดูเอกสารอธิบาย และเปิดปัญหาใน GitHub หากคุณมีความคิดเห็นหรือคำถามอื่นๆ