Web Components : standard natif

Découvrez comment les Web Components, standard natif du web, permettent de créer des composants réutilisables et encapsulés pour simplifier le développement front-end, sans dépendre d'un framework.

Olivier Dupuy
02 août 2025

1

Vues

0

Commentaires

2

Min de lecture

Les Web Components représentent une avancée majeure dans le développement web moderne, offrant aux développeurs la possibilité de créer des composants réutilisables natifs, sans dépendre de frameworks. Pour les développeurs .NET habitués aux composants Blazor ou aux contrôles ASP.NET, cette approche native apporte une nouvelle perspective sur la modularité frontend.

Fondamentaux des Web Components

Les Web Components reposent sur trois technologies clés :

  • Custom Elements : Permet de définir de nouveaux éléments HTML
  • Shadow DOM : Offre un DOM encapsulé pour isoler le style et la structure
  • HTML Templates : Définit des fragments HTML réutilisables

Création d'un Custom Element


// Définition d'un composant personnalisé
class UserCard extends HTMLElement {
    constructor() {
        super();
        
        // Création du Shadow DOM
        const shadow = this.attachShadow({mode: 'open'});
        
        // Template du composant
        const template = `
            <style>
                .card {
                    border: 1px solid #ccc;
                    padding: 1rem;
                }
            </style>
            <div class="card">
                <h3><slot name="username"></slot></h3>
                <div><slot name="content"></slot></div>
            </div>
        `;
        
        shadow.innerHTML = template;
    }
}

// Enregistrement du composant customElements.define('user-card', UserCard);

Intégration avec ASP.NET Core

L'intégration des Web Components dans une application ASP.NET Core est directe et ne nécessite pas de configuration particulière :


// Dans Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseStaticFiles(); // Permet de servir les fichiers JavaScript
    
    // Configuration des routes
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Utilisation dans une vue Razor


@page
@model IndexModel

<!-- Utilisation du Web Component --> <user-card> <span slot="username">@Model.Username</span> <div slot="content">@Model.UserContent</div> </user-card>

@section Scripts { <script src="~/js/components/user-card.js"></script> }

Bonnes Pratiques et Patterns

  • Naming Conventions : Utilisez des noms avec tirets pour les custom elements (ex: user-card)
  • Lifecycle Hooks : Exploitez les méthodes du cycle de vie (connectedCallback, disconnectedCallback)
  • State Management : Implémentez une gestion d'état propre via les attributs et propriétés

Gestion des Attributs


class UserCard extends HTMLElement {
    static get observedAttributes() {
        return ['user-id', 'theme'];
    }
    
    attributeChangedCallback(name, oldValue, newValue) {
        if (name === 'theme') {
            this.updateTheme(newValue);
        }
    }
    
    updateTheme(theme) {
        const card = this.shadowRoot.querySelector('.card');
        card.className = `card ${theme}`;
    }
}

Tests et Validation

Les Web Components peuvent être testés avec des frameworks comme Jest :


describe('UserCard', () => {
    let userCard;
    
    beforeEach(() => {
        userCard = document.createElement('user-card');
        document.body.appendChild(userCard);
    });
    
    afterEach(() => {
        userCard.remove();
    });
    
    test('should render username', () => {
        const username = userCard.shadowRoot.querySelector('h3');
        expect(username).not.toBeNull();
    });
});

Considérations de Performance

  • Utilisez adoptedStyleSheets pour partager les styles entre composants
  • Évitez les manipulations DOM excessives dans le constructeur
  • Implémentez le lazy loading pour les composants complexes

Optimisation du Rendu


// Utilisation de adoptedStyleSheets
const sheet = new CSSStyleSheet();
sheet.replaceSync(`
    .card {
        border: 1px solid #ccc;
        padding: 1rem;
    }
`);

class UserCard extends HTMLElement { constructor() { super(); const shadow = this.attachShadow({mode: 'open'}); shadow.adoptedStyleSheets = [sheet]; } }

Cas d'Usage Avancés

Les Web Components excellent dans plusieurs scénarios :

  • Création de bibliothèques de composants réutilisables
  • Intégration avec différents frameworks
  • Développement de widgets embarquables

Communication Inter-Composants


class UserList extends HTMLElement {
    connectedCallback() {
        this.addEventListener('user-selected', (e) => {
            console.log('User selected:', e.detail);
        });
    }
}

class UserItem extends HTMLElement { selectUser() { this.dispatchEvent(new CustomEvent('user-selected', { bubbles: true, composed: true, detail: { id: this.getAttribute('user-id') } })); } }

Conclusion

Les Web Components offrent une solution native puissante pour créer des composants réutilisables. Pour les développeurs .NET, ils représentent une alternative intéressante aux frameworks JavaScript traditionnels, particulièrement pour des projets nécessitant une forte interopérabilité et une maintenance à long terme.

Points clés à retenir :

  • Standard natif supporté par les navigateurs modernes
  • Encapsulation forte grâce au Shadow DOM
  • Excellente interopérabilité avec les frameworks existants
  • Performance optimale sans dépendances externes
Partager cet article
42
12

Commentaires (0)

Rejoignez la discussion

Connectez-vous pour partager votre avis et échanger avec la communauté

Première discussion

Soyez le premier à partager votre avis sur cet article !

À propos de l'auteur
Olivier Dupuy

Développeur passionné et contributeur actif de la communauté technique.

Profil
Articles similaires
Responsive Design en 2024
01 août 2025 2
JavaScript & Frontend
Next.js 14 : Server Components
31 juil. 2025 7
JavaScript & Frontend
State management avec Redux Toolkit
30 juil. 2025 3
JavaScript & Frontend
Navigation rapide
Commentaires (0)