Lightweight Library

Preact

Preact es una alternativa de 3kB a React con la misma API moderna. Mismos componentes, mismos hooks, una fracción del tamaño; ideal cuando cada kilobyte cuenta.

intermediate12 min readUpdated 15 sept 2026
Counter.jsx
jsx
// Counter.jsx
import { useState } from "preact/hooks";

export function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>
      Clicked {count} times
    </button>
  );
}
Tamaño
Alrededor de 3kB gzipped
API
Hooks compatibles con React
Renderizado
Virtual DOM
Signals
Nativos vía @preact/signals
Ecosistema
Puente preact/compat
Ideal para
Widgets y presupuestos de rendimiento

Por que importa

Por qué elegir Preact

Diminuto por defecto

Toda la librería ocupa unos pocos kilobytes, lo que deja más presupuesto de rendimiento para tu propio código y contenido.

API familiar

Los componentes, hooks, context y refs funcionan como esperas, por lo que el conocimiento de React se transfiere casi directamente.

Signals integrados

El paquete oficial de signals añade reactividad de grano fino y puede actualizar el estado sin volver a renderizar un componente.

La imagen completa

Las tres ideas detrás de Preact

Un núcleo diminuto, una API que ya conoces y un puente opcional al ecosistema de React.

El núcleo

Runtime pequeño

Una implementación compacta de virtual DOM con la API de componentes y hooks que ya conoces.

Signals

Reactividad

Un paquete oficial que rastrea dependencias y actualiza solo lo que ha cambiado.

El puente

Ecosistema

preact/compat permite que la mayoría de las librerías y componentes de React funcionen en Preact sin cambios.

Preact de un vistazo

El núcleo de Preact

Componentes

Componentes de función con props, children y composición.

Hooks

useState, useEffect, useRef y compañía desde preact/hooks.

Signals

Valores reactivos que actualizan el DOM directamente, incluso fuera de los componentes.

Context

Comparte valores a través del árbol con createContext y useContext.

preact/compat

Crea un alias de React a Preact y reutiliza el ecosistema de React.

htm

Un tagged template opcional que elimina la necesidad de un paso de compilación.

Una breve historia

Pequeño por diseño

  1. 2013

    Comenzó como alternativa a React

    Jason Miller crea una librería de virtual DOM más pequeña con una API compatible.

    13
  2. 2015

    Preact 3

    La librería se estabiliza y gana seguidores por su tamaño y velocidad.

    15
  3. 2019

    Preact X y hooks

    El soporte completo de hooks y la capa de compatibilidad hacen que el código de React sea portable.

    19
  4. 2022

    Signals

    El paquete oficial de signals aporta reactividad de grano fino a Preact.

    22
  5. Hoy

    El estándar ligero

    Una opción común para widgets, UIs embebidas y presupuestos de rendimiento estrictos.

    Hoy

La guia completa

Preact: Todo lo que necesitas saber

¿Qué es Preact?

Preact es una alternativa diminuta a React. Implementa el mismo modelo de componentes, los mismos hooks y un virtual DOM, en aproximadamente tres kilobytes gzipped. Para la mayoría de los componentes, el código que escribes para React funciona en Preact con pocos o ningún cambio.

Ese tamaño es precisamente el objetivo. Cuando estás integrando un widget en una página que no controlas totalmente, construyendo una interfaz donde el rendimiento es crítico o simplemente quieres mantener reducido tu presupuesto de JavaScript, unos pocos kilobytes de framework pueden marcar una diferencia medible. Preact te ofrece el modelo familiar sin el peso.

Componentes y hooks

Los componentes de Preact son funciones que devuelven JSX, y los hooks provienen de preact/hooks.

// Search.jsx
import { useState } from "preact/hooks";

export function Search({ onSearch }) {
  const [query, setQuery] = useState("");

  return (
    <form
      onSubmit={(event) => {
        event.preventDefault();
        onSearch(query);
      }}
    >
      <input
        value={query}
        onInput={(event) => setQuery(event.currentTarget.value)}
      />
    </form>
  );
}

useState, useEffect, useRef, useContext, useMemo y useCallback se comportan tal como esperarías. Las principales diferencias son pequeñas: Preact soporta tanto class como className, y utiliza nombres de eventos nativos como onInput y onDblClick.

Preact Signals

Los Signals son la primitiva de reactividad de primer nivel de Preact. Un signal contiene un valor y, cuando se lee dentro de JSX, suscribe esa parte del DOM a dicho valor. Al cambiar el valor, el DOM se actualiza directamente, sin necesidad de que el componente se vuelva a renderizar.

// Counter.jsx
import { signal, computed } from "@preact/signals";

const count = signal(0);
const double = computed(() => count.value * 2);

export function Counter() {
  return (
    <div>
      <button onClick={() => count.value++}>
        Count: {count}
      </button>
      <p>Double: {double}</p>
    </div>
  );
}

Debido a que los signals viven fuera del árbol de componentes, puedes compartirlos y mutarlos desde cualquier lugar, incluyendo módulos simples y manejadores de eventos. Son la forma recomendada de gestionar estados que cambian con frecuencia.

La capa de compatibilidad

