Performance et optimisationL'objectif d'eQuantic.UI est d'offrir une expérience de Single Page Application (SPA) avec un surcoût minimal, en exploitant la puissance du C# pour générer du code frontend fortement optimisé.
🚀 Réconciliation et DOM virtuel
Le système de DOM virtuel a été conçu pour être efficace et anticiper les changements d'état.
Stratégie de diffing (algorithme Keyed LIS)
L'algorithme de réconciliation utilise une stratégie efficace de Keyed Diffing fondée sur l'algorithme de la plus longue sous-suite croissante (LIS).
•
La propriété Key : la propriété key identifie les éléments d'un rendu à l'autre. Les éléments de même clé sont réutilisés et mis à jour sur place.
•
Optimisation par LIS : quand les éléments sont réordonnés, l'algorithme calcule la plus longue sous-suite croissante pour minimiser les déplacements dans le DOM. Seuls les éléments hors de la LIS ont besoin d'être déplacés.
•
Optimisation préfixe et suffixe : les préfixes et suffixes communs sont traités d'abord sans diffing complexe, ce qui améliore la performance des opérations de liste typiques (ajout en fin, ajout en tête).
•
Efficacité mémoire : les éléments non déplacés préservent leur état de navigateur (focus d'un champ, position de défilement, etc.).
🧠 Gestion des ressources (gestion mémoire)
Les fuites de mémoire sont atténuées par l'usage intelligent de références faibles et d'un nettoyage automatique.
Suivi des listeners d'événements
Les listeners d'événements sont suivis avec WeakMap<HTMLElement, Map<string, EventHandler>>.
•
Références faibles : WeakMap permet au ramasse-miettes de collecter les éléments du DOM quand ils sont retirés de l'arbre, même si le framework garde encore des références internes à leurs gestionnaires.
•
Nettoyage automatique : en retirant un composant, le réconciliateur tente de débrancher les listeners explicitement, mais le WeakMap sert de filet de sécurité contre les fuites dans les cycles de vie complexes.
📦 Empaquetage et chargement
Stratégie hybride avec Bun
Le SDK utilise un binaire Bun embarqué pour traiter la sortie finale.
•
Performance du build : Bun traite les fichiers TS/JS jusqu'à 10 fois plus vite que les outils fondés sur Node.js.
•
Tree-shaking : le code mort est retiré automatiquement pendant le build.
•
Minification : les scripts sont livrés compressés.
Du CSS atomique, nommé pareil des deux côtés
Un style est une valeur C# abstraite (BoxStyle, props de layout, rôles), jamais du CSS. Le réalisateur web transforme chaque propriété en une classe ATOMIQUE dédupliquée, nommée par un hash de la valeur (la même règle FNV sur le serveur (StyleAtomizer) et dans le navigateur (style-atomizer.ts)), si bien que le balisage que le SSR a écrit et l'arbre que le client construit nomment une classe pour un style, et l'hydratation ne réécrit rien.
•
Une règle par valeur distincte : cent cartes partageant un style partagent ses classes au lieu de répéter cent chaînes de style en ligne.
•
Aucune feuille de styles à récupérer : le serveur écrit les règles qu'une page utilise dans la page elle-même (<style id="eq-atomic">), et le navigateur ajoute une règle à cette même feuille la première fois que son arbre a besoin d'une classe que la page n'avait pas.
•
Aucun décalage de layout dû au style : les classes que le serveur a rendues sont celles que le client garde.
•
Des chunks par page : chaque page est son propre module, que le boot importe à la première navigation vers elle, et ce que deux pages ou plus partagent est un chunk que bun sépare une fois. L'utilisateur ne télécharge que le nécessaire pour la route courante.
•
Chargement paresseux : les composants et bibliothèques complexes peuvent être chargés à la demande.