El Product Manager ha muerto. Larga vida al Product Developer.
La persona que entra a la reunión con mockups de Figma diciendo 'construyan esto' se quedó sin camino. La IA redujo l...
8 min de lectura
17.02.2026, Por Stephan Schwab
Los navegadores modernos ahora soportan todo lo necesario para construir interfaces web sofisticadas y reactivas sin React, Vue o Angular. Web components, custom elements, shadow DOM y sistemas de eventos nativos permiten crear piezas de UI modulares y reutilizables que se comunican elegantemente — y los asistentes de IA pueden ayudarte a dominar estos patrones más rápido que nunca.
Algo notable sucedió mientras muchos desarrolladores no estaban mirando. La plataforma web misma se volvió capaz de hacer lo que los frameworks fueron inventados para hacer.
Los Custom Elements te permiten definir tus propias etiquetas HTML con su propio comportamiento. El Shadow DOM proporciona encapsulación que mantiene los estilos y la estructura de los componentes aislados. Los templates y slots ofrecen patrones de composición. Y quizás lo más importante, el sistema de eventos nativo proporciona un mecanismo robusto para que los componentes se comuniquen sin acoplamiento estrecho.
Estas no son características experimentales. Se han estado distribuyendo en todos los navegadores principales durante años. La pregunta ya no es si funcionan, sino por qué más desarrolladores no las han adoptado.
Cada framework conlleva costos ocultos. Está la curva de aprendizaje inicial, ciertamente. Pero también está la carga de mantenimiento continuo: actualizaciones de versiones mayores que rompen cosas, patrones obsoletos de los que debes migrar, herramientas de build que necesitan actualización constante.
Los web components construidos sobre estándares de plataforma evitan esto por completo. Los proveedores de navegadores se han comprometido con la compatibilidad hacia atrás de maneras que los mantenedores de frameworks simplemente no pueden. El código escrito según estándares web hace una década todavía funciona hoy. Eso no es cierto para código escrito para Angular 1, componentes de clase de React, o la API de opciones de Vue 2.
Para organizaciones que construyen productos que necesitan funcionar durante años, esta estabilidad importa enormemente. Es una cosa menos que puede romperse, una dependencia menos que puede convertirse en una vulnerabilidad de seguridad, una capa de abstracción menos entre tu código y el tiempo de ejecución.
La elegancia de los web components se hace más aparente cuando consideras cómo se comunican. El sistema nativo de Custom Events proporciona todo lo que necesitas para interacción sofisticada entre componentes.
Un componente profundo en tu jerarquía de UI puede emitir un evento que burbujea hacia arriba a través del árbol DOM:
this.dispatchEvent(new CustomEvent('item-selected', {
detail: { itemId: this.selectedId, metadata: this.itemData },
bubbles: true,
composed: true
}));
Cualquier componente ancestro — o el contenedor de la aplicación — puede escuchar y responder a ese evento. No hay necesidad de un store de estado global, no hay prop drilling, no hay context providers. El DOM mismo se convierte en tu infraestructura de comunicación.
Los componentes también pueden comunicarse hacia abajo a través de atributos y propiedades. Cuando un padre cambia un atributo, el attributeChangedCallback del hijo se dispara, dándole la oportunidad de responder. Para datos más complejos, las propiedades permiten pasar objetos y arrays directamente.
Esto crea un flujo natural y predecible: datos hacia abajo a través de propiedades y atributos, eventos hacia arriba a través del sistema de burbujeo. Es el mismo patrón que React popularizó, pero usando estándares web en lugar de abstracciones de biblioteca.
Aquí hay algo que sorprende a muchos desarrolladores: no necesitas dominar cada detalle de la especificación de Web Components antes de poder construir cosas útiles. Los fundamentos son notablemente accesibles.
Un custom element mínimo se ve así:
class TaskCard extends HTMLElement {
connectedCallback() {
this.innerHTML = `
<div class="task">
<h3>${this.getAttribute('title')}</h3>
<p>${this.getAttribute('description')}</p>
</div>
`;
}
}
customElements.define('task-card', TaskCard);
Ese es un componente funcional. No está listo para producción — le falta reactividad, encapsulación y manejo apropiado del ciclo de vida — pero demuestra cuán accesible es el punto de entrada. Puedes iterar desde este comienzo simple hacia implementaciones más sofisticadas a medida que tu comprensión crece.
Aquí es donde los asistentes de IA modernos transforman la experiencia de aprendizaje. Puedes describir lo que quieres que haga un componente, recibir una implementación funcional, y luego hacer preguntas sobre las partes que no entiendes. La IA puede explicar por qué composed: true importa para eventos que necesitan cruzar límites de shadow DOM. Puede mostrarte la diferencia entre connectedCallback y constructor. Puede ayudarte a refactorizar hacia mejores patrones a medida que tus requisitos evolucionan.
No necesitas leer toda la documentación de MDN sobre Web Components antes de construir tu primer componente real. En su lugar, puedes aprender haciendo, con un compañero de IA que entiende la especificación profundamente y puede responder preguntas en contexto.
Este enfoque — construir primero, entender profundamente después — funciona notablemente bien con estándares web. Los patrones son más simples que los patrones de framework porque hay menos abstracción. Cuando algo no funciona, el ámbito de búsqueda es más reducido. Cuando quieres entender por qué algo funciona, hay menos capas que desentrañar.
Considera un escenario realista: un dashboard con múltiples paneles independientes que necesitan responder a un filtro compartido.
Sin frameworks, podrías estructurar esto con una arquitectura simple dirigida por eventos:
// FilterPanel emite evento cuando los criterios cambian
this.dispatchEvent(new CustomEvent('filters-changed', {
detail: { dateRange: this.selectedRange, categories: this.selectedCategories },
bubbles: true
}));
// El contenedor del dashboard escucha y transmite a los hijos
document.addEventListener('filters-changed', (e) => {
document.querySelectorAll('[data-filterable]').forEach(panel => {
panel.applyFilters(e.detail);
});
});
Cada componente de panel implementa su propio método applyFilters. Los paneles no saben unos de otros. El componente de filtro no sabe sobre los paneles. El contenedor del dashboard proporciona coordinación mínima. Los componentes pueden desarrollarse, probarse y reutilizarse independientemente.
Este mismo patrón escala. A medida que agregas más paneles, simplemente implementan la interfaz esperada. A medida que agregas más tipos de eventos, la lógica de coordinación crece proporcionalmente, no exponencialmente.
Uno de los beneficios más prácticos de los web components es la encapsulación del shadow DOM. Los estilos de tu componente no se filtran hacia afuera, y los estilos globales no se filtran hacia adentro (a menos que lo permitas explícitamente).
class StyledCard extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
this.shadowRoot.innerHTML = `
<style>
.card { padding: 1rem; border-radius: 8px; background: #f5f5f5; }
h3 { margin: 0 0 0.5rem 0; color: #333; }
</style>
<div class="card">
<h3><slot name="title"></slot></h3>
<slot></slot>
</div>
`;
}
}
Esos estilos afectan solo a este componente. Puedes usar nombres de clase simples y semánticos sin preocuparte por colisiones. Puedes refactorizar estilos sin miedo de romper algo en otro lugar.
Esta es encapsulación que realmente encapsula. Es lo que CSS Modules, CSS-in-JS, BEM y otros incontables enfoques han intentado lograr — construido directamente en la plataforma.
Los web components no siempre son la elección correcta. Si tu equipo ya conoce React profundamente y se mueve rápido con él, hay valor real en esa experiencia compartida. Si estás construyendo algo que será mantenido por desarrolladores que esperan patrones de framework, los web components podrían crear fricción.
Para proyectos nuevos, sin embargo — especialmente equipos más pequeños o desarrolladores individuales construyendo productos que necesitan funcionar durante años — los web components merecen consideración seria. La complejidad reducida, estabilidad mejorada y tamaños de bundle más pequeños crean ventajas reales.
Y hay un camino híbrido interesante: muchos frameworks ahora funcionan bien con web components. Puedes introducir custom elements gradualmente en una aplicación React o Vue existente. Puedes envolver web components en bindings específicos de framework. La migración puede ser incremental en lugar de revolucionaria.
El camino para construir con web components es sorprendentemente corto:
Construir un componente simple. Algo con un template, quizás un atributo o dos. Ver cómo se monta en el DOM.
Agregar interactividad. Manejar eventos dentro del componente. Actualizar el DOM en respuesta. Experimentar la directez de trabajar sin abstracción de DOM virtual.
Implementar comunicación. Hacer que un componente emita un custom event. Hacer que otro escuche. Sentir cuán naturalmente el sistema de eventos maneja la coordinación de componentes.
Encapsular con shadow DOM. Agregar estilos con alcance. Usar slots para composición. Apreciar cómo la encapsulación simplifica tu modelo mental.
Iterar y expandir. Construir más componentes. Dejar que la IA ayude cuando encuentres territorio desconocido. Aprender los callbacks del ciclo de vida cuando los necesites.
Cada paso enseña algo útil. Cada componente que construyes agrega a tu comprensión. Y a diferencia del conocimiento de frameworks que podría volverse obsoleto, tu comprensión de la plataforma web se acumulará durante años.
Estamos en un momento interesante. La plataforma ha alcanzado — y en algunos aspectos superado — las capacidades que hicieron esenciales a los frameworks hace una década. Las herramientas existen. El soporte de navegadores es universal. Los patrones están bien documentados.
Lo que ha faltado es impulso. Los desarrolladores gravitan hacia lo que es popular, y los frameworks han dominado la mentalidad durante tanto tiempo que muchos nunca evaluaron seriamente la alternativa.
Pero las tendencias cambian. La complejidad del ecosistema JavaScript se ha convertido en un problema reconocido. El atractivo de fundamentos más simples y estables crece a medida que los desarrolladores se cansan del cambio constante. Los asistentes de IA hacen que aprender nuevos enfoques sea más rápido y menos intimidante.
Los web components ofrecen algo valioso: una manera de construir interfaces modernas y sofisticadas con tecnología que seguirá funcionando dentro de décadas. Para desarrolladores dispuestos a explorar más allá del mainstream de frameworks, hay un camino más tranquilo y elegante esperando.
Las herramientas están listas. Los navegadores están listos. Quizás es hora de redescubrir lo que la plataforma web puede hacer.
Hablemos de tu situación real. ¿Quieres acelerar la entrega, quitar bloqueos técnicos o validar si una idea merece más inversión? Escucho tu contexto y te doy 1-2 recomendaciones prácticas. Sin compromiso ni discurso comercial. Confidencial y directo.
Empecemos a trabajar juntos