El paquete preact/compat mapea la API de React hacia Preact. Crea un alias de react y react-dom hacia este en tu bundler, y la mayoría de las librerías de React funcionarán sin cambios.

// vite.config.js
import { defineConfig } from "vite";
import preact from "@preact/preset-vite";

export default defineConfig({
  plugins: [preact()],
  resolve: {
    alias: {
      react: "preact/compat",
      "react-dom": "preact/compat",
      "react-dom/client": "preact/compat/client",
    },
  },
});

Así es como los proyectos de Preact utilizan el ecosistema de React —librerías de componentes, enrutamiento, gestores de estado y más— mientras siguen distribuyendo un runtime más pequeño. La contrapartida es una ligera sobrecarga debida a la capa de compatibilidad, pero sigue siendo mucho menor que la de React.

Sin paso de compilación con htm

Si prefieres omitir el proceso de build por completo, la librería htm ofrece una alternativa a JSX mediante tagged templates.

// app.js
import { h, render } from "preact";
import htm from "htm";

const html = htm.bind(h);

function App({ name }) {
  return html`<h1>Hello, ${name}!</h1>`;
}

render(html`<${App} name="Ada" />`, document.body);

Esto es muy útil para el progressive enhancement, demos rápidas y para embeber una pequeña isla interactiva en una página renderizada en el servidor.

Diferencias con React

El solapamiento es amplio, pero algunos detalles varían:

  • Preact utiliza nombres de eventos nativos del DOM, por lo que onInput y onDblClick sustituyen a algunos nombres específicos de React.
  • Tanto class como className funcionan, y se aceptan tanto for como htmlFor.
  • No existe el pooling de eventos sintéticos, ya que Preact nunca ha implementado el pooling de eventos.
  • Algunas funciones más recientes de React, como partes de la API de React Server Components, no están implementadas.
  • Los tipos de JSX de TypeScript provienen de Preact y requieren un alias cuando se utiliza compat.

Para los componentes y hooks del día a día, rara vez notarás la diferencia.

Cuándo usar Preact

Preact destaca cuando el tamaño y el coste de inicio son prioridades: widgets embebibles, páginas de marketing con poca interactividad, sitios de contenido y aplicaciones con presupuestos de rendimiento estrictos. También es un objetivo de migración sencillo para una base de código de React existente que necesite reducir su tamaño.

Si dependes de herramientas específicas de React, funciones experimentales o una librería que dependa de los internos de React, permanecer en React puede generar menos fricción. La buena noticia es que la similitud de la API significa que esta decisión no es un camino sin retorno.

Mejores prácticas

  • Usa signals para el estado que cambie frecuentemente o que se comparta fuera del árbol.
  • Recurre a preact/compat solo cuando necesites paquetes del ecosistema de React.
  • Crea alias tanto para los tipos de React como para los módulos de runtime al usar compat.
  • Mantén los componentes pequeños y evita re-renders innecesarios leyendo las signals en el punto de uso.
  • Mide el impacto real del bundle: el ahorro es significativo, pero tu propio código sigue siendo lo predominante.
  • Prefiere preact/preset-vite para configurar el build correctamente desde el inicio.

Errores comunes

  • Mezclar paquetes de React y Preact sin el alias de compatibilidad.
  • Olvidar crear el alias de react-dom/client, lo que rompe la nueva API de root.
  • Asumir que cualquier librería de React funciona sin probar la capa de compatibilidad.
  • Usar signals en exceso y volver a renderizar componentes que podrían leer un signal directamente.
  • Tratar a Preact como si fuera idéntico en funcionalidades a React y sorprenderse ante algún caso límite.
  • Añadir Preact para reducir el tamaño y luego instalar una dependencia pesada que anula la ganancia.

Próximos pasos

Preact es la respuesta pragmática cuando el modelo de React es el adecuado, pero su tamaño no lo es. Compáralo con React y Svelte, configúralo con Vite y no descuides tus fundamentos de JavaScript. Después, intenta integrar un pequeño widget de Preact en una página HTML sencilla para comprobar lo ligero que es.

Estado reactivo

Los Signals actualizan el DOM directamente y pueden leerse fuera de los componentes, sin re-renderizar.

Signals
import { signal } from "@preact/signals";

const count = signal(0);

<button onClick={() => count.value++}>
  {count}
</button>
useState
import { useState } from "preact/hooks";

const [count, setCount] = useState(0);

<button onClick={() => setCount(count + 1)}>
  {count}
</button>

Uso de librerías de React

Con el alias de compatibilidad, las importaciones de React se resuelven a Preact, por lo que la mayoría de los paquetes del ecosistema funcionan sin cambios.

Preferir
// vite.config.js
resolve: {
  alias: {
    react: "preact/compat",
    "react-dom": "preact/compat",
  },
}
Evitar
// rewriting every import
// by hand across the codebase
import React from "react";
import { render } from "react-dom";

Preguntas frecuentes

Preguntas frecuentes

Keep learning

Related topics from the roadmap.

$ comienza a aprender

Listo para aprender Preact?

Nuestro tutorial interactivo te guia a traves de Preact paso a paso — con quizzes y codigo real que puedes ejecutar en el navegador.