12k
All articles

Quand vous n'avez pas besoin d'une bibliothèque de composants

Pourquoi le CSS utilitaire et les primitives headless dépassent souvent les bibliothèques de composants en 2026, avec une checklist pour choisir.

OpenReplay Team
OpenReplay Team
Quand vous n'avez pas besoin d'une bibliothèque de composants

Pour la plupart des projets de petite envergure, fortement personnalisés ou sensibles aux performances en 2026, vous n’avez pas besoin d’une bibliothèque de composants — vous avez besoin d’un CSS utilitaire pour la mise en page et de primitives headless pour les trois ou quatre comportements interactifs véritablement complexes. Une bibliothèque stylisée complète comme MUI, Ant Design ou Chakra ne justifie son poids que dans des conditions spécifiques : la cohérence entre de nombreuses équipes, les outils internes où la rapidité de livraison prime sur la marque, ou l’absence de ressource design dédiée. En dehors de ces cas, les coûts liés au bundle, à la personnalisation et à l’aspect générique l’emportent généralement sur les bénéfices. Cet article vous propose un cadre de décision — les véritables coûts d’un recours systématique à une bibliothèque, les cas où vous n’en avez réellement pas besoin, ceux où vous en avez besoin, et une échelle concrète allant de « rien » à « bibliothèque complète » pour que vous choisissiez l’échelon le plus bas qui résout votre problème réel.

Le recadrage essentiel dès le départ : « ne pas utiliser une bibliothèque de composants » n’a jamais signifié « coder ses propres menus déroulants à la main ». Cela signifie CSS utilitaire combiné à des primitives headless éprouvées pour les comportements difficiles à implémenter correctement.

Points clés à retenir

  • Le choix par défaut moderne pour la plupart des projets est le CSS utilitaire pour le style combiné à des primitives headless — et non une bibliothèque de composants stylisés complète ni des widgets interactifs codés manuellement.
  • Optez pour une bibliothèque stylisée complète uniquement lorsque vous avez besoin de cohérence entre de nombreuses équipes, que vous livrez des outils internes où la rapidité prime sur la marque, ou que vous ne disposez pas de ressource design dédiée.
  • Reach UI n’est plus maintenu, donc tout conseil de 2026 recommandant son utilisation est erroné — le rôle de primitive accessible revient désormais à Radix Primitives et à React Aria d’Adobe.
  • La partie la plus coûteuse d’un menu déroulant codé manuellement n’est pas le balisage ; ce sont la navigation au clavier, le piégeage du focus, le rejet au clic extérieur et les annonces aux lecteurs d’écran qu’une primitive headless fournit par défaut.
  • Tailwind CSS v4.0 est une version majeure du framework CSS utilitaire, publiée le 22 janvier 2025, qui fait du CSS utilitaire un choix par défaut réaliste pour la couche de style.

Les véritables coûts d’un recours systématique à une bibliothèque de composants

Une bibliothèque de composants complète engendre trois coûts qui s’accumulent tout au long de la vie d’un projet : le poids du bundle, la friction de personnalisation et l’uniformité visuelle. Aucun d’eux n’est rédhibitoire pris isolément, mais ensemble ils expliquent pourquoi intégrer MUI pour un site marketing ou une application de cinq écrans est généralement un mauvais compromis.

Le poids du bundle. Une bibliothèque stylisée monolithique embarque une base de CSS et de JavaScript — runtime de thématisation, registre de composants, design tokens — qui est chargée que vous rendiez trois composants ou trente. Le tree-shaking aide, mais uniquement là où la bibliothèque est véritablement modulaire. Les packages par composant se prêtent bien au tree-shaking ; le package radix-ui est tree-shakeable, ce qui vous permet de ne livrer que les composants que vous utilisez. Les payloads de thème et de style monolithiques ne s’allègent pas de la même façon, car le runtime est une dépendance partagée que chaque composant importe. La version honnête de l’argument « le tree-shaking règle le problème » : il fonctionne pour les primitives modulaires, pas pour une bibliothèque dont le moteur de style est un runtime unique.

La friction de personnalisation. Si le design d’un projet est générique et éphémère, une bibliothèque prête à l’emploi s’impose clairement. Si le design est distinctif et pérenne, chaque composant stylisé que vous importez devient une bataille de spécificité que vous mènerez pendant toute la durée du projet — en surchargeant des sélecteurs imbriqués, en contournant les valeurs par défaut du thème et en encapsulant des composants pour les adapter à votre identité de marque.

L’aspect générique. Les valeurs par défaut d’une bibliothèque sont neutres par conception. Une identité de marque distinctive implique des surcharges importantes, ce qui renvoie directement au coût de personnalisation. Plus votre design s’éloigne des partis pris de la bibliothèque, plus vous vous retrouvez à la combattre plutôt qu’à l’utiliser.

