Publicado: 13 de abril de 2026
Tradicionalmente, la comunicación entre los diferentes componentes de la extensión (secuencias de comandos en segundo plano, secuencias de comandos de contenido y ventanas emergentes) se ha basado en la serialización de JSON. Si bien es confiable, JSON tiene limitaciones.
Nos complace anunciar que, a partir de Chrome 148, los desarrolladores de extensiones podrán habilitar el uso del algoritmo de clonación estructurada para la serialización de mensajes en lugar de JSON. Esta modernización te permite enviar tipos de datos más complejos entre los contextos de tu extensión sin soluciones manuales para la serialización.
¿Por qué usar la clonación estructurada?
La serialización de JSON (a través de JSON.stringify de forma interna) es funcional, pero a veces requiere que los desarrolladores hagan malabares cuando trabajan con tipos de JavaScript modernos.
Este es un ejemplo específico que podrías haber encontrado cuando desarrollabas una extensión:
// 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);
});
Otras situaciones en las que falla JSON y que tal vez tuviste que solucionar son los objetos Set, BigInt, NaN y Infinity, Date y Error.
El uso de la serialización de clonación estructurada significa que ahora puedes enviar varios objetos que antes eran difíciles o imposibles de transmitir a través de la mensajería de extensiones.
Por ejemplo, el envío de un objeto Map ahora es directo:
// 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
});
Se agregó compatibilidad con más tipos
La clonación estructurada admite una amplia variedad de otros tipos, como File y Blob.
Cómo participar en el programa
Para garantizar la retrocompatibilidad y evitar que se interrumpan las extensiones existentes, esta función es opcional. Puedes habilitarlo de forma global para tu extensión agregando una sola clave a tu manifest.json:
{
"name": "My Extension",
"version": "1.0",
"manifest_version": 3,
"message_serialization": "structured_clone"
}
Si se omite o se usa una versión de Chrome anterior a la 148, el navegador usará de forma predeterminada su implementación actual basada en JSON para la extensión.
Con la compatibilidad con el algoritmo de clonación estructurada, acercamos la API de mensajería de extensiones a la alineación con las capacidades estándar de la plataforma web (similar a postMessage que se usa en los Web Workers y la comunicación de iframe), lo que te brinda más flexibilidad y potencia.
Interoperabilidad y advertencias
Si bien nuestra implementación de serialización de clonación estructurada admite muchos más tipos que JSON, hay algunas suposiciones arquitectónicas y algunas incompatibilidades con la implementación que debes tener en cuenta.
Tipos no admitidos
Nuestra implementación no admite objetos compartidos, como SharedArrayBuffer, ni transferencia de objetos, como ArrayBuffer.
SharedArrayBuffer no podrá serializar ni deserializar (según la situación), y si se intenta enviar un objeto transferible como Uint8Array, se enviará una copia en su lugar.
Comunicación entre extensiones
Aplicamos formatos de serialización coincidentes para garantizar la integridad de los datos. Las extensiones con formatos de serialización que no coinciden no pueden comunicarse directamente a través de runtime.sendMessage o runtime.connect. Por ejemplo, si la extensión A usa la serialización JSON y trata de enviar un mensaje a la extensión B con la clonación estructurada, el mensaje no se enviará y el puerto se cerrará (y viceversa).
Comunicación de páginas web
Las páginas web que usan externally_connectable se adaptarán automáticamente al formato de serialización de la extensión de destino. Si tu extensión usa la clonación estructurada, los contextos web que envíen mensajes con la API de runtime usarán la clonación estructurada (y viceversa) automáticamente. Esto significa que el sitio web y la extensión deben estar sincronizados en su formato de serialización esperado para evitar errores de serialización.
Mensajería nativa
Los canales de mensajería nativos siempre fuerzan la serialización de JSON.
Si intentas enviar tipos de datos que solo se pueden clonar de forma estructurada (como un BigInt) a un host nativo, se producirá un error antes de que un mensaje salga del contexto de tu extensión.
Métodos toJSON()
Si usas clases u objetos con métodos toJSON() personalizados para realizar una serialización personalizada (por ejemplo, limpiar datos quitando contraseñas antes de enviar un objeto), ten en cuenta que la clonación estructurada ignora toJSON(). Copia los valores de las propiedades directamente. Si dependes de toJSON() para la serialización personalizada, es posible que se requiera algo de trabajo manual antes de enviar. Por ejemplo:
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" }
¿Desaparecerá la serialización de JSON?
¡No! Chrome se compromete a admitir ambos formatos de serialización en el futuro previsible.
Enviar comentarios
Esperamos que esta nueva función te permita crear flujos de trabajo más fluidos y potentes para el desarrollo de extensiones.
Si bien creamos un paquete de pruebas para validar la funcionalidad de nuestra implementación de clonación estructurada, la plataforma web tiene una gran variedad de objetos. Prueba esta nueva función y informa cualquier error o caso límite que encuentres. Tus comentarios nos ayudarán a mejorar la implementación para toda la comunidad.