การเลิกใช้งานเหตุการณ์ยกเลิกการโหลด

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

ลำดับเวลาการเลิกใช้งาน

เราทราบว่าพฤติกรรมการยกเลิกการโหลดน่าจะมีการเปลี่ยนแปลงโดยเร็วที่สุดในเดือนมกราคม 2019 เมื่อเราได้ประกาศความตั้งใจที่จะใช้ Back-Forward Cache ในระหว่างนั้น เราได้ดำเนินการติดต่อในวงกว้างซึ่งส่งผลให้การใช้งานยกเลิกการโหลดลดลงอย่างมาก นอกจากนี้ เรายังเริ่มเสนอวิธีการทดสอบผลของการเลิกใช้งานการยกเลิกการโหลดจาก Chrome 115 เพื่อเสริมการติดต่อดังกล่าว

หลังจากระยะทดลองและระยะทดลองเหล่านี้ เราคาดว่าการเลิกใช้งานแบบค่อยเป็นค่อยไปจะมีผลดังต่อไปนี้

  • ระยะที่กำหนดขอบเขตซึ่งการยกเลิกการโหลดจะค่อยๆ หยุดทำงานสำหรับเว็บไซต์ยอดนิยม 50 อันดับแรก (ข้อมูลอ้างอิง ณ เวลาที่เขียน)
    • เริ่มตั้งแต่ 1% ของผู้ใช้จาก Chrome 120 (ปลายเดือนพฤศจิกายน 2023)
    • การจะมีผู้ใช้ครบ 100% ภายในสิ้นไตรมาส 3 ปี 2024
  • นอกจากนี้ ตั้งแต่ไตรมาสที่ 3 ปี 2024 เราตั้งใจที่จะเริ่มระยะทั่วไปซึ่งการยกเลิกการโหลดจะค่อยๆ หยุดทำงานในเว็บไซต์ต่างๆ โดยจะเริ่มจากผู้ใช้ 1% และสิ้นสุดกับผู้ใช้ 100% ภายในสิ้นไตรมาส 1 ปี 2025

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

ไทม์ไลน์ของการเลิกใช้งานการยกเลิกการโหลด

ที่มา

unload ออกแบบมาให้เริ่มทำงานเมื่อยกเลิกการโหลดเอกสาร ในทางทฤษฎี คุณสามารถใช้โค้ดเพื่อเรียกใช้โค้ดทุกครั้งที่ผู้ใช้ออกจากหน้าเว็บหรือเป็นการสิ้นสุดโค้ดเรียกกลับของเซสชัน

สถานการณ์ที่นิยมใช้กิจกรรมนี้มากที่สุด ได้แก่

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

อย่างไรก็ตาม เหตุการณ์ unload ไม่น่าเชื่อถืออย่างยิ่ง

ใน Chrome และ Firefox บนเดสก์ท็อป unload มีความเสถียรพอสมควรแต่ส่งผลเสียต่อประสิทธิภาพของเว็บไซต์โดยป้องกันไม่ให้ใช้ bfcache (Back-Forward Cache)

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

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

เหตุใดจึงเลิกใช้งานเหตุการณ์ unload

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

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

การนำเหตุการณ์ unload ออกเพราะล้าสมัยเป็นการยอมรับที่เราในฐานะนักพัฒนาเว็บจำเป็นต้องตรวจสอบว่ากระบวนทัศน์ของเราตรงกับในโลกแห่งความเป็นจริง และไม่ต้องอาศัยแนวคิดที่ล้าสมัยซึ่งไม่เป็นจริงอีกต่อไป (หากเคยเป็นเช่นนั้น)

กิจกรรมทางเลือกสำหรับ unload กิจกรรม

ขอแนะนำให้ใช้รายการต่อไปนี้แทน unload

  • visibilitychange: ใช้เพื่อระบุว่าเมื่อใดที่การแสดงหน้าเว็บมีการเปลี่ยนแปลง เหตุการณ์นี้จะเกิดขึ้นเมื่อผู้ใช้เปลี่ยนแท็บ ย่อหน้าต่างเบราว์เซอร์ หรือเปิดหน้าใหม่ พิจารณาว่าสถานะ hidden เป็นเวลาที่เชื่อถือได้ล่าสุดในการบันทึกข้อมูลแอปและข้อมูลผู้ใช้
  • pagehide: เพื่อระบุช่วงเวลาที่ผู้ใช้ออกจากหน้าเว็บ เหตุการณ์นี้จะเกิดขึ้นเมื่อผู้ใช้ออกจากหน้า โหลดหน้าเว็บซ้ำ หรือปิดหน้าต่างเบราว์เซอร์ เหตุการณ์ pagehide จะไม่เริ่มทำงานเมื่อย่อหน้าเว็บหรือเปลี่ยนไปใช้แท็บอื่น โปรดทราบว่า เนื่องจาก pagehide ไม่ได้ทำให้หน้าไม่มีสิทธิ์ใช้ Back-Forward Cache จึงอาจมีการกู้คืนหน้าได้หลังจากที่เหตุการณ์นี้เริ่มทํางาน ถ้าคุณกำลังล้างข้อมูลทรัพยากรในกิจกรรมนี้ อาจต้องคืนค่าทรัพยากรเหล่านั้นเมื่อคืนค่าหน้าเว็บ