Quand vous n’avez pas besoin d’une bibliothèque de composants

Vous n’avez pas besoin d’une bibliothèque de composants lorsque l’interface est principalement statique, que le design est distinctif ou que les performances constituent une contrainte forte. Ce sont les projets pour lesquels une bibliothèque représente une surcharge pure.

  • Pages d’atterrissage, blogs et portfolios. Principalement de la typographie, de la mise en page et quelques effets interactifs. Le CSS utilitaire couvre le style ; vous avez rarement besoin de plus d’une poignée de composants interactifs.
  • Applications fortement personnalisées. Lorsque le design est l’identité du produit, les valeurs par défaut d’une bibliothèque jouent contre vous. Construire à partir de classes utilitaires et d’un petit ensemble de vos propres composants offre un contrôle total sans avoir à combattre les partis pris d’autrui.
  • Applications critiques en termes de performances. Lorsque chaque kilooctet et chaque milliseconde de latence d’interaction comptent, livrer un runtime de bibliothèque stylisée pour quelques boutons n’est pas le bon choix par défaut.
  • Équipes utilisant Tailwind. Si votre équipe stylise déjà avec des classes utilitaires, une bibliothèque stylisée duplique la couche de style et crée deux sources de vérité concurrentes sur l’apparence des éléments.

Une distinction utile ici : une bibliothèque de composants est une collection d’éléments d’interface prêts à l’emploi ; un système de design est le cadre plus large de principes, de tokens et de règles d’utilisation qui les entourent. Vous pouvez avoir besoin du second sans acheter le premier — un ensemble de design tokens en propriétés CSS personnalisées combiné à des classes utilitaires vous offre de la cohérence sans importer les composants de qui que ce soit.

Quand vous en avez besoin

Optez pour une bibliothèque stylisée complète lorsque la rapidité et la cohérence à grande échelle importent davantage que la distinctivité de la marque ou la taille du bundle. Quatre situations le justifient :

  • Outils internes et tableaux de bord d’administration. Personne ne juge un panneau CRUD back-office sur son identité visuelle. Une bibliothèque qui vous fournit des tableaux, des formulaires, des modales et des sélecteurs de date prêts à l’emploi est le chemin le plus rapide vers la livraison.
  • MVPs et prototypes. Lorsque l’objectif est de valider une idée avant d’investir dans le design, des composants prêts à l’emploi vous permettent d’avancer vite et de jeter facilement.
  • Cohérence en entreprise multi-équipes. Lorsque de nombreuses équipes contribuent à un même produit, une bibliothèque partagée impose un aspect unique et un chemin de mise à jour unique — corrigez un composant une fois, et tous les consommateurs en héritent.
  • Absence de ressource design dédiée. S’il n’y a pas de designer ni de système de design, les valeurs par défaut sensées d’une bibliothèque sont préférables à ce que la plupart des équipes produiront de manière ad hoc.

Le fil conducteur : dans chaque cas, les valeurs par défaut opinionées de la bibliothèque sont un atout, pas une contrainte contre laquelle vous vous battrez.

L’échelle de décision : de rien à une bibliothèque de composants complète

Plutôt qu’un choix binaire « bibliothèque ou pas de bibliothèque », pensez en échelons. Chaque échelon ajoute des capacités et des coûts ; ne montez que jusqu’au niveau que vos besoins réels exigent. Cela modernise le spectre classique build-vs-buy.

ÉchelonCe vers quoi vous vous tournezUtilisez-le quand
1. Rien de plusHTML + CSS bruts, petits composants réutilisablesInterface statique ou quasi-statique, contrôle total du design
2. CSS utilitaireTailwind CSS v4 + design tokensVous voulez de la rapidité sur le style sans quitter le CSS
3. Primitives headlessRadix, React Aria, Headless UI, Ark UIVous avez besoin de menus déroulants, dialogues, comboboxes accessibles
4. Composants à usage uniquereact-select, un sélecteur de date, un éditeur de texte enrichiUn widget véritablement complexe, pas tout un kit d’interface
5. Bibliothèque stylisée complèteMUI, Ant Design, Chakra UIOutils internes, cohérence en entreprise, absence de designer

Échelon 2 — CSS utilitaire. Tailwind est le choix par défaut réaliste pour la couche de style et de mise en page. Tailwind CSS v4.0 est une toute nouvelle version du framework optimisée pour les performances et la flexibilité, avec une expérience de configuration et de personnalisation repensée. Le changement architectural majeur : Tailwind CSS v4 est un outil tout-en-un pour traiter votre CSS, avec Lightning CSS intégré directement dans le framework afin que vous n’ayez rien à configurer dans votre pipeline CSS. La configuration a migré de tailwind.config.js vers le CSS via la directive @theme. Les versions de correctifs évoluent rapidement, donc épinglez une version dans votre projet plutôt que d’en mémoriser une ; v4 est la version courante en juin 2026.

