Przejście na przestrzeń nazw przeglądarki

Od Chrome 148 wszystkie interfejsy API rozszerzeń do Chrome są dostępne w przestrzeni nazw browser oprócz dotychczasowej przestrzeni nazw chrome. Na przykład browser.tabs.create({})chrome.tabs.create({}) są równoważne.

Przestrzeń nazw jest dostępna wszędzie tam, gdzie można wywoływać interfejsy API rozszerzeń, w tym w skryptach treści, procesach service worker i dokumentach poza ekranem. Wskazuje te same obiekty interfejsu API co chrome, więc chrome.tabs === browser.tabs.

Przestrzeń nazw browser jest wynikiem prac grupy społecznościowej WebExtensions (WECG), grupy społecznościowej W3C, w której dostawcy przeglądarek współpracują nad wspólnymi standardami rozszerzeń. Przestrzeń nazw chrome nie zostanie usunięta. Obie przestrzenie nazw będą nadal działać.

Decydowanie o przyjęciu przestrzeni nazw przeglądarki

Jeśli używasz webextension-polyfill, przed wprowadzeniem jakichkolwiek zmian przejdź do sekcji Uwaga dla użytkowników kodu polyfill – odpowiedź jest inna.

Jeśli tworzysz nowe rozszerzenie, ustaw wartość minimum_chrome_version na "148" i używaj browser bezwarunkowo. Nie musisz czytać dalej. Pozostała część tej sekcji jest przeznaczona dla dotychczasowych rozszerzeń, które decydują, jak je wdrożyć.

Sprawdzanie, z jakich wersji Chrome korzystają użytkownicy

Jeśli masz już rozszerzenie, przed przejściem na nową wersję sprawdź, z których wersji Chrome korzystają Twoi użytkownicy. Chrome aktualizuje się automatycznie, ale niektórzy użytkownicy wyłączają aktualizacje, a inni korzystają ze starszych urządzeń, na których nie można uruchomić najnowszej wersji. Potwierdź to na podstawie własnych danych analitycznych. Jeśli nie masz jeszcze skonfigurowanej analityki, zapoznaj się z artykułem Monitorowanie skuteczności rozszerzenia za pomocą Google Analytics 4, aby zacząć.

Następnie wybierz ścieżkę:

Przyjęcie bezwarunkowe

Ustaw w pliku manifestu wartość minimum_chrome_version i używaj browser bezwarunkowo – nie jest potrzebne żadne zabezpieczenie w czasie działania:

{
  "minimum_chrome_version": "148"
}

W przypadku zwiększania minimum_chrome_version używaj wdrażania etapowego. Jeśli coś pójdzie nie tak, możesz wycofać zmiany w rozszerzeniu w Chrome Web Store.

Korzystanie z ochrony środowiska wykonawczego

Dodaj ten fragment na początku kodu uruchamiania rozszerzenia, zanim w innych miejscach odwołasz się do browser:

if (!globalThis.browser) {
  globalThis.browser = chrome;
  // Consider firing an analytics event here to measure how often
  // your users hit this fallback path.
}

W starszych wersjach browser staje się aliasem chrome, więc reszta kodu może bezwarunkowo używać browser.

Uwaga dla użytkowników kodu polyfill

Jeśli rozszerzenie korzysta z webextension-polyfill, w Chrome w wersji 148 i nowszych nie będzie działać. Kod polyfill pominął opakowywanie, gdy zdefiniowano już browser, zakładając, że przeglądarka hosta udostępniła już interfejs API.

Wcześniejsza próba wprowadzenia przestrzeni nazw w Chrome 136 została wycofana z tego powodu: po browser nowo zdefiniowanym polyfill przestał opakowywać, ale browser.runtime.onMessage w Chrome nie obsługiwał jeszcze słuchaczy zwracających obietnice, które polyfill zapewniał. Rozszerzenia korzystające z tego wzorca przestały działać. Chrome 148 udostępnia przestrzeń nazw i natywne detektory zwracające obietniceonMessage, aby uniknąć tej luki.

Gdy Twoi użytkownicy zaczną korzystać z Chrome 148, możesz usunąć zależność od polyfill.

Inne funkcje

Odpowiedzi asynchroniczne w runtime.sendMessage

W Chrome 148 runtime.onMessage mogą zwracać Promise bezpośrednio, aby wysyłać odpowiedzi asynchroniczne. Działa to niezależnie od tego, czy wywołasz ją za pomocą chrome.* czy browser.*.

Wcześniej jedynym sposobem na asynchroniczną odpowiedź było zwrócenie literału true z funkcji nasłuchującej i późniejsze wywołanie funkcji sendResponse:

// Old pattern - requires returning true to keep the channel open
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  fetch('https://example.com')
    .then(response => sendResponse({ statusCode: response.status }));

  return true; // keeps the message channel open for the async response
});

Możesz teraz bezpośrednio zwrócić wartość Promise (lub użyć funkcji async):

// New pattern - return a promise or use async/await
browser.runtime.onMessage.addListener(async (message, sender) => {
  const response = await fetch('https://example.com');
  return { statusCode: response.status };
});

Wzorzec return true nadal działa, więc nie trzeba zmieniać istniejącego kodu.