Volver al blog

Lit HTML

Introducción a Lit HTML: Creando Interfaces Web Modernas

Descubre Lit HTML, una librería ligera de Google para crear componentes web reutilizables. Aprende a construir interfaces modernas y eficientes con esta tecnología del futuro.

Alberto Guaman enero 15, 2025 12 min de lectura
Compartir

4

Categorías

8

Etiquetas

Temas

Lit HTML Web Components JavaScript Frontend
Introducción a Lit HTML: Creando Interfaces Web Modernas

¿Buscas una alternativa ligera a React o Vue?
¡lit-html te permite crear interfaces dinámicas con JavaScript vanilla!


¿Qué es lit-html?

lit-html es una librería de Google que permite crear interfaces web dinámicas usando JavaScript vanilla y template literals. Es la base del framework Lit, pero puedes usarla de forma independiente para crear componentes ligeros y eficientes.

Características principales:

  • Ligero: Solo ~5KB minificado y gzipped
  • Rápido: Renderizado eficiente con actualizaciones incrementales
  • Moderno: Usa template literals nativos de JavaScript
  • Interoperable: Funciona con cualquier librería o framework
  • Sin build: No necesitas transpilación ni bundling

¿Por qué elegir lit-html?

Ventajas principales:

  • Tamaño mínimo: Ideal para proyectos donde el tamaño importa
  • Curva de aprendizaje suave: Si conoces JavaScript, ya sabes lit-html
  • Sin dependencias: No necesitas un ecosistema completo
  • Rendimiento: Actualizaciones eficientes solo donde cambia el DOM
  • Flexibilidad: Se integra fácilmente con otras librerías

Casos de uso ideales:

  • Micro-frontends
  • Widgets ligeros
  • Aplicaciones pequeñas a medianas
  • Prototipos rápidos
  • Componentes reutilizables

Instalación y configuración

1. Instalación básica

npm install lit-html

2. Importación en tu proyecto

import { html, render } from 'lit-html';

3. Configuración para desarrollo (opcional)

Si quieres usar ES modules en el navegador directamente:

<!DOCTYPE html>
<html>
<head>
    <script type="module">
        import { html, render } from 'https://unpkg.com/lit-html@3.1.0/lit-html.js?module';
    </script>
</head>
<body>
    <div id="app"></div>
</body>
</html>

Conceptos fundamentales

1. Template literals con html

lit-html usa template literals marcados con la función html:

import { html, render } from 'lit-html';

const template = html`
  <h1>¡Hola, lit-html!</h1>
  <p>Este es mi primer template dinámico</p>
`;

render(template, document.getElementById('app'));

2. Expresiones dinámicas

Puedes insertar JavaScript directamente en tus templates:

const nombre = 'María';
const edad = 25;

const template = html`
  <div>
    <h2>Perfil de ${nombre}</h2>
    <p>Edad: ${edad} años</p>
    <p>Es mayor de edad: ${edad >= 18 ? 'Sí' : 'No'}</p>
  </div>
`;

render(template, document.getElementById('app'));

3. Atributos dinámicos

const url = 'https://ejemplo.com';
const clase = 'btn btn-primary';

const template = html`
  <a href="${url}" class="${clase}">
    Enlace dinámico
  </a>
`;

Renderizado y actualizaciones

Renderizado inicial

import { html, render } from 'lit-html';

function miComponente(datos) {
  return html`
    <div class="card">
      <h3>${datos.titulo}</h3>
      <p>${datos.descripcion}</p>
    </div>
  `;
}

// Renderizado inicial
const datos = { titulo: 'Mi título', descripcion: 'Mi descripción' };
render(miComponente(datos), document.getElementById('app'));

Actualizaciones eficientes

lit-html solo actualiza las partes que cambian:

// Actualizar solo los datos
datos.titulo = 'Nuevo título';
render(miComponente(datos), document.getElementById('app'));
// Solo se actualiza el h3, no todo el componente

Directivas avanzadas

1. repeat() - Listas eficientes

import { html, render } from 'lit-html';
import { repeat } from 'lit-html/directives/repeat.js';

const usuarios = [
  { id: 1, nombre: 'Ana' },
  { id: 2, nombre: 'Carlos' },
  { id: 3, nombre: 'Elena' }
];

const template = html`
  <ul>
    ${repeat(usuarios, (usuario) => usuario.id, (usuario) => html`
      <li>${usuario.nombre}</li>
    `)}
  </ul>
`;

2. when() - Renderizado condicional

