DEV Community

Cover image for Web Components nativos: cuándo usarlos en lugar de frameworks
Joaquin Sáez
Joaquin Sáez

Posted on • Originally published at code.webgae.com

Web Components nativos: cuándo usarlos en lugar de frameworks

En el ecosistema del desarrollo web moderno, los frameworks como React, Vue y Angular dominan el panorama. Sin embargo, existe una alternativa nativa del navegador que merece más atención: los Web Components. En este artículo exploraremos qué son, cómo funcionan y, lo más importante, cuándo tiene sentido usarlos en lugar de un framework completo.

¿Qué son los Web Components?

Los Web Components son un conjunto de APIs nativas del navegador que permiten crear elementos HTML personalizados, reutilizables y encapsulados. Se componen de tres tecnologías principales:

Custom Elements: Permiten definir nuevas etiquetas HTML con comportamiento personalizado.

Shadow DOM: Proporciona encapsulación de estilos y estructura, evitando conflictos con el resto de la página.

HTML Templates: Ofrecen fragmentos de HTML que no se renderizan hasta que se utilizan explícitamente.

Ejemplo básico de un Web Component

class MiBoton extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
  }

  connectedCallback() {
    this.shadowRoot.innerHTML = `
      <style>
        button {
          background: #007bff;
          color: white;
          border: none;
          padding: 10px 20px;
          border-radius: 4px;
          cursor: pointer;
          font-size: 16px;
        }
        button:hover {
          background: #0056b3;
        }
      </style>
      <button>
        <slot>Click me</slot>
      </button>
    `;

    this.shadowRoot.querySelector('button').addEventListener('click', () => {
      this.dispatchEvent(new CustomEvent('mi-click', {
        bubbles: true,
        composed: true
      }));
    });
  }
}

customElements.define('mi-boton', MiBoton);
Enter fullscreen mode Exit fullscreen mode

Uso:

<mi-boton>Enviar formulario</mi-boton>
Enter fullscreen mode Exit fullscreen mode

Ventajas de los Web Components

Sin dependencias: No necesitas instalar paquetes npm ni configurar bundlers. Todo funciona directamente en el navegador.

Interoperabilidad: Puedes usar Web Components con cualquier framework o sin ninguno. Son verdaderamente agnósticos.

Encapsulación real: El Shadow DOM garantiza que tus estilos no se filtren hacia fuera ni sean afectados por CSS externo.

Estándar web: Al ser parte del estándar HTML, tienen soporte nativo y longevidad garantizada.

Rendimiento: Sin capa de abstracción adicional, el rendimiento puede ser excelente para componentes simples.

Cuándo usar Web Components en lugar de frameworks

1. Bibliotecas de componentes compartidos

Si estás creando una biblioteca de componentes que será utilizada por múltiples equipos con diferentes stacks tecnológicos, los Web Components son ideales. Imagina un sistema de diseño corporativo que debe funcionar tanto en aplicaciones React como Angular o vanilla JavaScript.

// Un componente de tarjeta reutilizable
class CardComponent extends HTMLElement {
  static get observedAttributes() {
    return ['title', 'image'];
  }

  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
  }

  attributeChangedCallback(name, oldValue, newValue) {
    this.render();
  }

  render() {
    const title = this.getAttribute('title') || 'Sin título';
    const image = this.getAttribute('image') || '';

    this.shadowRoot.innerHTML = `
      <style>
        .card {
          border: 1px solid #ddd;
          border-radius: 8px;
          overflow: hidden;
          max-width: 300px;
        }
        img {
          width: 100%;
          height: 200px;
          object-fit: cover;
        }
        .content {
          padding: 16px;
        }
      </style>
      <div class="card">
        ${image ? `<img src="${image}" alt="${title}">` : ''}
        <div class="content">
          <h3>${title}</h3>
          <slot></slot>
        </div>
      </div>
    `;
  }

  connectedCallback() {
    this.render();
  }
}

customElements.define('ui-card', CardComponent);
Enter fullscreen mode Exit fullscreen mode

2. Microfrontends

Cuando diferentes partes de una aplicación están desarrolladas por equipos independientes con tecnologías distintas, los Web Components actúan como un puente perfecto. Cada equipo puede desarrollar su sección como un componente autónomo.

3. Widgets embebibles

