Pubblicato il 13 aprile 2026
La comunicazione tra i diversi componenti dell'estensione (script di sfondo, script di contenuti, popup) si basa tradizionalmente sulla serializzazione JSON. Sebbene sia affidabile, JSON presenta delle limitazioni.
Siamo felici di annunciare che, a partire da Chrome 148, gli sviluppatori di estensioni possono attivare l'utilizzo dell'algoritmo di clonazione strutturata per la serializzazione dei messaggi anziché JSON! Questa modernizzazione ti consente di inviare tipi di dati più complessi tra i contesti delle estensioni senza soluzioni alternative di serializzazione manuale.
Perché la clonazione strutturata?
La serializzazione JSON (tramite JSON.stringify ) è funzionale, ma a volte richiede agli sviluppatori di superare ostacoli quando hanno a che fare con i tipi JavaScript moderni.
Ecco un esempio specifico che potresti aver riscontrato durante lo sviluppo di un'estensione:
// 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);
});
Alcune altre situazioni in cui JSON non funziona e che potresti aver dovuto aggirare sono gli oggetti Set, BigInt, NaN e Infinity, Date ed Error.
L'utilizzo della serializzazione della clonazione strutturata ti consente ora di inviare vari oggetti che in precedenza erano difficili o impossibili da trasmettere tramite la messaggistica delle estensioni.
Ad esempio, l'invio di un oggetto Map è ora diretto:
// 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
});
Altri tipi supportati
La clonazione strutturata supporta un'ampia gamma di altri
tipi
come File e Blob.
Come attivare il programma
Per garantire la compatibilità con le versioni precedenti ed evitare di interrompere le estensioni esistenti, questa funzionalità è facoltativa. Puoi attivarla a livello globale per la tua estensione aggiungendo una singola chiave a manifest.json:
{
"name": "My Extension",
"version": "1.0",
"manifest_version": 3,
"message_serialization": "structured_clone"
}
Se omesso o in una versione di Chrome precedente alla 148, il browser utilizza l'implementazione basata su JSON corrente per l'estensione.
Supportando l'algoritmo di clonazione strutturata, stiamo avvicinando l'API di messaggistica delle estensioni alle funzionalità standard della piattaforma web (simili a postMessage utilizzata nella comunicazione tra iframe e Web Worker), offrendoti maggiore flessibilità e potenza.
Interoperabilità e aspetti da tenere presenti
Sebbene la nostra implementazione della serializzazione della clonazione strutturata supporti molti più tipi di JSON, devi tenere presente alcune ipotesi architetturali e incompatibilità con l'implementazione.
Tipi non supportati
Gli oggetti condivisi come
SharedArrayBuffer
e il trasferimento di
oggetti
come ArrayBuffer non sono supportati dalla nostra implementazione.
SharedArrayBuffer non verrà serializzato o deserializzato (a seconda della situazione) e, se tenti di inviare un oggetto trasferibile come Uint8Array, verrà inviata una copia.
Comunicazione tra estensioni
Applichiamo formati di serializzazione corrispondenti per garantire l'integrità dei dati. Le estensioni con formati di serializzazione non corrispondenti non possono comunicare direttamente tramite runtime.sendMessage o runtime.connect. Ad esempio, se l'estensione A utilizza la serializzazione JSON e tenta di inviare un messaggio all'estensione B utilizzando la clonazione strutturata, l'invio del messaggio non andrà a buon fine e la porta verrà chiusa (e viceversa).
Comunicazione con le pagine web
Le pagine web che utilizzano externally_connectable si adatteranno automaticamente al formato di serializzazione dell'estensione di destinazione. Se la tua estensione utilizza la clonazione strutturata, i contesti web che inviano messaggi utilizzando l'API runtime utilizzeranno automaticamente la clonazione strutturata (e viceversa). Ciò significa che il sito web e l'estensione devono essere sincronizzati sul formato di serializzazione previsto per evitare errori di serializzazione.
Messaggi nativi
I canali di messaggistica nativa continuano a forzare sempre la serializzazione JSON.
Il tentativo di inviare tipi solo di clonazione strutturata (come BigInt) a un host nativo non andrà a buon fine prima che un messaggio lasci il contesto dell'estensione.
Metodi toJSON()
Se utilizzi classi o oggetti con metodi toJSON() personalizzati per eseguire la serializzazione personalizzata (ad esempio, la sanificazione dei dati rimuovendo le password prima di inviare un oggetto), tieni presente che la clonazione strutturata ignora toJSON(). Copia direttamente i valori delle proprietà. Se utilizzi toJSON() per la serializzazione personalizzata, potrebbe essere necessario eseguire alcune operazioni manuali prima dell'invio. Ad esempio:
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" }
La serializzazione JSON verrà eliminata?
No! Chrome si impegna a supportare entrambi i formati di serializzazione nel prossimo futuro.
Condividi feedback
Ci auguriamo che questa nuova funzionalità sblocchi flussi di lavoro più fluidi e potenti per lo sviluppo delle estensioni.
Sebbene abbiamo creato una suite di test per convalidare la funzionalità della nostra implementazione della clonazione strutturata, la piattaforma web ha una varietà enorme di oggetti. Prova questa nuova funzionalità e segnala eventuali bug o casi limite che riscontri. Il tuo feedback ci aiuterà a migliorare l'implementazione per l'intera community.