การโหลดการนำทางล่วงหน้าสำหรับ HTML ที่เน้นเครือข่ายเป็นหลัก

เมื่อโปรแกรมทำงานของบริการจัดการเหตุการณ์ fetch เบราว์เซอร์จะรอให้โปรแกรมทำงานของบริการตอบกลับ แม้ว่าเวลาในการตอบสนองของคำขอเครือข่ายจะเป็นส่วนสำคัญที่ต้องรอ แต่เบราว์เซอร์อาจต้องรอให้ Service Worker เปิดเครื่องและเริ่มการทำงานของ Callback เหตุการณ์ fetch ด้วย

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

เข้าสู่การโหลดการนำทางล่วงหน้า

การโหลดล่วงหน้าของการนำทางเป็นฟีเจอร์ของ Service Worker ที่แก้ไขความล่าช้าที่เกิดจากเวลาเปิดเครื่องของ Service Worker หากไม่ได้เปิดใช้การโหลดการนำทางล่วงหน้า ทั้งการเปิดเครื่องของ Service Worker และคำขอการนำทางที่โปรแกรมทำงานดังกล่าวจัดการจะเกิดขึ้นติดต่อกัน

แถบสีเหลืองและน้ำเงินมี 2 ส่วนที่แสดงการกระทำต่อเนื่องกัน ส่วนแรกสีเหลืองเขียนว่า "SW Boot" และส่วนสีน้ำเงินคือ "คำขอการนำทาง"

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

แถบ 2 แถบวางซ้อนกันและจัดชิดซ้าย แสดงถึงการกระทำ 2 รายการที่เกิดขึ้นพร้อมกัน แถบสีเหลืองจะติดป้ายกำกับว่า "SW Boot" และแถบสีน้ำเงินคือ "SW Boot"

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

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

การใช้การโหลดการนำทางล่วงหน้าใน Workbox

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

Workbox จะช่วยลดความซับซ้อนในการใช้การนำทางล่วงหน้า เนื่องจากเมธอด enable ของโมดูล workbox-navigation-preload จะตรวจสอบการรองรับฟีเจอร์ที่จำเป็น รวมถึงการสร้าง Listener เหตุการณ์ activate เพื่อเปิดใช้ให้คุณ

จากที่นี่ ประโยชน์ของการโหลดการนำทางล่วงหน้านั้นเกิดขึ้นได้ในเบราว์เซอร์ที่รองรับ โดยใช้ Workbox เพื่อจัดการคำขอการนำทางโดยใช้เครื่องจัดการกลยุทธ์ที่เน้นเครือข่ายเป็นหลัก ดังนี้

import * as navigationPreload from 'workbox-navigation-preload';
import {NetworkFirst, StaleWhileRevalidate} from 'workbox-strategies';
import {registerRoute, NavigationRoute, Route} from 'workbox-routing';
import {precacheAndRoute} from 'workbox-precaching';

// Precache the manifest
precacheAndRoute(self.__WB_MANIFEST);

// Enable navigation preload
navigationPreload.enable();

// Create a new navigation route that uses the Network-first, falling back to
// cache strategy for navigation requests with its own cache. This route will be
// handled by navigation preload. The NetworkOnly strategy will work as well.
const navigationRoute = new NavigationRoute(new NetworkFirst({
  cacheName: 'navigations'
}));

// Register the navigation route
registerRoute(navigationRoute);

// Create a route for image, script, or style requests that use a
// stale-while-revalidate strategy. This route will be unaffected
// by navigation preload.
const staticAssetsRoute = new Route(({request}) => {
  return ['image', 'script', 'style'].includes(request.destination);
}, new StaleWhileRevalidate({
  cacheName: 'static-assets'
}));

// Register the route handling static assets
registerRoute(staticAssetsRoute);

เมื่อเปิดใช้การโหลดการนำทางล่วงหน้า Workbox จะตอบสนองต่อคำขอการนำทางที่ใช้กลยุทธ์ NetworkFirst หรือ NetworkOnly ด้วยคำตอบที่โหลดไว้ล่วงหน้า

ฉันจะทราบได้อย่างไรว่าการโหลดการนำทางล่วงหน้าใช้งานได้

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

ภาพหน้าจอของบันทึก Workbox ในคอนโซลเครื่องมือสำหรับนักพัฒนาเว็บของ Chrome ข้อความที่อ่านจากบนลงล่าง ได้แก่ "เราเตอร์กำลังตอบสนองต่อ /" "ใช้คำขอการนำทางที่โหลดล่วงหน้าสำหรับ /" และ "การใช้ NetworkFirst เพื่อตอบกลับ /"

การบันทึกนี้จะไม่ปรากฏในบิลด์ที่ใช้งานจริงโดยค่าเริ่มต้น ดังนั้นคุณจะไม่เห็นข้อมูลนี้เมื่อทำให้ Service Worker ใช้งานได้เป็นเวอร์ชันที่ใช้งานจริง แต่วิธีนี้ก็เป็นวิธีที่ยอดเยี่ยมในการยืนยันว่าการโหลดการนำทางล่วงหน้าทำงานอยู่ (และอื่นๆ อีกมากมาย)

การปรับแต่งคำตอบที่โหลดล่วงหน้า

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

ในกรณีเช่นนี้ การที่ทราบว่าคำขอโหลดล่วงหน้าจะได้รับการส่งด้วยส่วนหัว Service-Worker-Navigation-Preload โดยมีค่าเริ่มต้นเป็น true ดังนี้

Service-Worker-Navigation-Preload: true

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

บทสรุป

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