En el módulo anterior escribiste varias plantillas con la función html, pero siempre con contenido completamente fijo: el mismo título, el mismo estado, la misma persona asignada en cada renderizado. Ha llegado el momento de entender qué es realmente esa función html y, sobre todo, qué ocurre por dentro cuando su contenido deja de ser estático. Esta lección abre el módulo 2 explicando el mecanismo interno del motor de plantillas de Lit: cómo se analiza una plantilla, cómo se actualiza el DOM cuando cambian los datos, y por qué este enfoque es mucho más eficiente que las alternativas clásicas de manipular el DOM a mano o reconstruirlo con innerHTML.

Contenido

  1. html no es una plantilla de texto: es una función
  2. Tagged template literals: la base de html
  3. Cómo Lit sabe qué partes son dinámicas
  4. Actualizar el DOM sin un Virtual DOM
  5. Por qué esto es distinto (y mejor) que innerHTML
  6. Primera interpolación en <task-card>
  7. Importante: esto todavía no es reactividad completa

  1. html no es una plantilla de texto: es una función

Hasta ahora, cada vez que has escrito algo como esto:

render() {
  return html`
    <article>
      <h3>Preparar la demo del sprint</h3>
      <p>Estado: En curso</p>
    </article>
  `;
}

es fácil pensar en html\...`como si fuera simplemente una cadena de texto con HTML dentro, algo parecido a escribir"

...

". Esa intuición es razonable a primera vista, pero es incorrecta y esconde justo el mecanismo que hace que Lit sea rápido y práctico de usar. html` es, en realidad, una función de JavaScript, y lo que se le pasa entre los acentos graves no es una cadena normal, sino algo llamado tagged template literal ("plantilla de literal etiquetada"), una característica que forma parte del propio estándar de JavaScript desde hace años, sin ninguna dependencia de Lit.

Cuando el motor de JavaScript encuentra html\

Hola

`, no concatena texto y llama a htmlcon el resultado. En su lugar, invoca a la funciónhtmlcon información estructurada sobre la plantilla: por un lado, un array con los trozos de texto literal ("estáticos"), y por otro, los valores que se han interpolado dentro de${}` (si los hay). Esta distinción —trozos fijos por un lado, valores dinámicos por otro— es la pieza central de todo lo que hace especial al motor de plantillas de Lit.

  1. Tagged template literals: la base de html

Para entender bien qué hace html, es útil ver primero cómo funciona un tagged template literal con una función de ejemplo, sin Lit de por medio:

function miEtiqueta(trozos, ...valores) {
  console.log(trozos);   // ["Hola ", ", tienes ", " tareas"]
  console.log(valores);  // ["Ana", 3]
}

const nombre = 'Ana';
const numeroDeTareas = 3;

miEtiqueta`Hola ${nombre}, tienes ${numeroDeTareas} tareas`;

Al ejecutar este código, trozos recibe un array con los tres fragmentos de texto que quedan entre las interpolaciones ("Hola ", ", tienes " y " tareas"), mientras que valores recibe, en un array aparte, los dos valores interpolados ("Ana" y 3). Esta separación es exactamente lo que hace posible que una función etiquetada "sepa" qué partes de la plantilla son literales (nunca cambian) y cuáles son expresiones (pueden cambiar).

La función html de Lit es, en esencia, una función etiquetada de este mismo tipo, especializada en tratar el primer array como HTML y el segundo como datos que hay que insertar en puntos concretos de ese HTML. La diferencia respecto al ejemplo de miEtiqueta es que html no se limita a mostrar esos valores por consola: construye con ellos un objeto interno, llamado TemplateResult, que describe la plantilla de forma que Lit pueda procesarla de manera eficiente.

  1. Cómo Lit sabe qué partes son dinámicas

Aquí está la clave de todo el mecanismo. Como los trozos de texto literal siempre llegan por separado de los valores interpolados, Lit puede, la primera vez que ve una plantilla concreta, analizar únicamente su "esqueleto" fijo (los trozos de texto) y averiguar exactamente en qué posiciones del HTML van a aparecer valores dinámicos. Ese análisis se hace una sola vez por plantilla, no en cada renderizado.

El proceso, simplificado, es el siguiente:

  1. La primera vez que Lit encuentra una determinada plantilla html\...`(identificada internamente por sus trozos de texto fijos), construye un elemento