DTeK Learn logo

L’encapsulation des vues avec Angular

L’encapsulation des vues dans Angular permet de définir des styles CSS spécifiques à un composant et de les isoler du reste de l’application. Cela signifie que les styles définis dans un composant ne seront appliqués qu’à ce composant et ne seront pas affectés par les autres composants ou le style global de l’application.

Cela permet d’avoir une structure de code plus modulaire et maintenable, car chaque composant peut avoir ses propres styles sans risque d’interférence avec les autres. L’encapsulation des vues facilite également la réutilisation des composants, car ils sont autonomes et indépendants.

jeune développeur en reconversion professionnelle sur son ordinateur à son bureau

1. Qu’est-ce que l’encapsulation des vues ?

L’encapsulation des vues est un mécanisme qui permet d’isoler les styles CSS d’un composant Angular afin qu’ils n’affectent pas les autres composants et éléments de l’application. Grâce à l’encapsulation des vues, les styles définis pour un composant particulier ne seront pas appliqués à d’autres composants, ce qui évite les conflits de styles et les effets indésirables.

L’encapsulation des vues fonctionne en ajoutant des attributs uniques aux éléments du DOM et en modifiant les sélecteurs CSS pour inclure ces attributs.

Voici un exemple simple pour illustrer l’encapsulation des vues :

// Supposons que nous ayons deux composants Angular, ComposantA et ComposantB, avec les styles suivants :

// ComposantA :

h1 {
    color: red;
}

// Composant B :

h1 {
    color: blue;
}

Sans encapsulation des vues, si les deux composants sont utilisés dans la même application, les styles définis pour les balises h1 entreraient en conflit, et le dernier style chargé (celui de ComposantB, par exemple) écraserait le style précédent. Tous les éléments h1 de l’application auraient la couleur bleue.

Avec l’encapsulation des vues, les styles de ComposantA pourraient être modifiés comme suit :

// ComposantA :

h1[_ngcontent-c1] {
    color: red;
}

// ComposantB :

h1[_ngcontent-c2] {
    color: blue;
}

Grâce à l’encapsulation des vues, les styles définis pour chaque composant sont isolés, et les éléments h1 de chaque composant auront la couleur définie dans leurs styles respectifs, sans conflit.

2. Types d’encapsulation des vues

Il existe trois types d’encapsulation des vues dans Angular : Emulated et Native. Chacun d’entre eux offre un niveau différent d’isolation des styles et utilise des techniques différentes pour y parvenir.

1. Emulated (Émulé)

L’encapsulation émulée est la méthode par défaut pour l’encapsulation des vues dans Angular. Elle simule l’encapsulation native des styles en ajoutant des attributs uniques aux éléments du DOM et en modifiant les sélecteurs CSS pour inclure ces attributs. Cela permet d’isoler les styles d’un composant sans utiliser les fonctionnalités natives du navigateur, ce qui garantit une compatibilité avec un maximum de navigateurs.

import { Component, ViewEncapsulation } from ‘@angular/core’;

@Component({
    selector: ‘app-example’,
    templateUrl: ‘./example.component.html’,
    styleUrls: [‘./example.component.css’],
    encapsulation: ViewEncapsulation.Emulated
})

export class ExampleComponent { }

2. Native (Natif)

L’encapsulation native utilise la fonctionnalité Shadow DOM du navigateur pour encapsuler les styles d’un composant. Le Shadow DOM est une fonctionnalité des navigateurs modernes qui permet de créer un DOM séparé et isolé pour chaque composant. Les styles définis pour un composant sont automatiquement isolés à l’intérieur de son propre Shadow DOM et n’affectent pas les autres éléments de la page.

Cependant, l’encapsulation native n’est pas compatible avec toutes les versions des navigateurs, notamment Internet Explorer.

import { Component, ViewEncapsulation } from ‘@angular/core’;

@Component({
    selector: ‘app-example’,
    templateUrl: ‘./example.component.html’,
    styleUrls: [‘./example.component.css’],
    encapsulation: ViewEncapsulation.Native
})

export class ExampleComponent { }

3. Encapsulation émulée

Voici un exemple détaillé d’utilisation de l’encapsulation émulée :

 

 

1. Crée un nouveau composant Angular appelé blue-box

