Veröffentlicht: 22. April 2026
Die Kommunikation zwischen verschiedenen Erweiterungskomponenten (Hintergrundskripts, Inhaltsskripts, Pop-ups) beruhte bisher auf der JSON-Serialisierung. JSON ist zwar zuverlässig, hat aber Einschränkungen.
Wir freuen uns, Ihnen mitteilen zu können, dass Erweiterungsentwickler ab Chrome 148 den Algorithmus für strukturiertes Klonen für die Nachrichtenserialisierung anstelle von JSON verwenden können. Durch diese Modernisierung können Sie komplexere Datentypen zwischen Ihren Erweiterungskontexten senden, ohne dass manuelle Serialisierungs-Workarounds erforderlich sind.
Warum strukturierter Klon?
Die JSON-Serialisierung (über JSON.stringify im Hintergrund) funktioniert, erfordert aber manchmal, dass Entwickler bei der Verarbeitung moderner JavaScript-Typen einige Hürden überwinden müssen.
Hier ein konkretes Beispiel, das Ihnen bei der Entwicklung einer Erweiterung begegnet sein könnte:
// 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);
});
Weitere Situationen, in denen JSON fehlschlägt und für die Sie möglicherweise einen Workaround gefunden haben, sind Set-, BigInt-, NaN- und Infinity-, Date- und Error-Objekte.
Durch die Verwendung der strukturierten Klonserialisierung können Sie jetzt verschiedene Objekte senden, die zuvor nur schwer oder gar nicht über die Nachrichtenübermittlung von Erweiterungen übertragen werden konnten.
Das Senden eines Map-Objekts erfolgt jetzt beispielsweise direkt:
// 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
});
Weitere unterstützte Typen
Der strukturierte Klon unterstützt eine Vielzahl von anderen Typen wie File und Blob.
Für das Betatestprogramm anmelden
Um die Abwärtskompatibilität zu gewährleisten und zu verhindern, dass vorhandene Erweiterungen nicht mehr funktionieren, ist diese Funktion optional. Sie können sie global für Ihre Erweiterung aktivieren, indem Sie Ihrer manifest.json einen einzelnen Schlüssel hinzufügen:
{
"name": "My Extension",
"version": "1.0",
"manifest_version": 3,
"message_serialization": "structured_clone"
}
Wenn diese Option nicht angegeben wird oder eine Chrome-Version niedriger als 148 verwendet wird, verwendet der Browser standardmäßig die aktuelle JSON-basierte Implementierung für die Erweiterung.
Durch die Unterstützung des strukturierten Klonalgorithmus nähern wir die Messaging-API für Erweiterungen an die Standardfunktionen der Webplattform an (ähnlich wie postMessage, das in Webworkern und der iframe-Kommunikation verwendet wird). Das gibt Ihnen mehr Flexibilität und Möglichkeiten.
Interoperabilität und Fallstricke
Unsere Implementierung der strukturierten Klon-Serialisierung unterstützt zwar viel mehr Typen als JSON, es gibt jedoch einige architektonische Annahmen und Inkompatibilitäten mit der Implementierung, die Sie beachten sollten.
Nicht unterstützte Typen
Freigegebene Objekte wie SharedArrayBuffer und Übertragung von Objekten wie ArrayBuffer werden in unserer Implementierung nicht unterstützt.
SharedArrayBuffer kann je nach Situation nicht serialisiert oder deserialisiert werden. Wenn Sie versuchen, ein übertragbares Objekt wie Uint8Array zu senden, wird stattdessen eine Kopie gesendet.
Kommunikation zwischen Erweiterungen
Wir erzwingen übereinstimmende Serialisierungsformate, um die Datenintegrität zu gewährleisten. Erweiterungen mit inkompatiblen Serialisierungsformaten können nicht direkt über runtime.sendMessage oder runtime.connect kommunizieren. Wenn beispielsweise Erweiterung A die JSON-Serialisierung verwendet und versucht, Erweiterung B über „structured clone“ eine Nachricht zu senden, kann die Nachricht nicht gesendet werden und der Port wird geschlossen (und umgekehrt).
Webseitenkommunikation
Webseiten, die externally_connectable verwenden, werden automatisch an das Serialisierungsformat der Zielerweiterung angepasst. Wenn Ihre Erweiterung „Structured Clone“ verwendet, wird automatisch „Structured Clone“ verwendet, wenn Webkontexte Nachrichten über die runtime API senden (und umgekehrt). Das bedeutet, dass die Website und die Erweiterung hinsichtlich des erwarteten Serialisierungsformats synchronisiert sein müssen, um Serialisierungsfehler zu vermeiden.
Natives Messaging
Bei nativen Messaging-Channels wird weiterhin immer die JSON-Serialisierung erzwungen.
Der Versuch, Typen, die nur für strukturierte Klone vorgesehen sind (z. B. BigInt), an einen nativen Host zu senden, schlägt fehl, bevor eine Nachricht den Kontext Ihrer Erweiterung verlässt.
toJSON()-Methoden
Wenn Sie Klassen oder Objekte mit benutzerdefinierten toJSON()-Methoden verwenden, um eine benutzerdefinierte Serialisierung durchzuführen (z. B. um Daten zu bereinigen, indem Passwörter vor dem Senden eines Objekts entfernt werden), beachten Sie, dass toJSON() von structuredClone ignoriert wird. Dabei werden Attributwerte direkt kopiert. Wenn Sie für die benutzerdefinierte Serialisierung auf toJSON() angewiesen sind, sind vor dem Senden möglicherweise einige manuelle Schritte erforderlich. Beispiel:
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" }
Wird die JSON-Serialisierung eingestellt?
Nein! Chrome wird beide Serialisierungsformate auf absehbare Zeit unterstützen.
Feedback geben
Wir hoffen, dass diese neue Funktion die Entwicklung von Erweiterungen für Sie einfacher und leistungsfähiger macht.
Wir haben zwar eine Testsuite erstellt, um die Funktionalität unserer Implementierung von strukturierten Klonen zu validieren, aber die Webplattform bietet eine Vielzahl von Objekten. Probieren Sie diese neue Funktion aus und melden Sie alle Fehler oder Grenzfälle, die Ihnen auffallen. Ihr Feedback hilft uns, die Implementierung für die gesamte Community zu verbessern.