Uzantı mesaj bağlantı noktalarıyla BFCache davranışında yapılan değişiklikler

Geri-ileri önbellek (veya BFCache), hızlı geri ve ileri gezinmeyi sağlayan bir tarayıcı optimizasyonudur. Chrome BFCache'de, mesaj bağlantı noktalarını kullanan uzantıları etkileme olasılığı olan değişiklikler yapıyoruz. İçerik komut dosyaları ile uzantınız arasında iletişim kurmak için mesajlaşmayı kullanan bir Chrome uzantınız varsa, uzantınızı nasıl test edeceğinizi ve uyarlayacağınızı öğrenmek üzere okumaya devam edin.

Uzantı mesajı bağlantı noktası

Uzantılar, mesaj iletme yoluyla içerik komut dosyasıyla veya diğer uzantılarla iletişim kurar. Mesajlar, runtime.sendMessage() ve tabs.sendMessage() aranarak veya yeniden kullanılabilir mesaj bağlantı noktası kullanılarak tek seferlik istekler kullanılarak gönderilebilir. Bağlantı noktası etkin olduğu sürece hem içerik komut dosyası hem de uzantı arka plan komut dosyası, bağlantı noktasını birbirlerine ileti göndermek için yeniden kullanabilir.

Daha fazla bilgi için İleti iletme başlıklı makaleye bakın.

Geri-ileri önbellek

Tarayıcı, BFCache için uygun olan bir sayfadan çıkılırken sayfanın tüm durumu ile bellekte kalmasına ancak tamamen etkin olmayan durumda kalmasına izin verir. Kullanıcı önbelleğe alınan sayfada geçmiş (geri veya ileri) gezinme işlemi gerçekleştirirse tarayıcı, sayfayı BFCache'den geri yüklemeyi dener. Böylece gezinme daha hızlı olur ve kullanıcının göz atma deneyimi iyileşir.

Sayfa BFCache'deyken JavaScript yürütülmesine izin verilmeyen donmuş bir durumdadır. Bu, alan adının aldığı iletileri işleyemeyeceği anlamına gelir.

Daha fazla bilgi için Geri-ileri önbellek sayfasına göz atın.

Uzantı mesajı bağlantı noktalarının BFCache üzerindeki etkisi

Kısacası, BFCache'deki bir sayfaya ileti gönderen uzantı, önbellekten çıkarılmasına neden olabilir ve performansı etkileyebilir.

Açık bir uzantı mesaj bağlantı noktası olan bir sayfa BFCache'de depolandığında bağlantı noktası açık kalır. Sayfa, BFCache'den geri yüklendikten sonra uzantı hizmet çalışanları, içerik komut dosyasına ileti göndermek için ileti bağlantı noktasının eski referansını kullanmaya devam edebilir.

Ancak, sayfa hâlâ BFCache'deyken uzantı, bu mesaj bağlantı noktası yoluyla bir mesaj yayınlamaya çalışırsa ileti gönderilir ancak işleyici donmuş olduğundan tam olarak teslim edilmez. Mesajı hem sıraya eklemenin hem de bırakmanın kendi sorunları olduğundan, uzantının bu durumu düşünmesi ve ele alması oldukça zordur.

Chrome'un mevcut uygulamasında, kayıp iletilerle ilgili sorunların önüne geçmek için ana makine sayfasını BFCache'den çıkarır ve mesajı siler. Kullanıcı sayfaya geri dönerse sayfa yeni yüklenir ve böylece uzantının yeni bağlantı oluşturabilmesi sağlanır.

Diğer yandan, bu uygulama BFCache'in geçerli olduğu senaryoları kısıtlar ve özellikle tüm bağlantılara düzenli olarak ileti gönderen yayın veya sinyal mekanizmalarına sahip uzantılar için performans kazançlarını sınırlandırır. Dahası, uzantı içerik komut dosyasına bir mesaj gönderdiğinde çıkarma işlemi tetiklendiğinden, web geliştiricilerinin sayfalarının çıkarılmasını engellemeleri mümkün değildir.

Genel performansı iyileştirmek için yeni bir ileti bağlantı noktası davranışı sunmayı planlıyoruz.

Yeni davranış: Sayfa BFCache'de depolandığında mesaj kanalını kapatma

Chrome 123'ten itibaren, açık uzantı mesaj bağlantı noktası içeren bir sayfa BFCache'de saklandığında, altta yatan mesaj kanalı, içerik komut dosyası tarafından proaktif olarak kapatılıyor. Bunun sonucunda, tüm mesaj bağlantı noktaları kapatılacak ve uzantı bir onDisconnect etkinliği alacak.

