ดูข้อมูลเกี่ยวกับคำแนะนำด้านทรัพยากร rel=prefetch และวิธีใช้
ผลการวิจัยพบว่าเวลาในการโหลดที่เร็วขึ้นส่งผลให้อัตรา Conversion สูงขึ้นและประสบการณ์ของผู้ใช้ที่ดีขึ้น หากคุณมีข้อมูลเชิงลึกเกี่ยวกับวิธีที่ผู้ใช้ไปยังส่วนต่างๆ ในเว็บไซต์ของคุณและหน้าใดที่พวกเขาน่าจะเข้าชมเป็นลำดับถัดไป คุณจะสามารถปรับปรุงเวลาในการโหลดของการนำทางในอนาคตได้ด้วยการดาวน์โหลดทรัพยากรสำหรับหน้าเว็บเหล่านั้นล่วงหน้า
คู่มือนี้อธิบายวิธีบรรลุเป้าหมายนี้ด้วย <link rel=prefetch>
ซึ่งเป็นคำแนะนำเกี่ยวกับทรัพยากรที่จะช่วยให้คุณใช้การดึงข้อมูลล่วงหน้าได้อย่างง่ายดายและมีประสิทธิภาพ
ปรับปรุงการนำทางด้วย rel=prefetch
การเพิ่ม <link rel=prefetch>
ลงในหน้าเว็บจะบอกให้เบราว์เซอร์ดาวน์โหลดทั้งหน้าเว็บหรือทรัพยากรบางอย่าง (เช่น สคริปต์หรือไฟล์ CSS) ที่ผู้ใช้อาจต้องใช้ในอนาคต
<link rel="prefetch" href="/articles/" as="document">
คำแนะนำ prefetch
จะใช้ไบต์เพิ่มเติมสำหรับทรัพยากรที่ไม่จำเป็นต้องใช้ทันที คุณจึงต้องใช้เทคนิคนี้ให้ถี่ถ้วน ดึงข้อมูลทรัพยากรล่วงหน้าเฉพาะเมื่อคุณมั่นใจว่าผู้ใช้จำเป็นต้องใช้ทรัพยากรเหล่านั้นเท่านั้น พิจารณาอย่าดึงข้อมูลล่วงหน้าเมื่อผู้ใช้มีการเชื่อมต่อช้า คุณสามารถตรวจหาสาเหตุดังกล่าวได้โดยใช้ Network Information API
มีหลายวิธีในการระบุลิงก์ที่จะดึงข้อมูลล่วงหน้า วิธีที่ง่ายที่สุดคือ ดึงข้อมูลลิงก์แรกหรือลิงก์ 2-3 ลิงก์แรกในหน้าปัจจุบันไว้ล่วงหน้า นอกจากนี้ ยังมีไลบรารีที่ใช้แนวทางที่ซับซ้อนมากขึ้น ซึ่งจะอธิบายภายหลังในโพสต์นี้
กรณีการใช้งาน
การดึงข้อมูลหน้าที่ตามมาล่วงหน้า
ดึงข้อมูลเอกสาร HTML ล่วงหน้าเมื่อสามารถคาดคะเนหน้าเว็บที่ตามมาได้ ดังนั้นเมื่อคลิกลิงก์ หน้าเว็บจึงโหลดได้ทันที
ตัวอย่างเช่น ในหน้าข้อมูลผลิตภัณฑ์ที่แสดง คุณสามารถดึงข้อมูลหน้าเว็บของผลิตภัณฑ์ยอดนิยมในรายการล่วงหน้าได้ ในบางกรณี การนำทางถัดไปอาจทำได้ง่ายขึ้นกว่าที่จะคาดการณ์จากหน้ารถเข็นช็อปปิ้ง โอกาสที่ผู้ใช้จะเข้าชมหน้าชำระเงินมักจะสูง ซึ่งทำให้เป็นตัวเลือกที่ดีสำหรับการดึงข้อมูลล่วงหน้า
แม้ว่าการดึงข้อมูลทรัพยากรล่วงหน้าจะใช้แบนด์วิดท์เพิ่มเติม แต่ก็ช่วยปรับปรุงเมตริกประสิทธิภาพส่วนใหญ่ได้ เวลาที่ได้รับข้อมูลไบต์แรก (TTFB) มักจะต่ำกว่ามาก เนื่องจากคำขอเอกสารจะทำให้เกิดการพบแคช เนื่องจาก TTFB จะต่ำลง เมตริกที่อิงตามเวลาครั้งต่อๆ ไปจึงมักจะต่ำกว่าด้วยเช่นกัน รวมถึงการแสดงผลเนื้อหาขนาดใหญ่ที่สุด (LCP) และ First Contentful Paint (FCP)
การโหลดเนื้อหาแบบคงที่ล่วงหน้า
ดึงข้อมูลเนื้อหาแบบคงที่ล่วงหน้า เช่น สคริปต์หรือสไตล์ชีต เมื่อระบบคาดการณ์ส่วนถัดไปที่ผู้ใช้อาจเข้าชมได้ ซึ่งจะเป็นประโยชน์อย่างยิ่งเมื่อมีการแชร์เนื้อหาเหล่านี้ในหน้าเว็บหลายหน้า
ตัวอย่างเช่น Netflix ใช้ประโยชน์จากเวลาที่ผู้ใช้ในหน้าที่ออกจากระบบเพื่อดึงข้อมูล React ล่วงหน้า ซึ่งจะนำไปใช้เมื่อผู้ใช้ลงชื่อเข้าสู่ระบบ จึงลดเวลาในการโต้ตอบลง 30% สำหรับการนำทางในอนาคต
ผลของการดึงข้อมูลเนื้อหาแบบคงที่ล่วงหน้าต่อเมตริกประสิทธิภาพจะขึ้นอยู่กับทรัพยากรที่ดึงข้อมูลล่วงหน้า ดังนี้
- การโหลดรูปภาพล่วงหน้าอาจลดเวลา LCP สำหรับองค์ประกอบรูปภาพ LCP ลงอย่างมาก
- การดึงข้อมูลสไตล์ชีตล่วงหน้าช่วยปรับปรุงทั้ง FCP และ LCP ได้ เนื่องจากระบบจะกำจัดเวลาของเครือข่ายในการดาวน์โหลดสไตล์ชีต เนื่องจากสไตล์ชีตกําลังบล็อกการแสดงผล จึงลด LCP ได้เมื่อดึงข้อมูลล่วงหน้า ในกรณีที่องค์ประกอบ LCP ของหน้าถัดไปเป็นภาพพื้นหลัง CSS ที่ขอผ่านพร็อพเพอร์ตี้
background-image
ระบบจะดึงข้อมูลรูปภาพล่วงหน้าในฐานะทรัพยากรที่เกี่ยวเนื่องกับสไตล์ชีตที่ดึงข้อมูลล่วงหน้าด้วย - การดึงข้อมูล JavaScript ล่วงหน้าจะทำให้การประมวลผลสคริปต์ที่ดึงข้อมูลล่วงหน้าเกิดขึ้นเร็วกว่าการกำหนดให้ต้องดึงข้อมูลจากเครือข่ายก่อนในระหว่างการไปยังส่วนต่างๆ มาก ซึ่งอาจมีผลต่อการโต้ตอบกับ Next Paint (INP) ของหน้าเว็บ ในกรณีที่แสดงผลมาร์กอัปในไคลเอ็นต์ผ่าน JavaScript จะปรับปรุง LCP ได้ผ่านความล่าช้าของการโหลดทรัพยากรที่ลดลง และการแสดงภาพมาร์กอัปฝั่งไคลเอ็นต์ที่มีองค์ประกอบ LCP ของหน้าเว็บอาจเร็วขึ้น
- การโหลดแบบอักษรของเว็บที่หน้าเว็บปัจจุบันไม่ได้ใช้อยู่แล้ว สามารถกำจัดการเปลี่ยนเลย์เอาต์ได้ ในกรณีที่ใช้
font-display: swap;
ระบบจะยกเว้นระยะเวลาการสลับแบบอักษร ซึ่งช่วยให้แสดงผลข้อความได้เร็วขึ้นและลดการเปลี่ยนเลย์เอาต์ หากหน้าเว็บในอนาคตใช้แบบอักษรที่ดึงข้อมูลล่วงหน้าและองค์ประกอบ LCP ของหน้าเว็บเป็นบล็อกข้อความที่ใช้แบบอักษรเว็บ LCP ขององค์ประกอบนั้นจะเร็วขึ้นด้วย
การดึงข้อมูลกลุ่ม JavaScript แบบออนดีมานด์ล่วงหน้า
การแยกโค้ดแพ็กเกจ JavaScript ช่วยให้คุณโหลดเฉพาะบางส่วนของแอปและโหลดส่วนที่เหลือได้แบบ Lazy Loading หากใช้เทคนิคนี้ คุณจะใช้การดึงข้อมูลล่วงหน้ากับเส้นทางหรือคอมโพเนนต์ที่ไม่จำเป็นทันทีได้ แต่มีแนวโน้มที่จะได้รับคำขอในเร็วๆ นี้
ตัวอย่างเช่น หากคุณมีหน้าเว็บที่มีปุ่มที่เปิดกล่องโต้ตอบซึ่งมีเครื่องมือเลือกอีโมจิอยู่ คุณสามารถแบ่งปุ่มนั้นเป็นส่วน JavaScript 3 ส่วน ได้แก่ หน้าแรก กล่องโต้ตอบ และเครื่องมือเลือก หน้าแรกและกล่องโต้ตอบสามารถโหลดได้ในตอนแรก แต่สามารถโหลดเครื่องมือเลือกได้แบบออนดีมานด์ เครื่องมืออย่างเว็บแพ็กช่วยให้คุณสั่งเบราว์เซอร์ให้ดึงข้อมูลกลุ่มแบบออนดีมานด์เหล่านี้ล่วงหน้าได้
วิธีใช้ rel=prefetch
วิธีที่ง่ายที่สุดในการนำ prefetch
ไปใช้คือการเพิ่มแท็ก <link>
ลงใน <head>
ของเอกสาร ดังนี้
<head>
...
<link rel="prefetch" href="/articles/" as="document">
...
</head>
แอตทริบิวต์ as
ช่วยให้เบราว์เซอร์ตั้งค่าส่วนหัวที่ถูกต้องและระบุว่าทรัพยากรอยู่ในแคชแล้วหรือยัง ค่าตัวอย่างสำหรับแอตทริบิวต์นี้ ได้แก่ document
, script
, style
, font
, image
และอื่นๆ
คุณจะเริ่มการดึงข้อมูลล่วงหน้าผ่านส่วนหัว HTTP Link
ได้ด้วย โดยทำดังนี้
Link: </css/style.css>; rel=prefetch
ข้อดีของการระบุคำแนะนำการดึงข้อมูลล่วงหน้าในส่วนหัว HTTP คือเบราว์เซอร์ไม่จำเป็นต้องแยกวิเคราะห์เอกสารเพื่อหาคำแนะนำของทรัพยากร ซึ่งอาจช่วยปรับปรุงเล็กน้อยได้ในบางกรณี
การโหลดโมดูล JavaScript ล่วงหน้าด้วยความคิดเห็นที่น่ามหัศจรรย์ของ Webpack
Webpack ช่วยให้คุณสามารถดึงข้อมูลสคริปต์ล่วงหน้าสำหรับเส้นทางหรือฟังก์ชันที่คุณคาดว่าผู้ใช้จะเข้าชมหรือใช้เร็วๆ นี้
ข้อมูลโค้ดต่อไปนี้โหลดฟังก์ชันการจัดเรียงจากไลบรารี lodash เพื่อจัดเรียงกลุ่มหมายเลขที่จะส่งโดยแบบฟอร์ม
form.addEventListener("submit", e => {
e.preventDefault()
import('lodash.sortby')
.then(module => module.default)
.then(sortInput())
.catch(err => { alert(err) });
});
แทนที่จะต้องรอหน้า "ส่ง" เหตุการณ์ที่จะเกิดขึ้นเพื่อโหลดฟังก์ชันนี้ คุณสามารถดึงข้อมูลแหล่งข้อมูลนี้ล่วงหน้าเพื่อเพิ่มโอกาสที่จะมีทรัพยากรนั้นอยู่ในแคชตามเวลาที่ผู้ใช้ส่งแบบฟอร์ม Webpack ช่วยให้คุณใช้ความคิดเห็นมหัศจรรย์ภายใน import()
ได้ ดังนี้
form.addEventListener("submit", e => {
e.preventDefault()
import(/* webpackPrefetch: true */ 'lodash.sortby')
.then(module => module.default)
.then(sortInput())
.catch(err => { alert(err) });
});
การดำเนินการนี้จะบอกให้ Webpack แทรกแท็ก <link rel="prefetch">
ลงในเอกสาร HTML ดังนี้
<link rel="prefetch" as="script" href="1.bundle.js">
ข้อดีด้านประสิทธิภาพของการดึงข้อมูลแบบออนดีมานด์ล่วงหน้านั้นค่อนข้างจะต่างกันเล็กน้อย แต่โดยทั่วไปแล้วคุณน่าจะเห็นการตอบสนองที่เร็วขึ้นในการโต้ตอบซึ่งอาศัยกลุ่มแบบออนดีมานด์ เนื่องจากจะพร้อมใช้งานทันที การดำเนินการนี้อาจให้ประโยชน์กับ INP ของหน้าเว็บ ทั้งนี้ขึ้นอยู่กับลักษณะของการโต้ตอบ
โดยทั่วไปการดึงข้อมูลล่วงหน้ายังส่งผลต่อการจัดลําดับความสําคัญของทรัพยากรโดยรวมด้วย เมื่อมีการเรียกข้อมูลทรัพยากรล่วงหน้า ระบบจะดำเนินการดังกล่าวในลำดับความสำคัญต่ำสุด ดังนั้น ทรัพยากรที่ดึงข้อมูลล่วงหน้าจะไม่จำกัดแบนด์วิดท์สำหรับทรัพยากรที่หน้าปัจจุบันจำเป็นต้องใช้
การดึงข้อมูลล่วงหน้าอัจฉริยะด้วยลิงก์ด่วนและ Guess.js
นอกจากนี้คุณยังใช้การดึงข้อมูลล่วงหน้าที่มีประสิทธิภาพยิ่งขึ้นได้ด้วยไลบรารีที่ใช้ prefetch
ขั้นสูง ดังนี้
- quicklink ใช้ Intersection Observer API เพื่อตรวจจับเมื่อมีลิงก์เข้ามาในวิวพอร์ตและดึงข้อมูลทรัพยากรที่ลิงก์ไว้ล่วงหน้าในช่วงที่ไม่ได้ใช้งาน โบนัส: ลิงก์ด่วนหนักน้อยกว่า 1 KB!
- Guess.js ใช้รายงาน Analytics เพื่อสร้างโมเดลการคาดการณ์ที่ใช้ในการดึงข้อมูลล่วงหน้าอย่างชาญฉลาดเฉพาะสิ่งที่ผู้ใช้น่าจะต้องการ
ทั้ง Quicklink และ Guess.js จะใช้ Network Information API เพื่อหลีกเลี่ยงการดึงข้อมูลล่วงหน้าหากผู้ใช้อยู่ในเครือข่ายที่ช้าหรือเปิด Save-Data
ไว้
การดึงข้อมูลล่วงหน้า
คำแนะนำเกี่ยวกับแหล่งข้อมูลไม่ใช่คำสั่งที่บังคับ เบราว์เซอร์เป็นผู้ตัดสินใจว่าจะให้ดำเนินการตามคำแนะนำหรือไม่และเมื่อใด
คุณใช้การดึงข้อมูลล่วงหน้าได้หลายครั้งในหน้าเดียวกัน เบราว์เซอร์จะจัดคิวคำแนะนำและขอทรัพยากรทั้งหมดเมื่อไม่มีการใช้งาน ใน Chrome หากการดึงข้อมูลล่วงหน้ายังโหลดไม่เสร็จและผู้ใช้ไปยังทรัพยากรการดึงข้อมูลล่วงหน้าปลายทาง ระบบจะหยิบโหลดข้อมูลระหว่างดำเนินการดังกล่าวมาใช้เป็นการนำทางโดยเบราว์เซอร์ (ผู้ให้บริการเบราว์เซอร์รายอื่นๆ อาจใช้การดำเนินการนี้แตกต่างออกไป)
การดึงข้อมูลล่วงหน้าจะเกิดขึ้นที่ระดับ "ต่ำสุด" ลำดับความสำคัญ ดังนั้นทรัพยากรที่ดึงข้อมูลล่วงหน้าจะไม่แย่งแบนด์วิดท์กับทรัพยากรที่จำเป็นในหน้าปัจจุบัน
ไฟล์ที่ดึงข้อมูลล่วงหน้าจะเก็บไว้ในแคช HTTP หรือแคชหน่วยความจำ (ขึ้นอยู่กับว่าทรัพยากรนั้นสามารถแคชได้หรือไม่) โดยเป็นระยะเวลาที่แตกต่างกันไปตามเบราว์เซอร์ ตัวอย่างเช่น ในทรัพยากรของ Chrome จะเก็บไว้ประมาณ 5 นาที หลังจากนั้นกฎ Cache-Control
ปกติสำหรับทรัพยากรจะมีผล
บทสรุป
การใช้ prefetch
จะช่วยเพิ่มเวลาในการโหลดของการนำทางในอนาคตได้อย่างมาก และยังทำให้หน้าเว็บดูเหมือนโหลดทันทีด้วย prefetch
ได้รับการสนับสนุนอย่างแพร่หลายในเบราว์เซอร์สมัยใหม่ จึงทำให้เป็นเทคนิคที่น่าสนใจในการปรับปรุงประสบการณ์การนำทางสำหรับผู้ใช้จำนวนมาก เทคนิคนี้กำหนดให้โหลดไบต์เพิ่มเติมที่อาจไม่ได้ใช้ ดังนั้นโปรดระมัดระวังเมื่อใช้ ทำเมื่อจำเป็นเท่านั้น และโดยหลักการแล้วควรทำบนเครือข่ายที่มีความเร็วเท่านั้น