Échelon 3 — primitives headless. C’est l’échelon que les anciens conseils « n’utilisez pas de bibliothèque » sous-estiment, et c’est celui qui compte le plus. Les primitives headless vous donnent le comportement accessible d’un composant interactif — gestion du clavier, gestion du focus, câblage ARIA — sans aucun style, vous apportez donc vos propres classes utilitaires.

Radix Primitives est le choix de référence : une bibliothèque de composants d’interface de bas niveau axée sur l’accessibilité, la personnalisation et l’expérience développeur, une bibliothèque de composants d’interface open source pour construire des systèmes de design et des applications web de haute qualité et accessibles, maintenue par WorkOS. Elle offre des primitives pour les patterns d’interface courants tels que les dialogues, les menus déroulants, les popovers et les infobulles, tous construits avec la conformité WAI-ARIA pour garantir la prise en charge des lecteurs d’écran et la navigation au clavier. Pour les équipes multi-frameworks, Ark UI (construit sur les machines à états Zag.js, avec une parité React/Vue/Solid/Svelte) couvre le même terrain sur plusieurs frameworks. Si vous êtes sur React, React Aria d’Adobe et Headless UI de Tailwind Labs (qui prend en charge React et Vue) sont des options équivalentes.

Une correction qui mérite d’être formulée clairement : évitez Reach UI en 2026. Reach UI n’est plus maintenu, selon son dépôt GitHub officiel. Son mainteneur a déclaré une « faillite OSS » en 2022, et le projet n’a pas reçu de développement actif depuis. Depuis l’introduction de Reach, d’autres ont construit des composants de bas niveau, composables et accessibles, avec plusieurs bibliothèques bien maintenues à considérer à la place — Radix et React Aria en tête. Tout article recommandant encore Reach UI pour « les cas difficiles » vous oriente vers une dépendance abandonnée.

Échelon 4 — composants à usage unique. Lorsqu’un widget est véritablement complexe — une sélection multiple avec recherche, un sélecteur de plage de dates, un éditeur de texte enrichi — intégrez un package dédié et éprouvé pour cet élément précis plutôt que d’adopter tout un kit d’interface pour l’obtenir.

Il convient également de noter que la plateforme a absorbé des problèmes qui nécessitaient autrefois une bibliothèque. Dans React 19, la prise en charge des fonctions asynchrones dans les transitions gère automatiquement les états en attente, les erreurs, les formulaires et les mises à jour optimistes, et les nouvelles actions de formulaire ainsi que les API useActionState, useFormStatus, useOptimistic et use() réduisent l’argument « vous avez besoin d’une bibliothèque de formulaires pour ça » pour une classe de formulaires. Avoir moins de raisons de monter dans l’échelle est un avantage.

Le coût caché des composants interactifs codés manuellement

La raison pour laquelle « ne pas utiliser de bibliothèque » ne doit pas se réduire à « tout construire soi-même » est l’accessibilité et les comportements aux cas limites. La partie la plus coûteuse d’un menu déroulant codé manuellement n’est pas le balisage — ce sont la navigation au clavier, le piégeage du focus, le rejet au clic extérieur et les annonces aux lecteurs d’écran qu’une primitive headless vous offre gratuitement.

C’est précisément l’écart que décrivent les auteurs de Radix : les implémentations que la plateforme web fournit pour ces patterns sont inadéquates — inexistantes, manquant de fonctionnalités, ou insuffisamment personnalisables — ce qui oblige les développeurs à construire des composants personnalisés, une tâche incroyablement difficile, et par conséquent la plupart des composants sur le web sont inaccessibles, peu performants et manquent de fonctionnalités importantes.

Les défaillances d’accessibilité dans les composants interactifs codés manuellement sont la catégorie de bugs que le replay de session met en évidence en production. Regarder les replays de contrôles construits sur mesure, c’est là que le véritable coût du « construisez-le vous-même » devient visible : un utilisateur au clavier dont le focus s’échappe d’une modale personnalisée et atterrit sur la page en arrière-plan ; un utilisateur mobile qui tape à plusieurs reprises sur un menu déroulant qui ne se ferme pas faute de gestion du clic extérieur ou de la touche Échap ; une combobox qui n’annonce jamais ses options à un lecteur d’écran, forçant l’utilisateur à abandonner. Ce sont exactement les comportements qu’une primitive headless gère par défaut — et exactement les comportements qu’un composant codé manuellement rate silencieusement jusqu’à ce que quelqu’un regarde un vrai utilisateur se débattre avec lui.

La conclusion n’est pas « utilisez toujours une primitive ». C’est que le coût des composants interactifs DIY se paie plus tard, en bugs d’accessibilité et en interactions abandonnées, et non en amont dans le balisage. Intégrez cela dans votre calcul avant de décider de tout coder manuellement.