เหตุการณ์ beforeunload มี Use Case ที่แตกต่างกันเล็กน้อยกับ unload เนื่องจากเป็นเหตุการณ์ที่ยกเลิกได้ มักใช้เพื่อเตือนผู้ใช้เกี่ยวกับการเปลี่ยนแปลงที่ไม่ได้บันทึกเมื่อออกจากหน้าไป นอกจากนี้ เหตุการณ์นี้ยังไม่สามารถเกิดขึ้นจริงได้ เนื่องจากจะไม่เริ่มทํางานหากแท็บที่อยู่เบื้องหลังหยุดทำงาน ขอแนะนำให้จำกัดการใช้ beforeunload และเพิ่มอย่างมีเงื่อนไขเท่านั้น แต่ให้ใช้เหตุการณ์ข้างต้นกับการแทนที่ unload ส่วนใหญ่แทน

โปรดดูรายละเอียดเพิ่มเติมในคำแนะนำในการไม่ใช้เครื่องจัดการ unload

ตรวจจับการใช้งาน unload

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

ประภาคาร

Lighthouse มีการตรวจสอบ no-unload-listeners ซึ่งจะเตือนนักพัฒนาซอฟต์แวร์หาก JavaScript ในหน้าเว็บของตน (รวมถึง JavaScript จากไลบรารีของบุคคลที่สาม) เพิ่ม Listener เหตุการณ์ unload

การตรวจสอบ Lighthouse ที่แสดงตัวแฮนเดิลการยกเลิกการโหลดที่ใช้งานอยู่

เครื่องมือสำหรับนักพัฒนาเว็บใน Chrome

เครื่องมือสำหรับนักพัฒนาเว็บใน Chrome มีการตรวจสอบ back-foward-cache เพื่อช่วยคุณระบุปัญหาที่อาจทําให้หน้าเว็บไม่มีสิทธิ์ใช้ Back-Forward Cache ซึ่งรวมถึงการใช้เครื่องจัดการ unload

หากต้องการทดสอบฟีเจอร์ Back-Forward Cache ให้ทำตามขั้นตอนต่อไปนี้

  1. ในหน้า ให้เปิดเครื่องมือสำหรับนักพัฒนาเว็บ จากนั้นไปที่แอปพลิเคชัน > บริการในเบื้องหลัง > Back-Forward Cache

  2. คลิกทดสอบฟีเจอร์ Back-Forward Cache ซึ่ง Chrome จะนำคุณไปยัง chrome://terms/ และกลับไปที่หน้าโดยอัตโนมัติ หรือจะคลิกปุ่มย้อนกลับและไปข้างหน้าของเบราว์เซอร์ก็ได้

หากหน้าเว็บไม่มีสิทธิ์ใช้การแคชย้อนหลัง แท็บ Back/Forward Cache จะแสดงรายการปัญหา ในส่วน Actionable คุณจะเห็นว่ากำลังใช้ unload ดังนี้

เครื่องมือทดสอบ Back-Forward Cache สำหรับเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome ที่แสดงตัวแฮนเดิลการยกเลิกการโหลด

Reporting API

คุณสามารถใช้ Reporting API เพื่อเชื่อมต่อกับนโยบายสิทธิ์แบบอ่านอย่างเดียวเพื่อตรวจหาการใช้งาน unload จากผู้ใช้เว็บไซต์

ดูรายละเอียดเพิ่มเติมได้ที่ usการใช้ Reporting API เพื่อค้นหาการยกเลิกการโหลด

API notRestoredReasons ของ Bfcache

พร็อพเพอร์ตี้ notRestoredReasons ที่เพิ่มลงในคลาส PerformanceNavigationTiming จะรายงานข้อมูลว่ามีการบล็อกเอกสารไม่ให้ใช้ bfcache ในการนําทางหรือไม่ รวมถึงเหตุผล ดูวิธีการใช้งานได้ที่นี่ นี่คือตัวอย่างของคำเตือนออบเจ็กต์การตอบกลับของ Listener unload ที่มีอยู่

{
   blocked: true,
   children: [],
   id: "",
   name: "",
   reasons: [ "Internal Error", "Unload handler" ],
   src: "",
   url: "a.com"
}

