ดูข้อมูลเกี่ยวกับคำแนะนำทรัพยากร rel=prefetch และวิธีใช้
การวิจัยแสดงให้เห็นว่าเวลาในการโหลดที่เร็วขึ้นส่งผลให้อัตรา Conversion สูงขึ้นและผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีขึ้น หากมีข้อมูลเชิงลึกเกี่ยวกับวิธีที่ผู้ใช้ไปยังส่วนต่างๆ ของเว็บไซต์และหน้าเว็บที่ผู้ใช้มีแนวโน้มจะเข้าชมในลำดับถัดไป คุณสามารถปรับปรุงเวลาในการโหลดของการไปยังส่วนต่างๆ ในอนาคตได้โดยดาวน์โหลดทรัพยากรสําหรับหน้าเหล่านั้นล่วงหน้า
คู่มือนี้จะอธิบายวิธีดำเนินการดังกล่าวด้วย <link rel=prefetch>
ซึ่งเป็นคำแนะนำเกี่ยวกับทรัพยากรที่ช่วยให้คุณใช้การจําล่วงหน้าได้อย่างง่ายดายและมีประสิทธิภาพ
ปรับปรุงการนําทางด้วย rel=prefetch
การเพิ่ม <link rel=prefetch>
ลงในหน้าเว็บจะบอกให้เบราว์เซอร์ดาวน์โหลดทั้งหน้าหรือทรัพยากรบางส่วน (เช่น สคริปต์หรือไฟล์ CSS) ที่ผู้ใช้อาจต้องใช้ในอนาคต
<link rel="prefetch" href="/articles/" as="document">
คำแนะนำ prefetch
จะใช้ไบต์เพิ่มเติมสำหรับทรัพยากรที่ไม่จําเป็นในทันที คุณจึงต้องใช้เทคนิคนี้อย่างรอบคอบ โดยให้โหลดทรัพยากรล่วงหน้าเฉพาะเมื่อมั่นใจว่าผู้ใช้จะต้องใช้ พิจารณาไม่ใช้การโหลดล่วงหน้าเมื่อผู้ใช้ใช้การเชื่อมต่อที่ช้า คุณตรวจหาข้อมูลดังกล่าวได้ด้วย Network Information API
การกำหนดลิงก์ที่จะโหลดล่วงหน้ามีหลายวิธี วิธีง่ายที่สุดคือ prefetch ลิงก์แรกหรือลิงก์ 2-3 รายการแรกในหน้าปัจจุบัน นอกจากนี้ยังมีคลังที่ใช้แนวทางที่ซับซ้อนมากขึ้น ซึ่งจะอธิบายในภายหลังในโพสต์นี้
กรณีการใช้งาน
การโหลดหน้าเว็บถัดไปล่วงหน้า
โหลดเอกสาร HTML ล่วงหน้าเมื่อคาดการณ์หน้าเว็บต่อๆ ไปได้ เพื่อที่เมื่อมีการคลิกลิงก์ หน้าเว็บจะโหลดทันที
เช่น ในหน้าข้อมูลผลิตภัณฑ์ คุณสามารถโหลดหน้าเว็บสำหรับผลิตภัณฑ์ที่ได้รับความนิยมสูงสุดในรายการไว้ล่วงหน้าได้ ในบางกรณี การคาดการณ์การนําทางถัดไปนั้นง่ายกว่ามาก เช่น ในหน้ารถเข็นช็อปปิ้ง โอกาสที่ผู้ใช้จะเข้าชมหน้าชำระเงินมักจะสูง ซึ่งทำให้หน้านี้เหมาะสําหรับการโหลดล่วงหน้า
แม้ว่าการโหลดทรัพยากรล่วงหน้าจะใช้แบนด์วิดท์เพิ่มเติม แต่ก็ช่วยปรับปรุงเมตริกประสิทธิภาพส่วนใหญ่ได้ เวลาในการตอบสนองครั้งแรก (TTFB) มักจะต่ำลงมาก เนื่องจากคำขอเอกสารส่งผลให้มีการตีข้อมูลแคช เนื่องจาก TTFB จะต่ำลง เมตริกตามเวลาที่ตามมามักจะต่ำลงด้วยเช่นกัน ซึ่งรวมถึง Largest Contentful Paint (LCP) และ First Contentful Paint (FCP)
การเรียกข้อมูลล่วงหน้าสำหรับชิ้นงานแบบคงที่
โหลดเนื้อหาแบบคงที่ล่วงหน้า เช่น สคริปต์หรือสไตล์ชีต เมื่อระบบคาดการณ์ได้ว่าผู้ใช้อาจเข้าชมส่วนถัดไป ซึ่งจะเป็นประโยชน์อย่างยิ่งเมื่อมีการแชร์ชิ้นงานเหล่านั้นในหลายหน้า
ตัวอย่างเช่น Netflix ใช้ช่วงเวลาที่ผู้ใช้อยู่ในหน้าเว็บที่ออกจากระบบเพื่อเตรียม React ล่วงหน้า ซึ่งจะใช้เมื่อผู้ใช้เข้าสู่ระบบ ด้วยเหตุนี้ แบรนด์จึงลดเวลาในการตอบสนองลง 30% สำหรับการนําทางในอนาคต
ผลของการโหลดล่วงหน้าชิ้นงานแบบคงที่ต่อเมตริกประสิทธิภาพจะขึ้นอยู่กับทรัพยากรที่โหลดล่วงหน้า ดังนี้
- การโหลดรูปภาพล่วงหน้าสามารถลดเวลา LCP ขององค์ประกอบรูปภาพ LCP ได้อย่างมีนัยสำคัญ
- การเรียกข้อมูลสไตล์ชีตล่วงหน้าจะช่วยปรับปรุงทั้ง FCP และ LCP เนื่องจากจะช่วยลดเวลาในการดาวน์โหลดสไตล์ชีตจากเครือข่าย เนื่องจากสไตล์ชีตเป็นบล็อกการแสดงผล จึงอาจลด LCP เมื่อมีการเรียกข้อมูลล่วงหน้า ในกรณีที่องค์ประกอบ LCP ของหน้าถัดไปเป็นรูปภาพพื้นหลัง CSS ที่ขอผ่านพร็อพเพอร์ตี้
background-image
ระบบจะโหลดรูปภาพล่วงหน้าเป็นทรัพยากรที่เกี่ยวข้องของสไตลชีตที่โหลดล่วงหน้าด้วย - การเรียกข้อมูล JavaScript ล่วงหน้าจะช่วยให้การประมวลผลสคริปต์ที่เรียกข้อมูลล่วงหน้าเกิดขึ้นได้เร็วกว่ามากในกรณีที่เครือข่ายต้องดึงข้อมูลสคริปต์นั้นก่อนระหว่างการไปยังส่วนต่างๆ ซึ่งอาจส่งผลต่อ Interaction to Next Paint (INP) ของหน้าเว็บ ในกรณีที่มีการแสดงผลมาร์กอัปในไคลเอ็นต์ผ่าน JavaScript คุณจะปรับปรุง LCP ได้ด้วยการลดความล่าช้าในการโหลดทรัพยากร และการแสดงผลมาร์กอัปฝั่งไคลเอ็นต์ซึ่งมีองค์ประกอบ LCP ของหน้าเว็บจะเร็วขึ้น
- การเรียกข้อมูลแบบล่วงหน้าสำหรับแบบอักษรเว็บที่หน้าปัจจุบันยังไม่ได้ใช้จะช่วยขจัดการเปลี่ยนแปลงเลย์เอาต์ ในกรณีที่ใช้
font-display: swap;
ระบบจะตัดระยะเวลาการแลกเปลี่ยนแบบอักษรออก ซึ่งส่งผลให้การแสดงผลข้อความเร็วขึ้นและไม่มีการเปลี่ยนแปลงเลย์เอาต์ หากหน้าเว็บในอนาคตใช้แบบอักษรที่โหลดล่วงหน้าและเอลิเมนต์ LCP ของหน้าเว็บคือบล็อกข้อความที่ใช้แบบอักษรเว็บ LCP ขององค์ประกอบนั้นก็จะเร็วขึ้นด้วย
การโหลดล่วงหน้าของกลุ่ม JavaScript แบบออนดีมานด์
การแยกโค้ดกลุ่ม JavaScript ช่วยให้คุณโหลดเฉพาะบางส่วนของแอปในตอนแรกและโหลดส่วนที่เหลือแบบ Lazy Load ได้ หากใช้เทคนิคนี้ คุณจะสามารถใช้การเรียกข้อมูลล่วงหน้ากับเส้นทางหรือคอมโพเนนต์ที่ไม่จําเป็นในทันที แต่มีแนวโน้มว่าจะได้รับคําขอในเร็วๆ นี้
เช่น หากคุณมีหน้าเว็บที่มีปุ่มเปิดกล่องโต้ตอบซึ่งมีเครื่องมือเลือกอีโมจิ คุณสามารถแบ่งหน้าเว็บออกเป็น 3 ชิ้น JavaScript ได้แก่ หน้าแรก กล่องโต้ตอบ และเครื่องมือเลือก ระบบอาจโหลดหน้าแรกและกล่องโต้ตอบในตอนแรก ส่วนเครื่องมือเลือกจะโหลดเมื่อต้องการ เครื่องมืออย่าง webpack ช่วยให้คุณสามารถสั่งให้เบราว์เซอร์โหลดข้อมูลบางส่วนเหล่านี้ล่วงหน้าตามคำขอได้
วิธีติดตั้งใช้งาน 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 ล่วงหน้าด้วยความคิดเห็น Magic ของ webpack
webpack ช่วยให้คุณโหลดสคริปต์สำหรับเส้นทางหรือฟังก์ชันการทำงานล่วงหน้าได้ ซึ่งคุณค่อนข้างมั่นใจว่าผู้ใช้จะเข้าชมหรือใช้งานในเร็วๆ นี้
ข้อมูลโค้ดต่อไปนี้จะโหลดฟังก์ชันการจัดเรียงจากไลบรารี lodash แบบ Lazy เพื่อจัดเรียงกลุ่มตัวเลขที่จะส่งผ่านแบบฟอร์ม
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 ของหน้าเว็บ ทั้งนี้ขึ้นอยู่กับลักษณะของการโต้ตอบ
โดยทั่วไปแล้ว การคว้าข้อมูลล่วงหน้าจะส่งผลต่อการจัดลําดับความสําคัญของทรัพยากรโดยรวมด้วย เมื่อมีการเรียกข้อมูลล่วงหน้า ระบบจะดำเนินการดังกล่าวโดยมีลำดับความสำคัญต่ำที่สุด ดังนั้น ทรัพยากรที่ดึงข้อมูลล่วงหน้าจะไม่แย่งแบนด์วิดท์กับทรัพยากรที่หน้าปัจจุบันต้องการ
การโหลดล่วงหน้าอย่างชาญฉลาดด้วย Quicklink และ Guess.js
นอกจากนี้ คุณยังใช้การเรียกข้อมูลล่วงหน้าที่ชาญฉลาดยิ่งขึ้นกับไลบรารีที่ใช้ prefetch
อยู่เบื้องหลังได้ด้วย
- quicklink ใช้ Intersection Observer API เพื่อตรวจหาเมื่อลิงก์ปรากฏในวิวพอร์ตและจะโหลดทรัพยากรที่ลิงก์ไว้ล่วงหน้าในช่วงไม่มีการใช้งาน พิเศษ: ลิงก์ด่วนมีน้ำหนักน้อยกว่า 1 KB
- Guess.js ใช้รายงานข้อมูลวิเคราะห์เพื่อสร้างโมเดลการคาดการณ์ที่ใช้โหลดล่วงหน้าอย่างชาญฉลาดเฉพาะสิ่งที่ผู้ใช้มีแนวโน้มที่จะต้องการ
ทั้ง Quicklink และ Guess.js ใช้ Network Information API เพื่อหลีกเลี่ยงการโหลดล่วงหน้าหากผู้ใช้ใช้เครือข่ายที่ช้าหรือเปิด Save-Data
ไว้
การทำงานของการเรียกข้อมูลล่วงหน้า
คำแนะนำทรัพยากรไม่ใช่คำสั่งที่ต้องปฏิบัติตาม และเบราว์เซอร์จะเป็นผู้ตัดสินใจว่าจะดำเนินการหรือไม่และเมื่อใด
คุณใช้การอ่านล่วงหน้าหลายครั้งในหน้าเดียวกันได้ เบราว์เซอร์จะจัดคิวคำแนะนำทั้งหมดและขอทรัพยากรแต่ละรายการเมื่อไม่มีการใช้งาน ใน Chrome หากการโหลดล่วงหน้ายังไม่เสร็จสิ้นและผู้ใช้ไปยังทรัพยากรการโหลดล่วงหน้าที่กำหนดไว้ เบราว์เซอร์จะเลือกการโหลดระหว่างการนําทาง (ผู้ให้บริการเบราว์เซอร์รายอื่นอาจใช้วิธีนี้แตกต่างกัน)
การดึงข้อมูลล่วงหน้าจะเกิดขึ้นที่ลำดับความสำคัญ"ต่ำสุด" ดังนั้นทรัพยากรที่ดึงข้อมูลล่วงหน้าจะไม่แย่งแบนด์วิดท์กับทรัพยากรที่จําเป็นในหน้าปัจจุบัน
ระบบจะจัดเก็บไฟล์ที่ดึงข้อมูลไว้ล่วงหน้าไว้ในแคช HTTP หรือแคชหน่วยความจำ (ขึ้นอยู่กับว่าทรัพยากรแคชได้หรือไม่) เป็นระยะเวลาที่ขึ้นอยู่กับเบราว์เซอร์ เช่น ใน Chrome ระบบจะเก็บทรัพยากรไว้ประมาณ 5 นาที หลังจากนั้นระบบจะใช้กฎ Cache-Control
ปกติสำหรับทรัพยากร
บทสรุป
การใช้ prefetch
ช่วยเพิ่มเวลาในการโหลดของการนําทางในอนาคตได้อย่างมาก และอาจทําให้หน้าเว็บดูเหมือนจะโหลดทันที prefetch
ได้รับการสนับสนุนอย่างกว้างขวางในเบราว์เซอร์สมัยใหม่ ซึ่งทำให้เป็นเทคนิคที่น่าสนใจในการปรับปรุงประสบการณ์การไปยังส่วนต่างๆ สำหรับผู้ใช้จำนวนมาก เทคนิคนี้ต้องใช้การโหลดไบต์เพิ่มเติมที่อาจไม่ได้ใช้ ดังนั้นโปรดใช้เทคนิคนี้เมื่อจำเป็นเท่านั้น และควรใช้เฉพาะในเครือข่ายที่รวดเร็ว