APIs de Web Components: esenciales para principiantes

APIs de Web Components: esenciales para principiantes

APIs de Web Components: esenciales para principiantes

Web components vs. React - LogRocket Blog

Los Web Components son un conjunto de tecnologías estandarizadas que permiten crear componentes web personalizados y reutilizables. Estas APIs facilitan estructurar el código y encapsular estilo/funcionalidad en piezas autónomas, mejorando el desarrollo web moderno. Entre las principales APIs de Web Components se encuentran Elementos personalizados (Custom Elements), Shadow DOM, Plantillas HTML y Módulos ES. A continuación explicamos cada una con su definición, funcionamiento, ventajas y un ejemplo en JavaScript puro.

Elementos Personalizados (Custom Elements)

Definición: Los Custom Elements permiten definir nuevas etiquetas HTML con comportamiento personalizado. Esto significa crear clases JavaScript que extienden HTMLElement (u otros elementos existentes) y registrarlas para usarlas en el HTML.

Funcionalidad: Para usar un elemento personalizado, se crea una clase en JS (por ejemplo, class MiElemento extends HTMLElement { ... }) y luego se registra con customElements.define('mi-elemento', MiElemento). El nombre de la etiqueta debe llevar al menos un guión. Una vez definido, se puede usar <mi-elemento></mi-elemento> en el HTML. El navegador instanciará la clase y ejecutará sus métodos de ciclo de vida (como constructor o connectedCallback).

Ventajas:

  • Permiten reutilizar código y HTML de forma semántica (por ejemplo <mi-boton>)

  • Encapsulan la funcionalidad en una clase, facilitando mantenimiento y lectura

  • Fomentan la consistencia al poder distribuir y documentar etiquetas propias

  • Al ser parte del estándar Web, funcionan nativamente en navegadores modernos sin dependencias externas

Ejemplo práctico: Creamos un elemento personalizado que muestra un saludo sencillo.

				
					class MiSaludo extends HTMLElement {
  constructor() {
    super();
    // Insertamos contenido HTML dentro del elemento
    this.innerHTML = '<p>¡Hola, mundo desde un elemento personalizado!</p>';
  }
}
// Registramos el elemento con un nombre en kebab-case
customElements.define('mi-saludo', MiSaludo);

				
			

Luego, en el HTML se puede usar: <mi-saludo></mi-saludo>. Al agregar este tag al documento, se ejecuta el constructor de la clase y se muestra el mensaje. ¡Así de fácil creas tu propia etiqueta HTML!

Shadow DOM (DOM de Sombra)

Definición: El Shadow DOM es una API que permite asociar a un elemento un árbol DOM encapsulado (llamado shadow root). Este árbol “sombra” está separado del DOM principal, de modo que su contenido y estilos no afectan ni son afectados por el resto del documento.

Funcionalidad: En la clase de un elemento personalizado, se llama a this.attachShadow({ mode: 'open' }) en el constructor para crear el shadow DOM. Después, se pueden agregar hijos, estilos y scripts al shadowRoot resultante. Por ejemplo:

				
					class CajaSombra extends HTMLElement {
  constructor() {
    super();
    // Creamos un Shadow Root aislado en modo abierto
    const shadow = this.attachShadow({ mode: 'open' });
    shadow.innerHTML = `
      <style>
        /* Estilo encapsulado que no afectará a la página principal */
        p { color: blue; font-weight: bold; }
      </style>
      <p>Texto dentro del Shadow DOM</p>
    `;
  }
}
customElements.define('caja-sombra', CajaSombra);
				
			

En el HTML: <caja-sombra></caja-sombra>. Este elemento mostrará un párrafo azul, y ese estilo solo afecta al contenido interno de su shadow DOM.

Ventajas:

  • Aislamiento de estilos: El CSS en el shadow DOM no filtra al resto de la página, evitando choques de nombres o resetear estilos globales.

  • Privacidad de implementación: Se pueden ocultar detalles internos (estructura/estilos) y exponer solo la interfaz pública del componente.

  • Componentes autocontenidos: Facilita la creación de widgets independientes que funcionan igual en cualquier página.

