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

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

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

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

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

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

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

ลำดับเวลาของการเลิกใช้งานยกเลิกการโหลด

ข้อมูลเบื้องต้น

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

สถานการณ์ที่มีการใช้เหตุการณ์นี้มากที่สุด ได้แก่

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

หากต้องการทดสอบแคชย้อนหลัง ให้ทำตามขั้นตอนต่อไปนี้

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

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

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

เครื่องมือทดสอบแคชย้อนหลังของ Chrome DevTools ที่แสดงให้เห็นว่ามีการใช้เครื่องจัดการสำหรับยกเลิกการโหลด

Reporting API

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

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

API ของ Bfcache notRestoredReasons

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

{
   children: [],
   id: null,
   name: null,
   reasons: [
     {"reason", "unload-handler"}
   ],
   src: null,
   url: "https://www.example.com/page/"
}

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

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

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

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