Lightweight Library

Preact

Preact est une alternative à React de 3 ko avec la même API moderne. Mêmes composants, mêmes hooks, mais une taille fractionnaire — idéal quand chaque kilo-octet compte.

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>
  );
}
Taille
Environ 3 ko gzippés
API
Hooks compatibles React
Rendu
Virtual DOM
Signals
Intégrés via @preact/signals
Écosystème
Pont preact/compat
Idéal pour
Widgets et budgets de performance

Pourquoi c'est important

Pourquoi choisir Preact

Minuscule par défaut

L'ensemble de la bibliothèque ne pèse que quelques kilo-octets, ce qui laisse plus de budget de performance pour votre propre code et contenu.

API familière

Les composants, hooks, context et refs fonctionnent comme vous l'attendez, donc vos connaissances en React sont presque directement transférables.

Signals intégrés

Le package officiel de signals ajoute une réactivité fine et peut mettre à jour l'état sans re-rendre un composant.

Le tableau complet

Les trois idées derrière Preact

Un cœur minuscule, une API que vous connaissez déjà et un pont optionnel vers l'écosystème React.

Le cœur

Runtime compact

Une implémentation compacte du DOM virtuel avec l'API de composants et de hooks que vous connaissez déjà.

Signals

Réactivité

Un package officiel qui suit les dépendances et ne met à jour que ce qui a changé.

Le pont

Écosystème

preact/compat permet à la plupart des bibliothèques et composants React de fonctionner sur Preact sans modification.

Preact en un coup d'œil

Le cœur de Preact

Composants

Composants fonctionnels avec props, children et composition.

Hooks

useState, useEffect, useRef et consorts via preact/hooks.

Signals

Valeurs réactives qui mettent à jour le DOM directement, même en dehors des composants.

Context

Partagez des valeurs à travers l'arbre avec createContext et useContext.

preact/compat

Alias React vers Preact pour réutiliser l'écosystème React.

htm

Un template taggé optionnel qui supprime le besoin d'une étape de build.

Un bref aperçu

Petit par conception

  1. 2013

    Lancé comme alternative à React

    Jason Miller crée une bibliothèque DOM virtuel plus petite avec une API compatible.

    13
  2. 2015

    Preact 3

    La bibliothèque se stabilise et gagne en popularité grâce à sa taille et sa rapidité.

    15
  3. 2019

    Preact X et hooks

    Le support complet des hooks et la couche de compatibilité rendent le code React portable.

    19
  4. 2022

    Signals

    Le package officiel de signals apporte une réactivité fine à Preact.

    22
  5. Aujourd'hui

    Le standard léger

    Un choix courant pour les widgets, les interfaces embarquées et les budgets de performance stricts.

    Aujourd'hui

Le guide complet

Preact: Tout ce que vous devez savoir

Qu’est-ce que Preact ?

Preact est une alternative miniature à React. Il implémente le même modèle de composants, les mêmes hooks et un DOM virtuel, le tout pour environ trois kilo-octets compressés (gzipped). Pour la plupart des composants, le code écrit pour React fonctionne sur Preact avec peu ou pas de modifications.

Cette taille est tout l’intérêt du projet. Lorsque vous intégrez un widget dans une page que vous ne contrôlez pas entièrement, que vous développez une interface où la performance est critique ou que vous souhaitez simplement limiter votre budget JavaScript, quelques kilo-octets de framework peuvent faire une différence mesurable. Preact vous offre un modèle familier sans l’encombrement.

Composants et hooks

Les composants Preact sont des fonctions qui retournent du JSX, et les hooks proviennent 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 et useCallback se comportent tous comme vous vous y attendez. Les principales différences sont mineures : Preact supporte à la fois class et className, et utilise des noms d’événements natifs tels que onInput et onDblClick.

Preact Signals

Les Signals sont la primitive de réactivité native de Preact. Un signal détient une valeur et, lorsqu’il est lu à l’intérieur du JSX, il abonne cette partie du DOM à ladite valeur. Modifier la valeur met à jour le DOM directement — aucun re-render du composant n’est nécessaire.

// 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>
  );
}

Comme les signals existent en dehors de l’arbre des composants, vous pouvez les partager et les muter de n’importe où, y compris depuis des modules simples ou des gestionnaires d’événements. C’est la méthode recommandée pour gérer un état qui change fréquemment.

La couche de compatibilité

Le package preact/compat mappe l’API de React vers Preact. Créez des alias pour react et react-dom dans votre bundler, et la plupart des bibliothèques React fonctionneront sans modification.

