Desbloquea Structured Clone para la mensajería de extensiones de Chrome

Justin Lulejian
Justin Lulejian

Fecha de publicación: 22 de abril de 2026

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) tradicionalmente se basó en la serialización JSON. Si bien es confiable, JSON tiene limitaciones.

Nos complace anunciar que, a partir de Chrome 148, los desarrolladores de extensiones pueden 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 alternativas de serialización manual.

¿Por qué usar la clonación estructurada?

La serialización JSON (a través de JSON.stringify en segundo plano) es funcional, pero a veces requiere que los desarrolladores salten obstáculos cuando se trata de 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);
});

Algunas otras situaciones en las que falla JSON y que quizás tuviste que solucionar son Set, BigInt, NaN y Infinity, Date y objetos 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 extensión. 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
});

Más tipos admitidos

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 la interrupción de las extensiones existentes, esta función es opcional. Para habilitarla de forma global en tu extensión, agrega una sola clave a tu manifest.json:

{
  "name": "My Extension",
  "version": "1.0",
  "manifest_version": 3,
  "message_serialization": "structured_clone"
}

Si se omite o en una versión de Chrome anterior a 148, el navegador usa de forma predeterminada su implementación actual basada en JSON para la extensión.

Al admitir el algoritmo de clonación estructurada, acercamos la API de mensajería de extensión a la alineación con las capacidades estándar de la plataforma web (similar a postMessage que se usa en 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, debes tener en cuenta algunas suposiciones arquitectónicas e incompatibilidades con la implementación.

Tipos no admitidos

Los objetos compartidos como SharedArrayBuffer y la transferencia de objetos como ArrayBuffer no son compatibles con nuestra implementación. SharedArrayBuffer no se podrá serializar ni deserializar (según la situación), y si intentas enviar un objeto transferible como Uint8Array, se enviará una copia en su lugar.

Comunicación de extensión a extensión

Aplicamos formatos de serialización coincidentes para garantizar la integridad de los datos. Las extensiones con formatos de serialización no coincidentes 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ágina 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 nativa siguen forzando siempre la serialización JSON. Si intentas enviar tipos solo de clonación estructurada (como un BigInt) a un host nativo, fallará 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 la serialización personalizada (por ejemplo, desinfectar 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 un 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 JSON?

¡No! Chrome se compromete a admitir ambos formatos de serialización en el futuro previsible.

Enviar comentarios

Esperamos que esta nueva capacidad desbloquee flujos de trabajo más fluidos y potentes para el desarrollo de tu extensión.

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 envía un informe sobre cualquier error o caso extremo que encuentres. Tus comentarios nos ayudarán a mejorar la implementación para toda la comunidad.