ควบคุมการเข้าถึง unload

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

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

  • นโยบายสิทธิ์: นี่คือ API ของแพลตฟอร์มสำหรับเจ้าของเว็บไซต์เพื่อควบคุมการเข้าถึงฟีเจอร์ต่างๆ ในระดับเว็บไซต์หรือระดับหน้าเว็บแต่ละหน้าผ่านการใช้ส่วนหัว HTTP
  • นโยบายองค์กร: เครื่องมือสำหรับผู้ดูแลระบบไอทีในการกำหนดค่า Chrome สำหรับองค์กรหรือธุรกิจ ซึ่งกำหนดค่าได้ผ่านแผงการดูแลระบบ เช่น คอนโซลผู้ดูแลระบบของ Google
  • Chrome Flag: นโยบายนี้ช่วยให้นักพัฒนาซอฟต์แวร์แต่ละรายเปลี่ยนการตั้งค่าการเลิกใช้งาน unload เพื่อทดสอบผลกระทบที่มีต่อเว็บไซต์ต่างๆ ได้

นโยบายสิทธิ์

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

เราจะขยายการนี้ออกไปใน Chrome 117 เพื่อให้เว็บไซต์ดำเนินการย้อนกลับได้และเลือกที่จะพยายามทำให้ตัวแฮนเดิล unload เริ่มทำงานต่อไปเมื่อ Chrome เปลี่ยนค่าเริ่มต้นสำหรับเว็บไซต์เหล่านี้ไม่ให้เริ่มทำงานในอนาคต ดูตัวอย่างเกี่ยวกับวิธีอนุญาตให้ตัวแฮนเดิลการยกเลิกการโหลดทำงานสำหรับเว็บไซต์ต่อไป การเลือกใช้นี้จะไม่ได้คงอยู่ตลอดไป และควรใช้เพื่อให้เว็บไซต์มีเวลาในการย้ายข้อมูลออกจากตัวแฮนเดิล unload

นโยบายองค์กร

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

การตั้งค่าสถานะและการเปลี่ยนบรรทัดคำสั่งใน Chrome

เช่นเดียวกับนโยบายระดับองค์กร คุณยังปิดใช้การเลิกใช้งานสำหรับผู้ใช้แต่ละรายผ่านแฟล็ก Chrome และบรรทัดคำสั่งได้ ดังนี้

การตั้งค่า chrome://flags/#deprecate-unload เป็น enabled จะนําถึงค่าเริ่มต้นการเลิกใช้งานและป้องกันไม่ให้ตัวแฮนเดิล unload เริ่มทํางาน โดยจะยังคงลบล้างแบบรายเว็บไซต์ได้ผ่านนโยบายสิทธิ์ แต่จะยังคงเริ่มทำงานต่อไปโดยค่าเริ่มต้น

นอกจากนี้ ยังควบคุมการตั้งค่าเหล่านี้โดยสวิตช์บรรทัดคำสั่งได้ด้วย

การเปรียบเทียบตัวเลือก

ตารางต่อไปนี้สรุปการใช้งานตัวเลือกต่างๆ ของตัวเลือกที่กล่าวถึงก่อนหน้านี้

เริ่มการเลิกใช้งาน เริ่มการเลิกใช้งาน (โดยมีข้อยกเว้น) ป้องกันการเลิกใช้งานเพื่อประหยัดเวลาในการย้ายข้อมูล
นโยบายสิทธิ์
(ใช้กับหน้าเว็บ/เว็บไซต์)
ใช่ ใช่ ใช่
นโยบายองค์กร
(มีผลกับอุปกรณ์)
ไม่ได้ ไม่ได้ ใช่
Chrome Flag
(มีผลกับผู้ใช้แต่ละราย)
ใช่ ไม่ได้ ไม่ได้
การเปลี่ยนบรรทัดคำสั่งของ Chrome
(มีผลกับผู้ใช้แต่ละราย)
ใช่ ไม่ได้ ใช่

บทสรุป

ตัวแฮนเดิล unload อยู่ระหว่างการเลิกใช้งาน รายงานเหล่านี้ไม่น่าเชื่อถือมาเป็นเวลานาน และไม่รับประกันว่าจะมีการเริ่มทำงานในทุกกรณีที่เอกสารถูกทำลาย นอกจากนี้ ตัวแฮนเดิล unload ยังใช้ร่วมกับ bfcache ไม่ได้

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

ข้อความแสดงการยอมรับ

ขอขอบคุณ Kenji Baheux, Fergal Daly, Adriana Jara และ Jeremy Wagner ที่ช่วยอ่านบทความนี้

รูปภาพหลักโดย Anja Bauerman ใน Unsplash