// 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",
    },
  },
});

C’est ainsi que les projets Preact utilisent l’écosystème React — bibliothèques de composants, routage, gestionnaires d’état et plus encore — tout en conservant un runtime plus léger. Le compromis est un léger surcoût lié à la couche de compatibilité, mais cela reste bien inférieur à la taille de React lui-même.

Pas d’étape de build avec htm

Si vous souhaitez vous passer totalement de l’étape de build, la bibliothèque htm propose une alternative aux JSX basée sur les 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);

C’est très pratique pour l’amélioration progressive (progressive enhancement), les démos rapides ou l’intégration d’une petite île interactive dans une page rendue côté serveur.

Différences avec React

Le chevauchement est important, mais quelques détails diffèrent :

  • Preact utilise les noms d’événements DOM natifs, ainsi onInput et onDblClick remplacent certains noms spécifiques à React.
  • class et className fonctionnent tous les deux, et for et htmlFor sont tous deux acceptés.
  • Il n’y a pas de pooling d’événements synthétiques, car Preact n’a jamais utilisé de pooling pour les événements.
  • Certaines fonctionnalités récentes de React, comme certaines parties de l’API des server-components, ne sont pas implémentées.
  • Les types JSX de TypeScript proviennent de Preact et nécessitent un alias lors de l’utilisation de compat.

Pour les composants et hooks du quotidien, vous remarquerez rarement la différence.

Quand utiliser Preact

Preact est idéal lorsque la taille et le coût de démarrage sont prioritaires : widgets intégrables, pages marketing avec un peu d’interactivité, sites de contenu et applications avec des budgets de performance stricts. C’est également une cible de migration douce pour une base de code React existante qui doit être allégée.

Si vous dépendez d’outils spécifiques à React, de fonctionnalités très récentes ou d’une bibliothèque qui repose sur les mécanismes internes de React, rester sur React sera peut-être moins contraignant. La bonne nouvelle est que le chevauchement des API fait que cette décision n’est pas irréversible.

Bonnes pratiques

  • Utilisez les signals pour les états qui changent fréquemment ou qui sont partagés en dehors de l’arbre.
  • Ne vous tournez vers preact/compat que lorsque vous avez besoin de packages de l’écosystème React.
  • Créez des alias pour les types React ainsi que pour les modules d’exécution lors de l’utilisation de la compatibilité.
  • Gardez vos composants petits et évitez les re-renders inutiles en lisant les signals au point d’utilisation.
  • Mesurez l’impact réel sur le bundle — les gains sont significatifs, mais c’est toujours votre propre code qui prédomine.
  • Privilégiez preact/preset-vite pour configurer correctement le build dès le départ.

Erreurs courantes

  • Mélanger des packages React et Preact sans utiliser l’alias de compatibilité.
  • Oublier d’aliaser react-dom/client, ce qui rend l’API root obsolète.
  • Supposer que toutes les bibliothèques React fonctionnent sans tester la couche de compatibilité.
  • Abuser des signals et re-render des composants qui pourraient lire un signal directement.
  • Considérer Preact comme identique à React en termes de fonctionnalités et être surpris par un cas particulier.
  • Ajouter Preact pour réduire la taille du bundle, puis importer une dépendance volumineuse qui annule le gain.

Et après ?

Preact est la réponse pragmatique lorsque le modèle de React est pertinent, mais que sa taille ne l’est pas. Comparez-le avec React et Svelte, couplez-le avec Vite, et gardez vos fondamentaux en JavaScript bien en tête. Essayez ensuite d’intégrer un petit widget Preact dans une page HTML simple pour constater à quel point son impact est minime.

État réactif

Les Signals mettent à jour le DOM directement et peuvent être lus en dehors des composants, sans re-rendu.

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>

Utilisation de bibliothèques React

Avec l'alias de compatibilité, les imports React sont résolus vers Preact, donc la plupart des packages de l'écosystème fonctionnent sans modification.

Préférer
// vite.config.js
resolve: {
  alias: {
    react: "preact/compat",
    "react-dom": "preact/compat",
  },
}
Éviter
// rewriting every import
// by hand across the codebase
import React from "react";
import { render } from "react-dom";

FAQ

Foire aux questions

Keep learning

Related topics from the roadmap.

$ commencer à apprendre

Prêt à apprendre Preact ?

Notre tutoriel interactif vous guide à travers Preact pas à pas — avec des quiz et du vrai code que vous pouvez exécuter dans le navigateur.