Estándares web nativos para crear componentes reutilizables y encapsulados que funcionan en cualquier framework o sin framework.
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.
Los Web Components se basan en tres especificaciones del W3C/WHATWG que trabajan juntas:
connectedCallback, disconnectedCallback, attributeChangedCallback)<template> y <slot> para contenido declarativo reutilizableclass 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.
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.
| Framework | Uso de Web Components | Limitaciones |
|---|---|---|
| React | Requiere ref para propiedades complejas; eventos custom necesitan addEventListener manual | React 19 mejora el soporte con paso directo de propiedades |
| Vue | Soporte nativo con defineCustomElement; pasa propiedades y escucha eventos sin adaptadores | Mínimas — Vue trata custom elements como ciudadanos de primera clase |
| Angular | Soporte completo con CUSTOM_ELEMENTS_SCHEMA; binding bidireccional funciona | Requiere declarar el schema en el módulo |
| Svelte | Pasa 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.
| Framework | Autor | Tamaño | Enfoque |
|---|---|---|---|
| Lit | ~5 KB | Reactivo, declarativo, mínimo boilerplate | |
| Stencil | Ionic | ~12 KB | Compilador que genera Web Components estándar |
| FAST | Microsoft | ~8 KB | Design system adaptable, Fluent UI |
::part() para exponer puntos de estilizaciónLos 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.
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.
Colección de componentes reutilizables, patrones y guías que aseguran consistencia visual y de interacción en productos digitales a escala.
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.
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.