Jonatan Matajonmatum.com
conceptosnotasexperimentosensayos
© 2026 Jonatan Mata. All rights reserved.v2.1.1
Conceptos

Web Components

Estándares web nativos para crear componentes reutilizables y encapsulados que funcionan en cualquier framework o sin framework.

evergreen#web-components#custom-elements#shadow-dom#html#standards

¿Qué es?

Web Components son un conjunto de estándares web que permiten crear elementos HTML custom reutilizables con encapsulación de estilos y comportamiento. Funcionan en cualquier framework — o sin framework.

Estándares

Los Web Components se basan en tres especificaciones del W3C/WHATWG que trabajan juntas:

  • Custom Elements: API para registrar nuevos elementos HTML con ciclo de vida propio (connectedCallback, disconnectedCallback, attributeChangedCallback)
  • Shadow DOM: árbol DOM encapsulado que aísla estilos y markup del documento principal
  • HTML Templates: elementos <template> y <slot> para contenido declarativo reutilizable

Custom Element nativo

class UserCard extends HTMLElement {
  static observedAttributes = ["name", "role"];
 
  constructor() {
    super();
    this.attachShadow({ mode: "open" });
  }
 
  connectedCallback() {
    this.render();
  }
 
  attributeChangedCallback() {
    this.render();
  }
 
  render() {
    const name = this.getAttribute("name") ?? "Unknown";
    const role = this.getAttribute("role") ?? "";
    this.shadowRoot.innerHTML = `
      <style>
        :host {
          display: block;
          padding: 1rem;
          border: 1px solid #333;
          border-radius: 8px;
          font-family: system-ui;
        }
        :host([highlighted]) { border-color: #58a6ff; }
        .name { font-weight: 600; }
        .role { color: #888; font-size: 0.875rem; }
      </style>
      <span class="name">${name}</span>
      <span class="role">${role}</span>
    `;
  }
}
 
customElements.define("user-card", UserCard);

Uso en HTML:

<user-card name="Ana García" role="Staff Engineer" highlighted></user-card>

El selector :host aplica estilos al propio elemento. :host([highlighted]) responde a atributos. Los estilos dentro del Shadow DOM no afectan al resto de la página ni viceversa.

Ejemplo con Lit

Lit simplifica la autoría eliminando el boilerplate del API nativa:

import { LitElement, html, css } from "lit";
import { property } from "lit/decorators.js";
 
class UserCard extends LitElement {
  static styles = css`
    :host { display: block; padding: 1rem; border: 1px solid #333; border-radius: 8px; }
    .name { font-weight: 600; }
    .role { color: #888; font-size: 0.875rem; }
  `;
 
  @property() name = "";
  @property() role = "";
 
  render() {
    return html`
      <span class="name">${this.name}</span>
      <span class="role">${this.role}</span>
    `;
  }
}
 
customElements.define("user-card", UserCard);

Lit añade reactividad declarativa, templates con tagged template literals y un sistema de propiedades tipado — todo en aproximadamente 5 KB.

Interoperabilidad con frameworks

FrameworkUso de Web ComponentsLimitaciones
ReactRequiere ref para propiedades complejas; eventos custom necesitan addEventListener manualReact 19 mejora el soporte con paso directo de propiedades
VueSoporte nativo con defineCustomElement; pasa propiedades y escucha eventos sin adaptadoresMínimas — Vue trata custom elements como ciudadanos de primera clase
AngularSoporte completo con CUSTOM_ELEMENTS_SCHEMA; binding bidireccional funcionaRequiere declarar el schema en el módulo
SveltePasa propiedades directamente; escucha eventos custom con on:Sin limitaciones significativas

La clave es que los Web Components usan atributos HTML (strings) y propiedades JavaScript (cualquier tipo). Los frameworks que distinguen entre ambos — como Vue y Svelte — tienen mejor interoperabilidad que los que tratan todo como atributos.

Cuándo usar

  • Componentes compartidos entre frameworks diferentes
  • Micro frontends con tecnologías mixtas
  • Design systems framework-agnostic
  • Widgets embebibles en sitios de terceros

Frameworks basados en Web Components

FrameworkAutorTamañoEnfoque
LitGoogle~5 KBReactivo, declarativo, mínimo boilerplate
StencilIonic~12 KBCompilador que genera Web Components estándar
FASTMicrosoft~8 KBDesign system adaptable, Fluent UI

Limitaciones

  • Shadow DOM y CSS externo: los estilos globales (Tailwind, CSS frameworks) no penetran el Shadow DOM — hay que usar CSS custom properties o ::part() para exponer puntos de estilización
  • SSR limitado: Declarative Shadow DOM existe pero el soporte en frameworks de SSR es incompleto; la hidratación requiere cuidado
  • Accesibilidad: el Shadow DOM puede romper la navegación con lectores de pantalla si no se gestionan correctamente los roles ARIA y el orden de foco
  • API verbosa: sin Lit u otro framework, el boilerplate para reactividad y templates es considerable

¿Por qué importa?

Los Web Components resuelven un problema que los frameworks no pueden: componentes que funcionan en cualquier contexto sin dependencias de runtime. Para design systems que deben servir a equipos con React, Vue y Angular simultáneamente, son la única opción que no fuerza una migración. El tradeoff es claro — más boilerplate y menos ergonomía que un framework, pero cero acoplamiento y compatibilidad garantizada por el navegador.

Referencias

  • Web Components — MDN — MDN, 2024. Documentación de referencia completa de los estándares.
  • Custom Elements Specification — WHATWG, 2024. Especificación oficial de Custom Elements en el HTML Living Standard.
  • Custom Elements v1 — web.dev — Google, 2024. Guía práctica de Custom Elements con ejemplos.
  • Lit — Google, 2024. Biblioteca ligera para crear Web Components con reactividad declarativa.
  • Using Shadow DOM — MDN — MDN, 2024. Guía de Shadow DOM para encapsulación de estilos y markup.

Contenido relacionado

  • Micro Frontends

    Patrón arquitectónico que extiende los microservicios al frontend, permitiendo que equipos independientes desarrollen y desplieguen partes de una aplicación web de forma autónoma.

  • Sistemas de Diseño

    Colección de componentes reutilizables, patrones y guías que aseguran consistencia visual y de interacción en productos digitales a escala.

  • React

    Biblioteca de JavaScript para construir interfaces de usuario mediante componentes declarativos y reutilizables, con un ecosistema que abarca desde SPAs hasta aplicaciones full-stack con Server Components.

  • Accesibilidad

    Práctica de diseñar y desarrollar productos digitales que puedan ser usados por todas las personas, incluyendo aquellas con discapacidades visuales, auditivas, motoras o cognitivas.

Conceptos