ng generate component blue-box

2. Ajoute du style dans le fichier css du composant

.box {
    background-color: blue;
    width: 100px;
    height: 100px;
}

3. Crée une div dans le fichier html du composant

<div class= »box »></div>

4. Assure-toi que l’encapsulation émulée est définie

import { Component, ViewEncapsulation } from ‘@angular/core’;

@Component({
    selector: ‘app-blue-box’,
    templateUrl: ‘./blue-box.component.html’,
    styleUrls: [‘./blue-box.component.css’],
    encapsulation: ViewEncapsulation.Emulated
})

export class BlueBoxComponent { }

5. Crée un autre composant Angular appelé red-box

ng generate component red-box

6. Ajoute les styles dans le fichier css

.box {
    background-color: red;
    width: 100px;
    height: 100px;
}

7. Crée une div dans le fichier html

<div class= »box »></div>

8. Assure-toi que l’encapsulation émulée est définie

import { Component, ViewEncapsulation } from ‘@angular/core’;

@Component({
    selector: ‘app-red-box’,
    templateUrl: ‘./red-box.component.html’,
    styleUrls: [‘./red-box.component.css’],
    encapsulation: ViewEncapsulation.Emulated
})

export class RedBoxComponent { }

4. Configuration de l’encapsulation émulée

Tu n’as généralement pas besoin de configurer l’encapsulation émulée explicitement, car Angular l’utilise automatiquement pour tous les composants. Cependant, si tu souhaites t’assurer que l’encapsulation émulée est utilisée pour un composant spécifique ou si tu souhaites la rétablir après avoir changé le type d’encapsulation, voici comment procéder :

 

1. Importe ViewEncapsulation

import { Component, ViewEncapsulation } from ‘@angular/core’;

2. Ajoute la propriété encapsulation et défini sa valeur

@Component({
    selector: ‘app-example’,
    templateUrl: ‘./example.component.html’,
    styleUrls: [‘./example.component.css’],
    encapsulation: ViewEncapsulation.Emulated
})

export class ExampleComponent { }

Voici un exemple complet d’un composant Angular utilisant l’encapsulation émulée :

Fichier typescript:

import { Component, ViewEncapsulation } from ‘@angular/core’;

@Component({
    selector: ‘app-example’,
    templateUrl: ‘./example.component.html’,
    styleUrls: [‘./example.component.css’],
    encapsulation: ViewEncapsulation.Emulated
})

export class ExampleComponent { }

Fichier html:

<h1>Exemple d’encapsulation émulée</h1>
<div class= »custom-style »>Ceci est un élément avec un style personnalisé.</div>

Fichier css:

h1 {
    color: red;
}
.custom-style {
    background-color: lightblue;
    padding: 1rem;
}

5. Utilisation avec Visual Studio Code

Tu utilises Visual Studio Code comme éditeur de code ? Voici comment tirer parti de ses extensions pour travailler plus efficacement avec l’encapsulation émulée et d’autres aspects du développement Angular.

1. Angular Language Service

Angular Language Service est une extension officielle développée par l’équipe Angular qui fournit un ensemble riche de fonctionnalités pour améliorer l’expérience de développement Angular dans VSCode. Cette extension offre notamment la complétion automatique des balises et des attributs Angular, la navigation vers les fichiers de définition des composants, et l’affichage des erreurs en temps réel.

Pour installer Angular Language Service, ouvre VSCode et accède à la barre latérale des extensions (ou appuie sur Ctrl+Shift+X). Recherche « Angular Language Service » et installe l’extension.

2. TSLint

TSLint est une extension de linter pour TypeScript qui aide à identifier et résoudre les problèmes de code en fonction d’un ensemble de règles configurables. Cette extension peut également t’aider à identifier les problèmes liés à l’encapsulation émulée et à d’autres bonnes pratiques Angular.

Pour installer TSLint, accède à la barre latérale des extensions de VSCode et recherche « TSLint ». Installe l’extension.

3. Prettier

Prettier est une extension populaire de formatage de code qui prend en charge de nombreux langages, y compris TypeScript et HTML. L’utilisation de Prettier peut améliorer la lisibilité de ton code Angular et faciliter la compréhension des règles d’encapsulation émulée.