Kanal kapalı olduğundan, BFCache'deyken sayfaya herhangi bir mesaj gönderilmez. Bu nedenle, sayfa, uzantı nedeniyle çıkarılmaz.

Sayfa BFCache'den geri yüklendikten sonra bile kapalı ileti kanalı tekrar açılmaz. Uzantı yazarları için önerilen uygulama, sayfa yaşam döngüsü etkinliklerini dinlemek ve aşağıdaki örnekte gösterildiği gibi, sayfa BFCache'den geri yüklendiğinde yeni bir bağlantı oluşturmaktır.

// 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();
  }
});

Farklı tarayıcı temsilcilerinin yaptığı WECG görüşmesi hakkında daha fazla bilgi edinin (474 numaralı sorun kapsamında).

Etkilenir miyim?

Yeni davranış, kodunuzu test edebilmeniz için Chrome 123'te bir bayrak arkasında sunulacaktır. Daha fazla bilgi için zaman çizelgesine bakın. Uzantınızı test etmek için aşağıdaki adımları uygulayın. Bunun yalnızca basit bir test sağladığını unutmayın. Uzantıdaki hangi özelliklerin sorunlara neden olabileceğini tahmin etmek zor olabileceğinden, Chrome'u bu özellik etkin durumdayken çalıştırmanızı öneririz.

  1. Chrome sürümünün en az 123 olduğundan emin olun. İdeal olarak, testi kolaylaştıran ek bir uyarı bulunan Chrome Canary'yi kullanın.
  2. Chrome'u aşağıdaki işaretle başlat:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. Uzantı çalıştırmadan BFCache için uygun olan bir sayfaya (örneğin, https://example.com/ gibi bazı basit siteye) gidin. Dosyanın BFCache'den geri yüklendiğinden emin olmak için BFCache eğiticisini uygulayın.

  4. Uzantıyı yükleyip etkinleştirin ve BFCache uygunluğunu tekrar test edin. Manuel olarak ayrılabilir, uzantınızın BFCached sayfasına ileti yayınlaması için yeterince uzun bir süre bekleyebilir ve geri gidebilirsiniz.

  5. Sayfanın çıkarma işlemi nedeniyle BFCache yerine yeni bir şekilde yüklenmesi gerektiyse ve geri yüklemeyi engelleyen sorun "ExtensionSentMessageToCachedFrame" ise uzantı bu değişiklikten etkilenmiş olabilir.

    Chrome Canary 124.0.6315.0 ve daha yeni sürümlerde sayfada şu uyarıyı da görürsünüz:

    Sayfa BFCache'den geri yüklenmediğinde gösterilen uyarı.
    Bir sayfa BFCache'den geri yüklenmediğinde gösterilen uyarı.

Uzantının BFCache sayfasında mesaj yayınladığı onaylandıktan sonra, bu adımları uygulayarak denemeyi etkinleştirmeye zorlayabilir ve herhangi bir mantığın çalışıp çalışmadığını görebilirsiniz.

  1. Chrome'u aşağıdaki işaretle başlat:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. "ExtensionSentMessageToCachedFrame" nedeniyle BFCache'den geri yüklenmeyen sayfaya gidin.

  3. Ayrıl ve geri git. Sayfanın geri yüklenmesi gerekir ancak içerik komut dosyası ile Service Worker arasındaki mesaj kanalının bağlantısı kesilmelidir.

  4. Uzantının her zamanki gibi çalışmaya devam edip etmediğini test edin, çalışmıyorsa önceki bölümde gösterildiği gibi manuel olarak yeniden bağlanmanız gerekir.

Yayın zaman çizelgesi

Chrome 123 sürümünden itibaren yeni davranışı kademeli olarak artırmayı planlıyoruz. Ayrıntılı plan şu şekildedir:

Tarih Planlanan aşama
15 Şubat Chrome Canary ve Geliştirici'deki yeni davranış için denemeyi başlatın.
1 Mart Chrome Beta'daki yeni davranış için denemeyi başlatın.
18 Mart Bu yeni davranışı Chrome'un Kararlı sürümüyle kullanıcıların yüzde 4'üne sunun.
25 Mart Bu yeni davranışı Chrome'un kararlı sürümündeki kullanıcıların %50'sinin kullanımına sunun.
2 Nisan Deneme sona erer ve yeni davranış varsayılan olarak ayarlanır.