Pamięć podręczna stanu strony internetowej (BFCache) to rodzaj optymalizacji przeglądarki, która umożliwia błyskawiczną nawigację w obu kierunkach. Wprowadzamy zmiany w BFCache w Chrome, które mogą mieć wpływ na rozszerzenia korzystające z portów wiadomości. Jeśli masz rozszerzenie do Chrome, które używa komunikatów do komunikacji między skryptami treści a rozszerzeniem, przeczytaj dalej, aby dowiedzieć się, jak je testować i dostosowywać.
Port rozszerzenia wiadomości
Rozszerzenia komunikują się ze skryptem treści lub innymi rozszerzeniami przez przekazywanie wiadomości. Wiadomości można wysyłać, korzystając z jednorazowych próśb przez wywołanie funkcji runtime.sendMessage()
i tabs.sendMessage()
lub używając portu wiadomości wielokrotnego użytku. Dopóki port jest aktywny, zarówno skrypt treści, jak i skrypt tła rozszerzenia mogą go używać do przesyłania do siebie wiadomości.
Więcej informacji znajdziesz w artykule Przesyłanie wiadomości.
Pamięć podręczna stanu strony internetowej
Gdy opuścisz stronę, która kwalifikuje się do korzystania z BFCache, przeglądarka pozwala, aby strona z całym stanem pozostała w pamięci, ale w stanie innym niż w pełni aktywny. Jeśli użytkownik przejdzie do strony w historii (w przód lub w tył), przeglądarka spróbuje przywrócić stronę z pamięci podręcznej stanu strony internetowej. Dzięki temu nawigacja jest szybsza, a użytkownik ma lepsze wrażenia z przeglądania.
Podczas przechowywania w BFCache strona jest w zamrożonym stanie, w którym nie jest dozwolone wykonywanie kodu JavaScript. Oznacza to, że nie może przetwarzać otrzymanych wiadomości.
Więcej informacji znajdziesz w artykule Pamięć podręczna stanu strony internetowej.
Wpływ portów wiadomości rozszerzeń na BFCache
Krótko mówiąc, rozszerzenie wysyłające wiadomości do strony w BFCache może powodować usuwanie elementów z pamięci podręcznej i wpływać na wydajność.
Gdy strona z otwartym portem wiadomości rozszerzenia jest przechowywana w BFCache, port pozostaje otwarty. Gdy strona zostanie przywrócona z BFCache, pracownicy usługi rozszerzenia mogą nadal używać starego odwołania do portu wiadomości, aby publikować wiadomości w skrypcie treści.
Jeśli jednak rozszerzenie spróbuje opublikować wiadomość przez ten port wiadomości, gdy strona jest nadal w BFCache, wiadomość zostanie wysłana, ale nie zostanie w pełni dostarczona, ponieważ moduł obsługi jest zamrożony. Rozszerzenie ma problem z rozpatrywaniem i rozwiązywaniem tej sytuacji, ponieważ zarówno kolejkowanie, jak i odrzucanie wiadomości wiąże się z własnymi problemami.
Aby uniknąć problemów związanych z utratą wiadomości, w obecnej implementacji Chrome usuwa stronę hosta z BFCache i odrzuca wiadomość. Jeśli użytkownik wróci na stronę, zostanie ona załadowana od nowa, co pozwoli rozszerzeniu utworzyć nowe połączenie.
Z drugiej strony, ta implementacja ogranicza scenariusze, w których stosuje się BFCache, co ogranicza wzrost wydajności, zwłaszcza w przypadku rozszerzeń z mechanizmami przesyłania informacji do wszystkich połączeń lub mechanizmami heartbeat. Ponadto, ponieważ usunięcie jest wywoływane, gdy rozszerzenie wysyła wiadomość do skryptu treści, deweloperzy stron internetowych nie mają możliwości zapobiegania usuwaniu stron.
Aby poprawić ogólną wydajność, planujemy wprowadzić nowe zachowanie portu wiadomości.
Nowe działanie: zamykanie kanału wiadomości, gdy strona jest przechowywana w BFCache
Od wersji 123 Chrome, gdy strona z otwartym portem wiadomości rozszerzenia jest przechowywana w BFCache, podstawowy kanał wiadomości jest aktywnie zamykany po stronie skryptu treści. W efekcie wszystkie porty wiadomości zostaną zamknięte, a rozszerzenie otrzyma zdarzenie onDisconnect
.
Ponieważ kanał jest zamknięty, żadne wiadomości nie będą wysyłane na stronę, dopóki będzie ona przechowywana w pamięci podręcznej stanu strony internetowej. Dlatego strona nie zostanie usunięta z pamięci z powodu rozszerzenia.
Nawet po przywróceniu strony z BFCache zamknięty kanał wiadomości nie zostanie ponownie otwarty. Autorzy rozszerzeń powinni słuchać zdarzeń cyklu życia strony i ustawiać nowe połączenie, gdy strona jest przywracana z BFCache, jak pokazano w tym przykładzie.
// 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();
}
});
Dowiedz się więcej o dyskusji WECG z udziałem przedstawicieli różnych przeglądarek (problem 474).
Czy to mnie dotyczy?
Nowe działanie będzie dostępne za pomocą flagi w Chrome 123, aby umożliwić Ci testowanie kodu. Więcej informacji znajdziesz w harmonogramie. Aby przetestować rozszerzenie, wykonaj podane niżej czynności. Pamiętaj, że jest to tylko prosty test. Zachęcamy do uruchamiania Chrome z włączoną funkcją przez pewien czas, ponieważ trudno przewidzieć, które funkcje rozszerzenia mogą powodować problemy.
Testowanie nowego zachowania
Aby wymusić włączenie eksperymentu w Chrome 123:
Uruchom Chrome z tą flagą, która wymusza nowe zachowanie:
--enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
Otwórz stronę i w razie potrzeby wejdź w interakcję z rozszerzeniem, aby skrypt treści otworzył port dla rozszerzenia.
Przejdź na inną stronę i wróć. Strona powinna zostać przywrócona, ale kanał wiadomości między skryptem treści a service workerem powinien zostać odłączony.
Sprawdź, czy rozszerzenie działa normalnie. Jeśli nie, ręcznie połącz się ponownie, jak pokazano w poprzedniej sekcji.
Wykrywanie prostych problemów przy użyciu starego zachowania
Przed tą zmianą Chrome wyświetlał ostrzeżenie, jeśli użytkownik próbował wysłać wiadomość do portu powiązanego ze stroną w bfcache. Może to być przydatne do wykrywania niektórych, ale nie wszystkich problemów, które dotyczą wiadomości z tła na stronie.
- Sprawdź, czy wersja Chrome jest co najmniej 123. Najlepiej użyć przeglądarki Chrome Canary, która zawiera dodatkowe ostrzeżenie ułatwiające testowanie.
Uruchom Chrome z tą flagą, która wymusza stare zachowanie:
--disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
Otwórz stronę, która kwalifikuje się do korzystania z BFCache, bez uruchomionej rozszerzenia (np. prostą stronę, taką jak https://example.com/). Aby mieć pewność, że dane zostały przywrócone z BFCache, wykonaj samouczek BFCache.
Zainstaluj i włącz rozszerzenie, a potem ponownie sprawdź, czy spełniasz wymagania dotyczące BFCache. Możesz ręcznie przejść do innej strony, poczekać wystarczająco długo, aby Twoje rozszerzenie opublikowało wiadomość na stronie BFCached, i wrócić.
Jeśli z powodu usunięcia z pamięci podręcznej strony zamiast z pamięci podręcznej stanu strony internetowej musiała zostać załadowana nowa strona, a problem uniemożliwiający przywrócenie to „ExtensionSentMessageToCachedFrame”, może to oznaczać, że ta zmiana ma wpływ na rozszerzenie.
W Chrome Canary 124.0.6315.0 lub nowszej wersji zobaczysz też to ostrzeżenie:
Ostrzeżenie wyświetlane, gdy strona nie jest przywracana z BFCache.
Gdy potwierdzisz, że rozszerzenie publikuje wiadomości na stronie BFCache, możesz wykonać czynności opisane w poprzedniej sekcji, aby wymusić włączenie eksperymentu i obserwować, czy nie powoduje on żadnych błędów.
Harmonogram wersji
Planujemy stopniowe wdrażanie nowego zachowania, rozpoczynając od Chrome 123. Oto szczegółowy plan:
Data | Planowany krok milowy |
---|---|
15 lutego | Rozpocznij eksperyment dotyczący nowych mechanizmów w Chrome 123 Canary i Deweloper. |
7 marca | Rozpocznij eksperyment dotyczący nowego zachowania w Chrome 123 Beta. |
18 marca | Wprowadzenie nowego zachowania dla 4 procent użytkowników Chrome 123 stabilnej. |
25 marca | Wprowadzenie nowego zachowania dla 50 procent użytkowników Chrome 123 Stable. |
2 kwietnia | Eksperyment się kończy, a nowe działanie staje się domyślne. |