เหตุการณ์ unload
จะค่อยๆ เลิกใช้งานโดยการค่อยๆ เปลี่ยนค่าเริ่มต้น เพื่อให้ตัวแฮนเดิล unload
หยุดเริ่มทำงานในหน้าเว็บ เว้นแต่หน้าเว็บจะเลือกเปิดใช้อีกครั้งอย่างชัดแจ้ง
ลำดับเวลาการเลิกใช้งาน
เราทราบว่าพฤติกรรมการยกเลิกการโหลดน่าจะมีการเปลี่ยนแปลงโดยเร็วที่สุดในเดือนมกราคม 2019 เมื่อเราได้ประกาศความตั้งใจที่จะใช้ Back-Forward Cache ในระหว่างนั้น เราได้ดำเนินการติดต่อในวงกว้างซึ่งส่งผลให้การใช้งานยกเลิกการโหลดลดลงอย่างมาก นอกจากนี้ เรายังเริ่มเสนอวิธีการทดสอบผลของการเลิกใช้งานการยกเลิกการโหลดจาก Chrome 115 เพื่อเสริมการติดต่อดังกล่าว
- การทดสอบในระบบผ่าน Permission-Policy API สำหรับยกเลิกการโหลดใน Chrome 115 (กรกฎาคม 2023)
- การทดสอบในเครื่องโดยเปิดใช้ธงใน Chrome 117 (กันยายน 2023)
หลังจากระยะทดลองและระยะทดลองเหล่านี้ เราคาดว่าการเลิกใช้งานแบบค่อยเป็นค่อยไปจะมีผลดังต่อไปนี้
- ระยะที่กำหนดขอบเขตซึ่งการยกเลิกการโหลดจะค่อยๆ หยุดทำงานสำหรับเว็บไซต์ยอดนิยม 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
ในหน้าเว็บ วิธีนี้ช่วยให้เว็บไซต์ค้นพบได้ว่าตนกำลังใช้เหตุการณ์นี้ทั้งในโค้ดของตนหรือผ่านไลบรารี และอาจได้รับผลกระทบจากการเลิกใช้งานที่กำลังจะมีขึ้น
เครื่องมือสำหรับนักพัฒนาเว็บใน Chrome
เครื่องมือสำหรับนักพัฒนาเว็บใน Chrome มีการตรวจสอบ back-forward-cache
เพื่อช่วยคุณระบุปัญหาที่อาจทําให้หน้าเว็บไม่มีสิทธิ์ใช้ Back-Forward Cache ซึ่งรวมถึงการใช้เครื่องจัดการ unload
หากต้องการทดสอบฟีเจอร์ Back-Forward Cache ให้ทำตามขั้นตอนต่อไปนี้
ในหน้า ให้เปิดเครื่องมือสำหรับนักพัฒนาเว็บ จากนั้นไปที่แอปพลิเคชัน > บริการในเบื้องหลัง > Back-Forward Cache
คลิกทดสอบฟีเจอร์ Back-Forward Cache ซึ่ง Chrome จะนำคุณไปยัง
chrome://terms/
และกลับไปที่หน้าโดยอัตโนมัติ หรือจะคลิกปุ่มย้อนกลับและไปข้างหน้าของเบราว์เซอร์ก็ได้
หากหน้าเว็บไม่มีสิทธิ์ใช้การแคชย้อนหลัง แท็บ Back/Forward Cache จะแสดงรายการปัญหา ในส่วน Actionable คุณจะเห็นว่ากำลังใช้ unload
ดังนี้
Reporting API
คุณสามารถใช้ Reporting API ร่วมกับนโยบายสิทธิ์แบบอ่านอย่างเดียวเพื่อตรวจหาการใช้งาน unload
จากผู้ใช้เว็บไซต์
โปรดดูรายละเอียดเพิ่มเติมที่การใช้ Reporting API เพื่อค้นหาการยกเลิกการโหลด
API notRestoredReasons
ของ Bfcache
พร็อพเพอร์ตี้ notRestoredReasons
ที่เพิ่มลงในคลาส PerformanceNavigationTiming
จะรายงานข้อมูลว่ามีการบล็อกเอกสารไม่ให้ใช้ bfcache ในการนําทางหรือไม่ รวมถึงเหตุผล ดูวิธีการใช้งานได้ที่นี่ นี่คือตัวอย่างของคำเตือนออบเจ็กต์การตอบกลับของ Listener 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 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