Angular, depuis son évolution vers Ivy, a apporté des améliorations notables qui permettent aux développeurs de gagner en efficacité. Ces changements, en particulier ceux concernant les liaisons de styles, l'héritage des métadonnées et l'optimisation des tailles des bundles via la compilation AOT (Ahead of Time), contribuent à accélérer le développement tout en rendant les applications plus performantes. Mais il est crucial de comprendre non seulement les principes de ces fonctionnalités, mais aussi la manière dont elles interagissent pour obtenir des résultats tangibles.
L'une des avancées majeures d'Angular Ivy est l'introduction de liaisons de styles prévisibles. Dans la version précédente d'Angular, le comportement des liaisons de styles pouvait sembler aléatoire, rendant la gestion des styles complexes au sein d'une application difficile. Ivy simplifie cette situation en appliquant un ensemble de règles de priorité strictes, qui régissent l'application des liaisons de styles. Ainsi, les liaisons de styles au niveau du template ont priorité sur celles définies dans les directives, elles-mêmes ayant une priorité supérieure à celles des composants. Par ailleurs, les liaisons définissant des propriétés CSS individuelles ont une priorité plus élevée que celles des ensembles de classes ou de propriétés de style.
Un autre changement notable est l'impact des directives NgClass et NgStyle. Ces directives ont désormais un comportement plus prévisible, elles étant considérées comme des équivalents de la règle !important dans CSS, ce qui signifie qu'elles peuvent surcharger toutes les autres liaisons de styles sans égard pour la priorité.
Prenons l'exemple suivant pour illustrer ce comportement. Imaginons que nous ayons un composant et une directive qui définissent des styles pour le même élément DOM. Le résultat sera qu'une seule règle CSS sera appliquée, et la couleur de fond de l'élément sera définie comme étant rose, selon la priorité des liaisons définies par les directives et les composants. L'ordre des priorités, de la plus élevée à la plus basse, est ainsi le suivant :
-
Rose (directive NgStyle)
-
Rouge (liaison au niveau du template)
-
Orange (liaison avec une carte de classes)
-
Jaune (valeur statique)
-
Bleu (propriété de style d'une directive hôte)
-
Violet (style statique d'une directive hôte)
-
Gris (propriété de style d'un composant hôte)
-
Vert (style statique d'un composant hôte)
Cela démontre que, bien que l'ordre des déclarations dans le code semble important, ce sont les règles de priorité qui gouvernent l'application des styles. Les développeurs peuvent donc aborder des cas complexes de liaison de styles avec une confiance accrue, sachant qu'Angular s'assurera de leur cohérence et de leur prévisibilité.
Une autre amélioration substantielle concerne l'héritage des métadonnées dans les directives et les composants. Avant Ivy, l'héritage des métadonnées d'un composant ou d'une directive était un concept flou, ce qui compliquait la gestion de la logique partagée entre les composants. Aujourd'hui, Angular a clarifié ce processus en permettant à un composant de partager son comportement à travers l'héritage, notamment en héritant de métadonnées comme les propriétés Input et Output, les liaisons HostBinding, ou encore les requêtes ViewChild et ContentChild. Ces métadonnées sont désormais partagées de manière explicite et prévisible, ce qui réduit la taille des bundles et accélère la compilation.
Prenons l'exemple d'un composant de recherche de base qui gère les événements de saisie pour effectuer des recherches avec un délai de 150 millisecondes. Ce composant peut être étendu par un autre composant, comme un composant de boîte de recherche, qui héritera des fonctionnalités de recherche tout en pouvant ajouter ses propres styles spécifiques. Cette approche permet de créer des composants plus modulaires et réutilisables, tout en évitant la duplication du code.
Le code suivant montre un exemple de base d'un composant de recherche de base :
Ensuite, un composant de boîte de recherche pourrait être défini ainsi :
Dans ce cas, le SearchBoxComponent hérite des fonctionnalités de recherche de BaseSearchComponent et peut ajouter des styles supplémentaires via le fichier base-search.scss. Cette approche réduit le code redondant et améliore la maintenabilité des applications.
Au-delà de ces optimisations techniques, il est important de comprendre que l'amélioration de l'expérience de développement ne se limite pas à la performance ou à l'organisation du code. L'adoption de ces nouvelles pratiques permet aux développeurs de se concentrer sur des tâches à plus forte valeur ajoutée, telles que l'amélioration de l'expérience utilisateur ou l'intégration de nouvelles fonctionnalités. En utilisant Ivy et en exploitant les derniers outils et configurations d'Angular, les développeurs peuvent transformer leur manière de coder, en la rendant plus efficace, plus prévisible et plus agréable.
Enfin, bien que les améliorations de la productivité et de la performance soient évidentes, il est essentiel de comprendre que l'utilisation de ces nouvelles fonctionnalités nécessite une bonne maîtrise des outils de configuration, des principes d'héritage et des priorités de liaison de styles. De plus, les bonnes pratiques d'optimisation doivent être appliquées en fonction des spécificités du projet, afin de maximiser l'impact de ces évolutions sur la qualité globale de l'application.
Comment optimiser la prise en charge régionale grâce à des API de mondialisation améliorées dans Angular
Dans le développement d’applications Angular, la prise en charge des différentes régions et localisations est un élément crucial pour garantir une expérience utilisateur cohérente et accessible. À cet égard, Angular propose une série d’outils permettant de gérer efficacement la directionnalité et d’adapter les composants en fonction des préférences culturelles et linguistiques de l’utilisateur. Ce chapitre explore l’optimisation de cette prise en charge à travers l’utilisation des API de mondialisation et des techniques modernes pour manipuler les attributs HTML en fonction de la langue ou de la direction de lecture.
L'une des approches essentielles pour améliorer la prise en charge régionale consiste à ajuster dynamiquement l'attribut dir (qui définit la direction du texte dans un document) du composant racine, basé sur les paramètres régionaux. Cela est particulièrement utile pour les langues qui utilisent une direction de lecture de droite à gauche (comme l'arabe ou l'hébreu) par rapport aux langues de gauche à droite (comme l’anglais ou le français). Pour ce faire, il est nécessaire de mettre en place un service qui pourra injecter cette directionnalité dans le composant racine, vu que l’on ne peut pas appliquer une directive directement à ce dernier.
Voici un exemple de code qui montre comment ce processus fonctionne dans Angular :
Le service HostDirectionService est responsable de l’application de la direction sur l'élément hôte du composant. Ce service utilise l'API Renderer2 pour appliquer dynamiquement la valeur de l’attribut dir à l'élément hôte, ce qui permet une gestion fluide de la direction en fonction du paramètre régional de l’application.
Dans le cadre de ce service, une propriété observable locale$ exposée par un service d’état de la locale peut être utilisée pour obtenir la direction appropriée en fonction de la langue sélectionnée. Le code ci-dessous montre l’implémentation de ce service en utilisant les APIs Angular :
Ici, nous voyons l’utilisation du service Renderer2 pour appliquer la direction à l'élément racine en fonction de la langue actuelle de l’application. Ce processus assure que l’attribut dir est correctement mis à jour chaque fois que la langue de l’application change.
Une autre approche innovante consiste à tirer parti de la logique de directionnalité pour charger des images de manière paresseuse (lazy load) en fonction de la direction de la locale. Par exemple, si l’application utilise une langue de droite à gauche, nous pouvons charger une version différente des images, spécifiquement adaptées à ce format de lecture. Cela peut être réalisé à l’aide de directives structurées dans Angular, qui conditionnellement insèrent ou retirent des éléments en fonction de la direction courante, comme illustré dans l'exemple suivant :
Ainsi, l’application peut adapter son contenu à la direction locale de l’utilisateur en utilisant des requêtes similaires aux media queries CSS. Ces techniques peuvent être combinées pour offrir une expérience utilisateur fluide et localisée, garantissant une adaptation parfaite aux différentes langues et cultures.
Au-delà de l’implémentation technique, il est essentiel de comprendre que l’optimisation de la prise en charge des langues et des régionales ne se limite pas à la gestion de la direction. D’autres aspects comme la gestion des formats de date, de monnaie, et des règles de tri doivent également être pris en compte pour assurer que l’application soit véritablement globale et accessible. Une application bien conçue pour un marché local peut rencontrer des difficultés si ces éléments de contextualisation ne sont pas pris en charge de manière appropriée, ce qui pourrait nuire à l’expérience de l’utilisateur dans d’autres régions du monde. Par conséquent, une attention particulière à la personnalisation et à la gestion dynamique de ces attributs sera toujours nécessaire pour maintenir une qualité d’expérience optimale.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский