Back/Forward Cache (หรือ BFCache) คือการเพิ่มประสิทธิภาพเบราว์เซอร์ที่เปิดใช้การนำทางย้อนกลับและไปข้างหน้าแบบทันที เรากำลังทำการเปลี่ยนแปลงกับ Chrome BFCache ซึ่งอาจส่งผลกระทบต่อส่วนขยายที่ใช้พอร์ตข้อความ หากคุณเป็นเจ้าของส่วนขยาย Chrome ที่ใช้การรับส่งข้อความในการสื่อสารระหว่างสคริปต์เนื้อหากับส่วนขยาย โปรดอ่านต่อเพื่อเรียนรู้เกี่ยวกับวิธีทดสอบและปรับเปลี่ยนส่วนขยายของคุณ
พอร์ตข้อความของส่วนขยาย
ส่วนขยายจะสื่อสารกับสคริปต์เนื้อหาหรือส่วนขยายอื่นๆ ผ่านการส่งข้อความ ส่งข้อความได้โดยใช้คำขอแบบครั้งเดียวโดยโทรไปที่ runtime.sendMessage()
และ tabs.sendMessage()
หรือใช้พอร์ตข้อความที่ใช้ซ้ำได้ ตราบใดที่พอร์ตยังมีการใช้งานอยู่ ทั้งสคริปต์เนื้อหาและสคริปต์พื้นหลังของส่วนขยายจะสามารถใช้พอร์ตเพื่อโพสต์ข้อความถึงกันได้
โปรดดูข้อมูลเพิ่มเติมที่การส่งข้อความ
Back-Forward Cache
เมื่อออกจากหน้าที่มีสิทธิ์ใช้ BFCache เบราว์เซอร์จะอนุญาตให้หน้าที่มีสถานะทั้งหมดยังคงอยู่ในหน่วยความจำ แต่อยู่ในสถานะไม่ได้ใช้งานเต็มรูปแบบ หากผู้ใช้ดำเนินการนำทางประวัติ (ย้อนกลับหรือไปข้างหน้า) ไปยังหน้าแคช เบราว์เซอร์จะพยายามกู้หน้าเว็บคืนจาก BFCache ซึ่งจะช่วยให้ไปยังส่วนต่างๆ ได้เร็วขึ้นและปรับปรุงประสบการณ์การท่องเว็บของผู้ใช้
ขณะที่หน้าเว็บอยู่ใน BFCache หน้าเว็บอยู่ในสถานะหยุดนิ่งซึ่งไม่อนุญาตให้เรียกใช้ JavaScript ซึ่งหมายความว่าจะไม่สามารถประมวลผลข้อความที่ได้รับ
ดูข้อมูลเพิ่มเติมได้ที่ Back/Forward Cache
ผลกระทบของพอร์ตข้อความส่วนขยายต่อ BFCache
กล่าวโดยสรุปคือ ส่วนขยายที่ส่งข้อความถึงหน้าเว็บใน BFCache อาจทำให้ระบบลบแคชออกและส่งผลต่อประสิทธิภาพการทำงาน
เมื่อจัดเก็บหน้าที่มีพอร์ตข้อความส่วนขยายที่เปิดอยู่ใน BFCache พอร์ตจะยังคงเปิดอยู่ เมื่อกู้คืนหน้าจาก BFCache แล้ว โปรแกรมทำงานของบริการส่วนขยายจะยังคงใช้การอ้างอิงเดิมของพอร์ตข้อความเพื่อโพสต์ข้อความลงในสคริปต์เนื้อหาได้
แต่ถ้าส่วนขยายพยายามจะโพสต์ข้อความผ่านพอร์ตข้อความขณะที่หน้ายังคงอยู่ใน BFCache ข้อความจะส่งไปแต่ไม่นำส่งอย่างสมบูรณ์เนื่องจากมีการตรึงตัวแฮนเดิล การให้เหตุผลและจัดการกับสถานการณ์นี้เป็นเรื่องยาก เนื่องจากทั้งการจัดคิวและการส่งข้อความต่างก็มีปัญหาของตนเอง
ในการใช้งาน Chrome ในปัจจุบัน จะมีการนำหน้าโฮสต์ออกจาก BFCache และทิ้งข้อความเพื่อหลีกเลี่ยงการเกิดปัญหาเกี่ยวกับข้อความที่สูญหาย หากผู้ใช้กลับมาที่หน้านั้น หน้าเว็บจะโหลดใหม่ ซึ่งช่วยให้ส่วนขยายสร้างการเชื่อมต่อใหม่ได้
ในทางตรงกันข้าม การใช้งานนี้จะจํากัดสถานการณ์ที่มีการใช้ BFCache ซึ่งช่วยจำกัดประสิทธิภาพที่ได้รับ โดยเฉพาะส่วนขยายที่มีกลไกการส่งข้อมูลเตือนภัยหรือกลไกฮาร์ตบีตที่ส่งข้อความไปยังการเชื่อมต่อทั้งหมดเป็นประจำ นอกจากนี้ เมื่อมีการปลดออกเมื่อส่วนขยายส่งข้อความไปยังสคริปต์เนื้อหา นักพัฒนาเว็บจะไม่มีวิธีป้องกันไม่ให้หน้าเว็บของตนถูกนําออก
เรามีแผนที่จะเปิดตัวลักษณะการย้ายข้อความใหม่เพื่อปรับปรุงประสิทธิภาพโดยรวม
ลักษณะการทำงานใหม่: การปิดช่องทางข้อความเมื่อจัดเก็บหน้าเว็บใน BFCache
ตั้งแต่ Chrome 123 เป็นต้นไป เมื่อมีการจัดเก็บหน้าที่มีพอร์ตข้อความของส่วนขยายที่เปิดอยู่ใน BFCache ระบบจะปิดช่องทางข้อความที่สำคัญจากฝั่งสคริปต์เนื้อหาด้วยตนเอง ด้วยเหตุนี้ ระบบจะปิดพอร์ตข้อความทั้งหมด และส่วนขยายจะได้รับเหตุการณ์ onDisconnect
เนื่องจากช่องถูกปิดแล้ว จะไม่มีการส่งข้อความไปยังหน้าเว็บขณะที่อยู่ใน BFCache ดังนั้นหน้าเว็บจะไม่ถูกนำออกเนื่องจากส่วนขยาย
แม้จะกู้คืนหน้าเว็บจาก BFCache แล้ว ช่องทางข้อความที่ปิดไปแล้วจะไม่เปิดขึ้นอีก แนวทางปฏิบัติที่แนะนำสำหรับผู้เขียนส่วนขยายคือให้คอยฟังเหตุการณ์ในวงจรของหน้าเว็บ และตั้งค่าการเชื่อมต่อใหม่เมื่อกู้คืนหน้าเว็บจาก BFCache ดังที่แสดงในตัวอย่างต่อไปนี้
// content script
let port;
window.addEventListener('pageshow', (event) => {
if (event.persisted) {
// The page is restored from BFCache, set up a new connection.
port = chrome.runtime.connect();
}
});
อ่านเพิ่มเติมเกี่ยวกับการสนทนากับ WECG จากตัวแทนของเบราว์เซอร์ต่างๆ (ภายใต้ปัญหา 474)
ฉันจะได้รับผลกระทบไหม
ลักษณะการทำงานใหม่นี้จะปรากฏหลัง Flag ใน Chrome 123 เพื่อให้คุณทดสอบโค้ดได้ ดูไทม์ไลน์สำหรับข้อมูลเพิ่มเติม ใช้ขั้นตอนที่ตามมาเพื่อทดสอบส่วนขยาย โปรดทราบว่าเครื่องมือนี้เป็นเพียงการทดสอบง่ายๆ เท่านั้น และเราขอแนะนำให้คุณเรียกใช้ Chrome โดยเปิดใช้ฟีเจอร์นี้ไว้เป็นระยะเวลาหนึ่ง เนื่องจากเป็นการคาดเดาได้ยากว่าฟีเจอร์ใดในส่วนขยายอาจก่อให้เกิดปัญหาได้
- ตรวจสอบว่า Chrome เป็นเวอร์ชัน 123 ขึ้นไป หากเป็นไปได้ ให้ใช้ Chrome Canary ซึ่งมีคำเตือนเพิ่มเติมเพื่อทำให้การทดสอบง่ายขึ้น
เปิด Chrome โดยมีแฟล็กต่อไปนี้
--disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
ไปยังหน้าที่มีสิทธิ์สำหรับ BFCache โดยไม่ต้องใช้งานส่วนขยาย (เช่น เว็บไซต์ง่ายๆ อย่าง https://example.com/) ทำตามบทแนะนำ BFCache เพื่อให้แน่ใจว่ามีการกู้คืนจาก BFCache
ติดตั้งและเปิดใช้ส่วนขยาย จากนั้นทดสอบการมีสิทธิ์ของ BFCache อีกครั้ง คุณอาจต้องออกจากหน้านี้ด้วยตนเอง แล้วรอสักพักเพื่อให้ส่วนขยายโพสต์ข้อความไปยังหน้า BFCached แล้วย้อนกลับมา
หากต้องโหลดหน้าใหม่แทน BFCache เนื่องจากมีการปลดจาก และปัญหาที่ขัดขวางการกู้คืนคือ "ExtensionSentMessageToCachedFrame" ส่วนขยายอาจได้รับผลกระทบจากการเปลี่ยนแปลงนี้
ใน Chrome Canary 124.0.6315.0 ขึ้นไป คุณจะเห็นคำเตือนต่อไปนี้ในหน้าด้วย
เมื่อได้รับการยืนยันว่าส่วนขยายจะโพสต์ข้อความไปยังหน้า BFCache คุณสามารถทำตามขั้นตอนเหล่านี้เพื่อบังคับให้เปิดใช้การทดสอบและสังเกตว่าตรรกะขัดข้องหรือไม่
เปิด Chrome โดยมีแฟล็กต่อไปนี้
--enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
ไปที่หน้าเว็บที่ยังไม่ได้กู้คืนจาก BFCache เนื่องจาก "ExtensionSentMessageToCachedFrame"
นำทางออกและย้อนกลับ หน้านี้ควรได้รับการกู้คืนแล้ว แต่ควรยกเลิกการเชื่อมต่อช่องข้อความระหว่างสคริปต์เนื้อหาและ Service Worker แล้ว
ทดสอบว่าส่วนขยายยังทำงานได้ตามปกติหรือไม่ หากไม่มี คุณควรเชื่อมต่อใหม่ด้วยตนเองตามที่แสดงไว้ในส่วนก่อนหน้า
ลำดับเวลาในการเผยแพร่
เราวางแผนที่จะค่อยๆ เพิ่มลักษณะการทํางานใหม่ตั้งแต่ Chrome 123 เป็นต้นไป แผนโดยละเอียดมีดังนี้
วันที่ | เป้าหมายที่วางแผนไว้ |
---|---|
15 กุมภาพันธ์ | เริ่มการทดสอบลักษณะการทำงานใหม่ใน Chrome Canary และ Dev |
1 มีนาคม | เริ่มการทดสอบลักษณะการทำงานใหม่ใน Chrome เบต้า |
18 มีนาคม | เปิดตัวลักษณะการทำงานใหม่นี้แก่ผู้ใช้ 4 เปอร์เซ็นต์ใน Chrome เวอร์ชันเสถียร |
25 มีนาคม | เผยแพร่ลักษณะการทำงานใหม่นี้แก่ผู้ใช้ 50 เปอร์เซ็นต์ใน Chrome เวอร์ชันเสถียร |
2 เมษายน | การทดสอบสิ้นสุดลง ทำให้ลักษณะการทํางานใหม่เป็นค่าเริ่มต้น |