Une liste de contrôle décisionnelle

Soumettez un projet à ces cinq questions avant de choisir un échelon :

  1. Durée de vie. Prototype jetable ou produit sur plusieurs années ? Les projets éphémères favorisent le prêt-à-l’emploi ; les projets pérennes favorisent la maîtrise de votre couche de style.
  2. Distinctivité de la marque. Générique et standardisé, ou identité distinctive ? Un design distinctif fait d’une bibliothèque stylisée un handicap.
  3. Taille de l’équipe. Une seule équipe ou plusieurs contribuant à un même produit ? La cohérence multi-équipes est l’argument le plus fort en faveur d’une bibliothèque partagée.
  4. Budget de performances. La taille du bundle ou la latence d’interaction constituent-elles une contrainte forte ? Si oui, préférez le CSS utilitaire combiné à des primitives par composant plutôt qu’un runtime monolithique.
  5. Qui le maintient. Avez-vous un designer et la capacité de maintenir une couche personnalisée ? L’absence de ressource design vous pousse vers les valeurs par défaut sensées d’une bibliothèque.

Si la plupart des réponses pointent vers « éphémère, générique, multi-équipes, sans designer », montez à l’échelon 5. Si elles pointent vers « pérenne, distinctif, une seule équipe, budget performances serré », restez aux échelons 2 et 3.

Conclusion

Le choix par défaut pour les nouveaux projets frontend en 2026 est le CSS utilitaire pour le style et les primitives headless pour la poignée d’interactions difficiles à implémenter correctement — en montant vers une bibliothèque stylisée complète uniquement lorsque la cohérence à grande échelle, la rapidité de livraison brute ou l’absence de ressource design font de ses valeurs par défaut opinionées un atout. Avant de lancer npm install sur un kit d’interface par habitude, parcourez la liste de contrôle en cinq questions et choisissez l’échelon le plus bas qui résout le problème devant vous. Construisez avec intention, pas par réflexe — et laissez le projet, et non l’habitude, décider de la quantité de bibliothèque dont vous avez réellement besoin.

FAQ

Quelle est la différence entre une bibliothèque de composants headless et une bibliothèque de composants stylisés ?

Une bibliothèque headless comme Radix Primitives, React Aria ou Headless UI fournit le comportement et l'accessibilité d'un composant interactif — navigation au clavier, gestion du focus, câblage ARIA — sans aucun style, vous apportez donc votre propre CSS ou vos classes utilitaires. Une bibliothèque stylisée comme MUI, Ant Design ou Chakra UI embarque à la fois le comportement et un design visuel opinioné ainsi qu'un runtime de thématisation. La bibliothèque headless échange la commodité contre un contrôle visuel total et une empreinte de style réduite.

Peut-on utiliser Tailwind CSS et une bibliothèque de composants ensemble dans le même projet ?

Oui, mais cela duplique généralement la couche de style et crée deux sources de vérité concurrentes sur l'apparence des éléments. Une bibliothèque stylisée embarque son propre runtime de thématisation, donc la combiner avec Tailwind signifie maintenir les deux. La combinaison plus propre est Tailwind pour le style combiné à une primitive headless comme Radix, React Aria ou Ark UI, qui n'embarque aucun style propre et est conçue pour être stylisée avec des classes utilitaires.

Pourquoi Reach UI n'est-il plus recommandé pour les composants React accessibles ?

Reach UI n'est plus maintenu, selon son dépôt GitHub officiel. Le mainteneur a déclaré une faillite OSS en 2022, et le projet n'a pas reçu de développement actif depuis. Tout conseil de 2026 recommandant Reach UI pour les menus déroulants, infobulles ou autres patterns interactifs complexes vous oriente vers une dépendance abandonnée. Le rôle de primitive accessible qu'il remplissait autrefois appartient désormais à Radix Primitives et à React Aria d'Adobe, tous deux activement maintenus avec une prise en charge complète du clavier et du focus WAI-ARIA.

Quelle bibliothèque de composants headless fonctionne sur React, Vue, Solid et Svelte ?

Ark UI est l'option agnostique aux frameworks, construite sur les machines à états Zag.js avec une parité entre React, Solid, Vue et Svelte. La plupart des primitives headless sont spécifiques à un framework : Radix Primitives et React Aria d'Adobe ciblent React, tandis que Headless UI de Tailwind Labs prend en charge React et Vue. Si vous avez besoin d'une logique de composants partagée entre plusieurs frameworks au sein d'une même organisation, Ark UI est conçu pour ce cas, puisque le comportement sous-jacent réside dans Zag.js plutôt que dans un binding de framework unique.

Digital experience platform

Truly understand users experience

See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.