Plantillas HTML (<template>)

Definición: Las Plantillas HTML usan el elemento <template> de HTML. Dentro de <template> se escribe contenido (HTML, CSS, etc.) que no se renderiza al cargar la página. En vez de mostrarse, sirve como modelo para clonar su contenido mediante JavaScript cuando se necesite.

Funcionalidad: Al definir un <template id="miPlantilla">…</template> en el HTML, su contenido queda disponible en el DOM (document.getElementById('miPlantilla').content), pero sin mostrarse. Con JS, se puede clonar ese contenido (template.content.cloneNode(true)) y luego insertarlo donde se desee. Esto permite crear dinámicamente elementos basados en un modelo prediseñado.

Ventajas:

  • Permite reutilizar bloques de HTML múltiples veces sin tener que escribirlo de nuevo

  • Mantiene el código más limpio al separar la definición de la plantilla del lugar donde se inserta

  • Puede incluir estilos internos al clonarse, mejorando consistencia visual

  • Mejora el rendimiento al evitar parsear repetidamente el HTML; se clona del elemento ya cargado

Ejemplo práctico: Creamos una lista dinámica usando una plantilla:

				
					<template id="item-template">
  <li class="item">Elemento de lista</li>
</template>

<ul id="mi-lista"></ul>

<script>
  const ul = document.getElementById('mi-lista');
  const template = document.getElementById('item-template');
  // Clonamos el contenido del template
  const clone = template.content.cloneNode(true);
  // (Opcional) Modificamos el texto del elemento clonado
  clone.querySelector('.item').textContent = 'Elemento generado por Template';
  // Insertamos el elemento clonado en la lista
  ul.appendChild(clone);
</script>
				
			

En este caso, el <li> se crea a partir del template cada vez que se ejecuta el script, sin repetir manualmente el HTML en el documento principal.

Módulos ES (ES Modules)

Definición: Los Módulos ES son la forma estándar de estructurar código JavaScript en archivos separados. Usan las instrucciones export y import para compartir funciones, clases o variables entre archivos. Modernos navegadores cargan estos módulos con <script type="module">.

Funcionalidad: Para crear un módulo, se pone export delante de funciones o constantes en un archivo JavaScript (por ejemplo, export function saludar() { ... }). En otro archivo se usa import { saludar } from './miModulo.js'; para acceder a esos elementos exportados. El navegador carga cada módulo solo una vez y los importa de manera asíncrona pero ordenada.

Ventajas:

  • Mantenibilidad: Facilita organizar el código en partes lógicas (un archivo por componente o utilidad).

  • Reutilización: Permite usar código compartido en diferentes páginas sin copiar/pegar.

  • Ámbito local: Evita contaminar el espacio global de JavaScript; todo queda dentro del módulo.

  • Compatibilidad nativa: Los navegadores modernos entienden los módulos sin necesidad de herramientas extra.

Ejemplo práctico: Supongamos dos archivos, uno exporta una función y otro la importa:

				
					// archivo math.js
export function sumar(a, b) {
  return a + b;
}

// archivo main.js
import { sumar } from './math.js';
console.log(sumar(5, 7)); // Imprime 12 en la consola

				
			

Conclusión

En resumen, las APIs de Web Components permiten crear elementos web personalizados y modulables de forma nativa. Los Elementos personalizados nos dan la capacidad de definir nuevas etiquetas HTML con comportamiento propio. El Shadow DOM encapsula el marcado y los estilos de cada componente, evitando conflictos con el resto de la página. Las Plantillas HTML facilitan reutilizar fragmentos de HTML mediante JavaScript. Y los Módulos ES organizan el código en archivos independientes, mejorando la mantenibilidad. Juntas, estas tecnologías permiten un desarrollo web más ordenado, escalable y limpio. Te animamos a practicar creando tus propios componentes: ¡aplica estas APIs en proyectos reales y potencia tus habilidades en desarrollo web!

Links de referencia:

Facebook
X
LinkedIn
Reddit
Pinterest
Threads

Post relacionados

Post recientes

Search