Si necesitas crear un widget que terceros puedan insertar en sus páginas con una simple línea de código (como un chat de soporte, un reproductor de video o un formulario de contacto), los Web Components son la solución ideal.

<!-- Los usuarios solo necesitan esto -->
<script src="https://tudominio.com/chat-widget.js"></script>
<chat-widget api-key="tu-clave"></chat-widget>
Enter fullscreen mode Exit fullscreen mode

4. Proyectos sin compilación

Para sitios web simples, landing pages o prototipos donde no quieres la complejidad de configurar webpack, Vite o similar, los Web Components permiten modularidad sin herramientas de build.

5. Mejoras progresivas

Cuando trabajas con aplicaciones server-side tradicionales (PHP, Rails, Django) y solo necesitas agregar interactividad en áreas específicas sin adoptar un SPA completo.

<!-- En tu HTML tradicional -->
<producto-rating product-id="123" score="4.5"></producto-rating>
Enter fullscreen mode Exit fullscreen mode

6. Componentes de bajo nivel altamente reutilizables

Para elementos UI fundamentales como tabs, accordions, modales o tooltips que usarás en múltiples proyectos, crear Web Components nativos puede ser más sostenible a largo plazo que depender de una versión específica de un framework.

Cuándo NO usar Web Components

1. Aplicaciones complejas con gestión de estado

Si tu aplicación requiere gestión de estado compleja, routing sofisticado o manejo de formularios avanzado, frameworks como React o Vue ofrecen ecosistemas maduros con soluciones probadas.

2. Necesitas un ecosistema robusto

Los frameworks tienen librerías, herramientas de debugging, extensiones de navegador y comunidades enormes. Los Web Components tienen un ecosistema más limitado.

3. Desarrollo rápido con convenciones establecidas

Frameworks como Next.js o Nuxt proporcionan convenciones, routing automático, SSR y muchas características que aceleran el desarrollo.

4. Proyectos con equipos familiarizados con un framework

Si tu equipo ya domina React y tiene componentes existentes, migrar a Web Components podría no aportar valor suficiente.

5. Necesitas soporte para navegadores antiguos

Aunque la compatibilidad ha mejorado mucho, si debes soportar IE11 u otros navegadores muy antiguos, necesitarás polyfills extensos que eliminarán muchas ventajas.

Híbrido: lo mejor de ambos mundos

Una estrategia inteligente es usar frameworks para la lógica de aplicación compleja y Web Components para piezas específicas que requieren máxima portabilidad:

// Componente React que usa un Web Component
function MiComponenteReact() {
  return (
    <div>
      <h1>Mi aplicación React</h1>
      <ui-card title="Tarjeta nativa" image="/imagen.jpg">
        Este contenido está en un Web Component nativo
      </ui-card>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

Frameworks modernos como Lit, Stencil o Svelte pueden compilar a Web Components, ofreciendo developer experience mejorada con el output de componentes nativos.

Consideraciones prácticas

Soporte de navegadores: Los Web Components tienen excelente soporte en navegadores modernos (Chrome, Firefox, Safari, Edge). Para navegadores antiguos existen polyfills.

SEO: El contenido en Shadow DOM puede presentar desafíos para SEO. Considera usar Declarative Shadow DOM para SSR o mantener contenido crítico fuera del Shadow DOM.

Accesibilidad: Debes manejar la accesibilidad manualmente. Los frameworks a menudo incluyen características de accesibilidad por defecto.

Testing: Las herramientas de testing para Web Components están menos maduras que las de frameworks populares, aunque están mejorando.

Conclusión

Los Web Components no reemplazan a los frameworks, sino que complementan el ecosistema del desarrollo web. Son especialmente valiosos cuando necesitas máxima portabilidad, interoperabilidad entre diferentes tecnologías o componentes sin dependencias externas.

La decisión entre Web Components y frameworks no debe ser binaria. Considera el contexto de tu proyecto, las necesidades de tu equipo y los requisitos específicos de tu aplicación. En muchos casos, una combinación estratégica de ambas tecnologías puede ofrecer los mejores resultados.

Los Web Components representan un futuro donde los componentes web son verdaderamente universales, funcionando en cualquier contexto sin fricciones. A medida que las herramientas y el ecosistema maduran, su adopción seguirá creciendo como una opción legítima y poderosa en el arsenal del desarrollador web moderno.

Top comments (0)