Opublikowano: 22 kwietnia 2026 r.
Komunikacja między różnymi komponentami rozszerzenia (skrypty działające w tle, skrypty treści, wyskakujące okienka) tradycyjnie opiera się na serializacji JSON. JSON jest niezawodny, ale ma pewne ograniczenia.
Z przyjemnością informujemy, że od Chrome 148 deweloperzy rozszerzeń mogą używać algorytmu klonowania strukturalnego do serializacji wiadomości zamiast JSON! Ta modernizacja umożliwia wysyłanie bardziej złożonych typów danych między kontekstami rozszerzeń bez ręcznych obejść serializacji.
Dlaczego klonowanie strukturalne?
Serializacja JSON (za pomocą JSON.stringify ) działa, ale czasami wymaga od deweloperów wykonywania skomplikowanych działań podczas pracy z nowoczesnymi typami JavaScript.
Oto konkretny przykład, który mógł Ci się przytrafić podczas tworzenia rozszerzenia:
// Sending a Map with JSON serialization
const myMap = new Map([['id', 123]]);
// Arrives as {} on the other side!
chrome.runtime.sendMessage(myMap);
// Workaround: Convert Map to an Array of entries before sending
const message = Array.from(myMap.entries());
chrome.runtime.sendMessage(message);
// On the receiving side:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
const receivedMap = new Map(message);
});
Inne sytuacje, w których JSON zawodzi i które mogą wymagać obejścia, to obiekty Set, BigInt, NaN i Infinity, Date oraz Error.
Używanie serializacji klonowania strukturalnego oznacza, że możesz teraz wysyłać różne obiekty, które wcześniej były trudne lub niemożliwe do przesłania za pomocą wiadomości rozszerzeń.
Na przykład wysyłanie obiektu Map jest teraz bezpośrednie:
// Sending a Map with Structured Clone
const myMap = new Map([['id', 123]]);
// Arrives as a Map on the other side!
chrome.runtime.sendMessage(myMap);
// On the receiving side:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
// message is already a Map instance!
console.log(message.get('id')); // 123
});
Więcej obsługiwanych typów
Klonowanie strukturalne obsługuje wiele innych typów
takich jak File i Blob.
Jak zgłosić chęć udziału
Aby zapewnić wsteczną zgodność i zapobiec uszkodzeniu istniejących rozszerzeń, ta funkcja jest opcjonalna. Możesz włączyć ją globalnie w rozszerzeniu, dodając pojedynczy klucz do pliku manifest.json:
{
"name": "My Extension",
"version": "1.0",
"manifest_version": 3,
"message_serialization": "structured_clone"
}
Jeśli ten klucz zostanie pominięty lub używana jest wersja Chrome starsza niż 148, przeglądarka domyślnie używa bieżącej implementacji opartej na JSON.
Dzięki obsłudze algorytmu klonowania strukturalnego zbliżamy interfejs API przesyłania wiadomości rozszerzeń do standardowych możliwości platformy internetowej (podobnie jak w przypadku postMessage używanego w Web Workers i komunikacji iframe), co daje większą elastyczność i możliwości.
Interoperacyjność i pułapki
Nasza implementacja serializacji klonowania strukturalnego obsługuje znacznie więcej typów niż JSON, ale należy pamiętać o kilku założeniach architektonicznych i niezgodnościach z implementacją.
Nieobsługiwane typy
Nasza implementacja nie obsługuje obiektów współdzielonych, takich jak
SharedArrayBuffer
ani przesyłania
obiektów
takich jak ArrayBuffer.
Serializacja lub deserializacja SharedArrayBuffer nie powiedzie się (w zależności od sytuacji), a próba wysłania obiektu przenoszonego, takiego jak Uint8Array, spowoduje wysłanie jego kopii.
Komunikacja między rozszerzeniami
Aby zapewnić integralność danych, wymuszamy zgodność formatów serializacji. Rozszerzenia z niezgodnymi formatami serializacji nie mogą komunikować się bezpośrednio za pomocą runtime.sendMessage ani runtime.connect. Jeśli na przykład rozszerzenie A używa serializacji JSON i próbuje wysłać wiadomość do rozszerzenia B za pomocą klonowania strukturalnego, wysyłanie wiadomości nie powiedzie się, a port zostanie zamknięty (i odwrotnie).
Komunikacja ze stroną internetową
Strony internetowe korzystające z externally_connectable automatycznie dostosują się do formatu serializacji rozszerzenia docelowego. Jeśli rozszerzenie używa klonowania strukturalnego, konteksty internetowe wysyłające wiadomości za pomocą interfejsu API runtime będą automatycznie używać klonowania strukturalnego (i odwrotnie). Oznacza to, że witryna i rozszerzenie muszą być zsynchronizowane pod względem oczekiwanego formatu serializacji, aby zapobiec błędom serializacji.
Natywne aplikacje do obsługi wiadomości
Kanały natywnego przesyłania komunikatów nadal wymuszają serializację JSON.
Próba wysłania do hosta natywnego typów obsługiwanych tylko przez klonowanie strukturalne (np. BigInt) nie powiedzie się, zanim wiadomość opuści kontekst rozszerzenia.
Metody toJSON()
Jeśli używasz klas lub obiektów z niestandardowymi metodami toJSON() do przeprowadzania niestandardowej serializacji (np. do czyszczenia danych przez usuwanie haseł przed wysłaniem obiektu), pamiętaj, że klonowanie strukturalne ignoruje toJSON(). Kopiuje bezpośrednio wartości właściwości. Jeśli do niestandardowej serializacji używasz toJSON(), przed wysłaniem może być konieczne wykonanie ręcznych działań. Na przykład:
class User {
constructor(name, password) {
this.name = name;
this.password = password;
}
// This will be ignored by structured clone!
toJSON() {
return { name: this.name };
}
}
const user = new User("Alice", "secret123");
// JSON -> {"name":"Alice"}
// Structured Clone -> { name: "Alice", password: "secret123" }
Czy serializacja JSON zostanie wycofana?
Nie! Chrome będzie obsługiwać oba formaty serializacji w przewidywalnej przyszłości.
Podziel się opinią
Mamy nadzieję, że ta nowa funkcja umożliwi Ci płynniejsze i bardziej wydajne tworzenie rozszerzeń.
Utworzyliśmy zestaw testów, aby sprawdzić funkcjonalność naszej implementacji klonowania strukturalnego, ale platforma internetowa obejmuje ogromną różnorodność obiektów. Wypróbuj tę nową funkcję i zgłoś wszelkie błędy lub przypadki brzegowe, które napotkasz. Twoja opinia pomoże nam ulepszyć implementację dla całej społeczności.