Pour installer Prettier, accède à la barre latérale des extensions de VSCode et recherche « Prettier ». Installe l’extension.

4. Configure ton environnement de travail

Pour tirer pleinement parti de ces extensions, il est essentiel de configurer correctement ton environnement de travail. Crée un fichier .vscode/settings.json à la racine de ton projet Angular et ajoute-y les paramètres suivants :

{
    « editor.formatOnSave »: true,
    « editor.codeActionsOnSave »: {
        « source.fixAll.tslint »: true
    },
    « angular.experimental-ivy »: true,
    « typescript.tsdk »: « node_modules/typescript/lib »
}

Ces paramètres permettent notamment d’activer le formatage automatique du code à la sauvegarde, d’exécuter les actions de correction automatique de TSLint, d’activer le support expérimental d’Ivy (le moteur de rendu d’Angular) dans Angular Language Service, et de définir la version de TypeScript utilisée par VSCode pour correspondre à celle de ton projet.

En suivant ces étapes, Tu optimiseras ton environnement de développement dans Visual Studio Code pour travailler avec Angular. Ces extensions et configurations t’aideront à écrire un code plus propre, à détecter les erreurs plus rapidement et à améliorer ta productivité.

6. Conseils et bonnes pratiques

Voici quelques conseils et bonnes pratiques pour travailler avec Angular, l’encapsulation des vues et le développement en général :

 

  1. Utilise l’encapsulation émulée. L’encapsulation émulée est la méthode d’encapsulation des vues par défaut dans Angular et fonctionne sur tous les navigateurs. Utilise-le chaque fois que tu crées un nouveau composant, sauf si tu as une raison spécifique d’utiliser l’encapsulation native ou aucune encapsulation.
  2. Utilise les variables CSS. Les variables CSS sont un excellent moyen de partager des valeurs communes entre les composants tout en respectant l’encapsulation des vues. Tu peux définir des variables CSS globales dans un fichier de styles global et les utiliser dans tes composants.
  3. Organise tes composants en modules. Les modules Angular permettent de regrouper et d’organiser les composants et autres éléments de ton application de manière logique. En créant des modules spécifiques pour chaque fonctionnalité ou domaine de ton application, tu facilites la gestion et la maintenance de ton code.
  4. Utilise la détection de changements OnPush. La détection de changements OnPush permet d’améliorer les performances de ton application en limitant la vérification des changements aux composants qui sont réellement affectés par ces changements. Pour utiliser la détection de changements OnPush, importe ChangeDetectionStrategy depuis @angular/core et définis la propriété changeDetection de ton composant sur OnPush.
  5. Utilise des outils de formatage et de linting. L’utilisation d’outils de formatage tels que Prettier et de linting tels que TSLint ou ESLint peut améliorer la lisibilité de ton code t’aider à identifier et corriger les problèmes de code. Configure ces outils pour suivre les bonnes pratiques Angular et TypeScript.
  6. Suis les conventions Angular. L’équipe Angular a établi un ensemble de conventions et de bonnes pratiques pour structurer et organiser les projets Angular. En suivant ces conventions, tu faciliteras la collaboration avec d’autres développeurs et la maintenance de ton application. Tu peux consulter le guide officiel des conventions Angular ici : https://angular.io/guide/styleguide
  7. Évite les styles globaux. Limite l’utilisation de styles globaux dans ton application et préfère les styles encapsulés dans les composants. Les styles globaux peuvent causer des conflits et rendre difficile le contrôle de l’apparence de ton application.
  8. Utilise le lazy-loading. Le lazy-loading permet de charger les modules de ton application à la demande, améliorant ainsi les performances initiales de ton application. Utilise le lazy-loading pour les fonctionnalités qui ne sont pas immédiatement nécessaires à l’utilisateur lors du chargement initial de ton application.

QCM

Testez vos connaissances sur ce sujet

TL;DR

Cet article a couvert différents aspects de l’encapsulation des vues en Angular, en mettant l’accent sur l’encapsulation émulée. Nous avons également vu comment configurer et utiliser Visual Studio Code pour travailler plus efficacement avec Angular. Enfin, nous avons discuté de plusieurs conseils et bonnes pratiques pour améliorer la qualité et la maintenabilité de votre code Angular.