import { html, render } from 'lit-html';
import { when } from 'lit-html/directives/when.js';

const estaCargando = true;

const template = html`
  ${when(estaCargando, 
    () => html`<div>Cargando...</div>`,
    () => html`<div>Contenido cargado</div>`
  )}
`;

3. classMap() - Clases dinámicas

import { html, render } from 'lit-html';
import { classMap } from 'lit-html/directives/class-map.js';

const clases = {
  'btn': true,
  'btn-primary': true,
  'btn-disabled': false
};

const template = html`
  <button class=${classMap(clases)}>
    Botón dinámico
  </button>
`;

Eventos y interactividad

Manejo de eventos

function miComponente() {
  const handleClick = (e) => {
    console.log('Botón clickeado!');
  };

  const handleInput = (e) => {
    console.log('Valor:', e.target.value);
  };

  return html`
    <div>
      <button @click=${handleClick}>
        Haz clic aquí
      </button>
      <input @input=${handleInput} placeholder="Escribe algo...">
    </div>
  `;
}

Estado local

let contador = 0;

function componenteContador() {
  const incrementar = () => {
    contador++;
    render(componenteContador(), document.getElementById('app'));
  };

  return html`
    <div>
      <h3>Contador: ${contador}</h3>
      <button @click=${incrementar}>Incrementar</button>
    </div>
  `;
}

Ejemplo práctico: Lista de tareas

import { html, render } from 'lit-html';

// Estado de la aplicación
let tareas = [
  { id: 1, texto: 'Aprender lit-html', completada: false },
  { id: 2, texto: 'Crear un proyecto', completada: true }
];

// Funciones de manejo
function agregarTarea() {
  const input = document.getElementById('nueva-tarea');
  const texto = input.value.trim();
  
  if (texto) {
    tareas.push({
      id: Date.now(),
      texto,
      completada: false
    });
    input.value = '';
    renderizarApp();
  }
}

function toggleTarea(id) {
  const tarea = tareas.find(t => t.id === id);
  if (tarea) {
    tarea.completada = !tarea.completada;
    renderizarApp();
  }
}

function eliminarTarea(id) {
  tareas = tareas.filter(t => t.id !== id);
  renderizarApp();
}

// Componente principal
function appTareas() {
  return html`
    <div class="todo-app">
      <h1>Lista de Tareas</h1>
      
      <div class="agregar-tarea">
        <input 
          id="nueva-tarea" 
          placeholder="Nueva tarea..."
          @keyup=${(e) => e.key === 'Enter' && agregarTarea()}
        >
        <button @click=${agregarTarea}>Agregar</button>
      </div>
      
      <ul class="lista-tareas">
        ${tareas.map(tarea => html`
          <li class="tarea ${tarea.completada ? 'completada' : ''}">
            <input 
              type="checkbox" 
              .checked=${tarea.completada}
              @change=${() => toggleTarea(tarea.id)}
            >
            <span>${tarea.texto}</span>
            <button @click=${() => eliminarTarea(tarea.id)}>Eliminar</button>
          </li>
        `)}
      </ul>
      
      <p>Total: ${tareas.length} tareas</p>
    </div>
  `;
}

function renderizarApp() {
  render(appTareas(), document.getElementById('app'));
}

// Inicializar la aplicación
renderizarApp();

Integración con Web Components

lit-html se integra perfectamente con Web Components:

import { html, render } from 'lit-html';

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

  connectedCallback() {
    this.render();
  }

  render() {
    render(html`
      <style>
        :host {
          display: block;
          padding: 1rem;
          border: 1px solid #ccc;
        }
      </style>
      <div>
        <h3>Mi Componente Web</h3>
        <slot></slot>
      </div>
    `, this.shadowRoot);
  }
}

customElements.define('mi-componente', MiComponente);

Comparación con otros frameworks

Característicalit-htmlReactVueSvelte
Tamaño~5KB~42KB~34KB~12KB
Curva de aprendizajeBajaMediaBajaMedia
Build necesarioNo
SintaxisTemplate literalsJSXTemplateTemplate
RendimientoExcelenteBuenoBuenoExcelente

Mejores prácticas

1. Organización del código

// Separar lógica de presentación
function crearTemplate(datos) {
  return html`...`;
}

function manejarEventos() {
  // Lógica de eventos
}

function renderizar() {
  render(crearTemplate(datos), contenedor);
}

2. Reutilización de componentes

function boton(texto, onClick, variante = 'primary') {
  return html`
    <button 
      class="btn btn-${variante}"
      @click=${onClick}
    >
      ${texto}
    </button>
  `;
}

// Uso
const template = html`
  ${boton('Guardar', guardarDatos, 'success')}
  ${boton('Cancelar', cancelar, 'secondary')}
`;

3. Optimización de rendimiento

// Usar repeat para listas grandes
${repeat(items, item => item.id, item => html`...`)}

// Evitar re-renderizados innecesarios
const template = html`...`;
render(template, contenedor);
// Solo llamar render cuando los datos cambien

Debugging y herramientas

1. DevTools

Instala la extensión de Chrome para lit-html:

npm install -g lit-html-devtools

2. Logging de cambios

import { html, render } from 'lit-html';

// Wrapper para debugging
function renderWithLogging(template, container) {
  console.log('Renderizando template:', template);
  render(template, container);
}

Recursos útiles


Conclusión

lit-html es una excelente opción para crear interfaces web modernas sin el peso de un framework completo. Su simplicidad, rendimiento y flexibilidad lo hacen ideal para:

  • Proyectos pequeños a medianos
  • Micro-frontends
  • Prototipos rápidos
  • Componentes reutilizables
  • Aplicaciones donde el tamaño importa

¿Listo para crear interfaces web ligeras y eficientes?
¡Con lit-html, tienes el poder de React sin la complejidad!

Testimonios

Qué dicen nuestros clientes

Comentarios reales de negocios que ya trabajaron con nosotros en web, sistemas y apps.

Excelente

23 reseñas · Trustindex

Excelente profesional, rápido y amable en todo el proceso de lo que necesitas crear.

RM

Raúl M****

13 ago 2024

Tinguar es una empresa de diseño web de primer nivel que superó todas mis expectativas. La calidad de su trabajo es impecable.

BG

Bryan G****

22 feb 2024

Excelente servicio, me ayudo con mi pagina EEUU. Lo recomiendo 100%.

JL

Jorge L****

26 abr 2024

Excelente servicio, me realizo la pagina web y va de maravilla. Recomendable.

DJ

Daniel J****

4 mar 2024

Excelente servicio y atención, recomendado llevo años con esta empresa y son muy profesionales.

AA

Adrian A****

6 jun 2023

El gerente excelente profesional, realizó nuestra página para el centro pre universitario.. 10 / 10

CL

Carranza L****

2 sept 2023

Increíble trabajo, muy profesional y puntual. Mi sitio web quedó perfecto.

MG

María G****

15 ene 2024

Excelente atención al cliente y resultados sobresalientes. Altamente recomendado.

CR

Carlos R****

20 may 2024

Trabajo de calidad superior, entregaron antes de lo esperado. Muy satisfecho.

AM

Ana M****

18 mar 2024

Profesionales de primera, entendieron perfectamente lo que necesitaba.

LF

Luis F****

10 jun 2024

Servicio excepcional, comunicación clara y resultados excelentes.

PS

Patricia S****

5 abr 2024

Equipo muy competente, transformaron mi idea en una realidad digital increíble.

RT

Roberto T****

22 jul 2024

Pedí un POS para mi tienda y al final me ayudaron hasta con el ticket de la impresora térmica. Antes tenía todo en cuaderno jaja.

KE

Karina E****

11 feb 2025

La verdad se demoraron un poquito al inicio pero me avisaron. La web quedó bien y me enseñaron a subir productos yo mismo.

Miguel Á****

3 may 2025

Buscaba algo para controlar renovaciones de streaming y ya no pelear con Excel. Me salió mucho más ordenado de lo que imaginaba.

DC

Diego C****

19 ago 2025

Hicieron la página de mi consultorio. Nada exagerado, limpia y fácil de leer. Mis pacientes ahora agendan por WhatsApp sin problema.

VA

Verónica A****

28 nov 2024

Lo bueno es que contestan. Uno escribe a las 9 de la noche y al día siguiente ya tienen avance. Yo soy de Cuenca y todo fue remoto.

EM

Esteban M****

17 ene 2025

Nos armó un panel chiquito para el inventario de 2 locales. No es un monstruo de software, es justo lo que necesitábamos.

PR

Paola R****

9 mar 2025

Me hicieron landing de un curso online. En 2 semanas ya tenía formulario y pagos. Precio razonable frente a otras cotizaciones.

AV

Andrés V****

14 sept 2024

Había trabajado con otro provider y me dejaron botado. Aquí por lo menos explican qué están haciendo y por qué.

SN

Sofía N****

21 jun 2025

