การเปลี่ยนแปลงการทำงานของ BFCache ที่มีพอร์ตข้อความของส่วนขยาย

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 โดยเปิดใช้ฟีเจอร์นี้ไว้เป็นระยะเวลาหนึ่ง เนื่องจากเป็นการคาดเดาได้ยากว่าฟีเจอร์ใดในส่วนขยายอาจก่อให้เกิดปัญหาได้

  1. ตรวจสอบว่า Chrome เป็นเวอร์ชัน 123 ขึ้นไป หากเป็นไปได้ ให้ใช้ Chrome Canary ซึ่งมีคำเตือนเพิ่มเติมเพื่อทำให้การทดสอบง่ายขึ้น
  2. เปิด Chrome โดยมีแฟล็กต่อไปนี้

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. ไปยังหน้าที่มีสิทธิ์สำหรับ BFCache โดยไม่ต้องใช้งานส่วนขยาย (เช่น เว็บไซต์ง่ายๆ อย่าง https://example.com/) ทำตามบทแนะนำ BFCache เพื่อให้แน่ใจว่ามีการกู้คืนจาก BFCache

  4. ติดตั้งและเปิดใช้ส่วนขยาย จากนั้นทดสอบการมีสิทธิ์ของ BFCache อีกครั้ง คุณอาจต้องออกจากหน้านี้ด้วยตนเอง แล้วรอสักพักเพื่อให้ส่วนขยายโพสต์ข้อความไปยังหน้า BFCached แล้วย้อนกลับมา

  5. หากต้องโหลดหน้าใหม่แทน BFCache เนื่องจากมีการปลดจาก และปัญหาที่ขัดขวางการกู้คืนคือ "ExtensionSentMessageToCachedFrame" ส่วนขยายอาจได้รับผลกระทบจากการเปลี่ยนแปลงนี้

    ใน Chrome Canary 124.0.6315.0 ขึ้นไป คุณจะเห็นคำเตือนต่อไปนี้ในหน้าด้วย

    ระบบจะแสดงคำเตือนเมื่อหน้าเว็บไม่ได้รับการคืนค่าจาก BFCache
    คำเตือนที่แสดงเมื่อมีการคืนค่าหน้าเว็บจาก BFCache

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

  1. เปิด Chrome โดยมีแฟล็กต่อไปนี้

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. ไปที่หน้าเว็บที่ยังไม่ได้กู้คืนจาก BFCache เนื่องจาก "ExtensionSentMessageToCachedFrame"

  3. นำทางออกและย้อนกลับ หน้านี้ควรได้รับการกู้คืนแล้ว แต่ควรยกเลิกการเชื่อมต่อช่องข้อความระหว่างสคริปต์เนื้อหาและ Service Worker แล้ว

  4. ทดสอบว่าส่วนขยายยังทำงานได้ตามปกติหรือไม่ หากไม่มี คุณควรเชื่อมต่อใหม่ด้วยตนเองตามที่แสดงไว้ในส่วนก่อนหน้า

ลำดับเวลาในการเผยแพร่

เราวางแผนที่จะค่อยๆ เพิ่มลักษณะการทํางานใหม่ตั้งแต่ Chrome 123 เป็นต้นไป แผนโดยละเอียดมีดังนี้

วันที่ เป้าหมายที่วางแผนไว้
15 กุมภาพันธ์ เริ่มการทดสอบลักษณะการทำงานใหม่ใน Chrome Canary และ Dev
1 มีนาคม เริ่มการทดสอบลักษณะการทำงานใหม่ใน Chrome เบต้า
18 มีนาคม เปิดตัวลักษณะการทำงานใหม่นี้แก่ผู้ใช้ 4 เปอร์เซ็นต์ใน Chrome เวอร์ชันเสถียร
25 มีนาคม เผยแพร่ลักษณะการทำงานใหม่นี้แก่ผู้ใช้ 50 เปอร์เซ็นต์ใน Chrome เวอร์ชันเสถียร
2 เมษายน การทดสอบสิ้นสุดลง ทำให้ลักษณะการทํางานใหม่เป็นค่าเริ่มต้น