App android para mi equipo de ventas. Falló un detalle al principio, lo corrigieron el mismo viernes. Eso me convenció.

HZ

Héctor Z****

2 abr 2025

No soy técnica, solo quería una web seria para mi marca de ropa. Me guiaron sin hablar en código y quedó linda.

CO

Camila O****

8 jul 2025

Llevo el hosting con ellos desde el 2023. Si algo se cae, avisan. Eso vale oro cuando uno vende online.

JM

Jaime M****

25 sept 2025

Excelente profesional, rápido y amable en todo el proceso de lo que necesitas crear.

RM

Raúl M****

13 ago 2024

Tinguar es una empresa de diseño web de primer nivel que superó todas mis expectativas. La calidad de su trabajo es impecable.

BG

Bryan G****

22 feb 2024

Excelente servicio, me ayudo con mi pagina EEUU. Lo recomiendo 100%.

JL

Jorge L****

26 abr 2024

Excelente servicio, me realizo la pagina web y va de maravilla. Recomendable.

DJ

Daniel J****

4 mar 2024

Excelente servicio y atención, recomendado llevo años con esta empresa y son muy profesionales.

AA

Adrian A****

6 jun 2023

El gerente excelente profesional, realizó nuestra página para el centro pre universitario.. 10 / 10

CL

Carranza L****

2 sept 2023

Increíble trabajo, muy profesional y puntual. Mi sitio web quedó perfecto.

MG

María G****

15 ene 2024

Excelente atención al cliente y resultados sobresalientes. Altamente recomendado.

CR

Carlos R****

20 may 2024

Trabajo de calidad superior, entregaron antes de lo esperado. Muy satisfecho.

AM

Ana M****

18 mar 2024

Profesionales de primera, entendieron perfectamente lo que necesitaba.

LF

Luis F****

10 jun 2024

Servicio excepcional, comunicación clara y resultados excelentes.

PS

Patricia S****

5 abr 2024

Equipo muy competente, transformaron mi idea en una realidad digital increíble.

RT

Roberto T****

22 jul 2024

Pedí un POS para mi tienda y al final me ayudaron hasta con el ticket de la impresora térmica. Antes tenía todo en cuaderno jaja.

KE

Karina E****

11 feb 2025

La verdad se demoraron un poquito al inicio pero me avisaron. La web quedó bien y me enseñaron a subir productos yo mismo.

Miguel Á****

3 may 2025

Buscaba algo para controlar renovaciones de streaming y ya no pelear con Excel. Me salió mucho más ordenado de lo que imaginaba.

DC

Diego C****

19 ago 2025

Hicieron la página de mi consultorio. Nada exagerado, limpia y fácil de leer. Mis pacientes ahora agendan por WhatsApp sin problema.

VA

Verónica A****

28 nov 2024

Lo bueno es que contestan. Uno escribe a las 9 de la noche y al día siguiente ya tienen avance. Yo soy de Cuenca y todo fue remoto.

EM

Esteban M****

17 ene 2025

Nos armó un panel chiquito para el inventario de 2 locales. No es un monstruo de software, es justo lo que necesitábamos.

PR

Paola R****

9 mar 2025

Me hicieron landing de un curso online. En 2 semanas ya tenía formulario y pagos. Precio razonable frente a otras cotizaciones.

AV

Andrés V****

14 sept 2024

Había trabajado con otro provider y me dejaron botado. Aquí por lo menos explican qué están haciendo y por qué.

SN

Sofía N****

21 jun 2025

App android para mi equipo de ventas. Falló un detalle al principio, lo corrigieron el mismo viernes. Eso me convenció.

HZ

Héctor Z****

2 abr 2025

No soy técnica, solo quería una web seria para mi marca de ropa. Me guiaron sin hablar en código y quedó linda.

CO

Camila O****

8 jul 2025

Llevo el hosting con ellos desde el 2023. Si algo se cae, avisan. Eso vale oro cuando uno vende online.

JM

Jaime M****

25 sept 2025

Contacto

Cuéntanos tu proyecto

Respuesta rápida. Te orientamos el siguiente paso sin rodeos.

Envíanos un mensaje

WhatsApp directo

Se abre WhatsApp con tu mensaje listo. Sin spam ni formularios opacos.

<24h

Respuesta

Diagnóstico

Sin costo

EC

Base

LATAM

Cobertura

Canales

WhatsApp

+593 99 860 2204

Email

contacto@tinguar.com

Ubicación

Santo Domingo · Shushufindi
Ecuador · atención remota LATAM

¡Comunicate por WhatsApp !