Lightning Web Components (LWC) est le framework moderne de Salesforce pour construire des interfaces utilisateur, basé sur les standards du web (Web Components, ES6+) plutôt que sur un framework propriétaire. Pour un éditeur AppExchange, maîtriser LWC est indispensable : c'est le modèle recommandé par Salesforce pour toute nouvelle interface, plus performant et plus facilement audité lors de la Security Review que l'ancien Aura.
Un composant LWC repose sur trois fichiers minimum, tous nommés de façon identique dans un même dossier :
LightningElement.// monComposant.js
import { LightningElement, api, track } from 'lwc';
export default class MonComposant extends LightningElement {
@api recordId;
@track message = 'Bonjour';
handleClick() {
this.message = 'Composant cliqué';
}
}
Le template associé utilise une directive simple pour le binding et les événements :
<template>
<p>{message}</p>
<lightning-button label="Cliquer" onclick={handleClick}></lightning-button>
</template>
Trois décorateurs structurent la majorité des composants :
getRecord), une méthode Apex, ou un objet Lightning Data Service.import { LightningElement, wire } from 'lwc';
import getContacts from '@salesforce/apex/ContactController.getContacts';
export default class ListeContacts extends LightningElement {
@wire(getContacts) contacts;
}
Trois patterns couvrent la quasi-totalité des besoins :
@api.on<nomevenement> sur le parent.querySelector à outrance) au lieu d'utiliser le binding réactif, ce qui casse l'encapsulation Shadow DOM.Pour un composant destiné à un package AppExchange, testez systématiquement son rendu en mode Lightning Experience et en Salesforce Mobile : un composant qui fonctionne parfaitement sur desktop peut casser sur mobile si le CSS n'est pas responsive.
Salesforce fournit sfdx-lwc-jest, une extension de Jest adaptée aux composants LWC. Chaque composant critique de votre package devrait avoir des tests unitaires couvrant au minimum le rendu initial et les interactions utilisateur principales :
import { createElement } from 'lwc';
import MonComposant from 'c/monComposant';
test('affiche le message par défaut', () => {
const element = createElement('c-mon-composant', { is: MonComposant });
document.body.appendChild(element);
const p = element.shadowRoot.querySelector('p');
expect(p.textContent).toBe('Bonjour');
});
Démarrer avec LWC demande un peu de rigueur au début (structure de fichiers, réactivité, Shadow DOM), mais le gain en performance et en maintenabilité est net par rapport aux anciennes approches. C'est aujourd'hui le socle incontournable de toute application AppExchange moderne.
Notre équipe DevToSpace développe et publie des applications AppExchange de bout en bout, de l'idée à la Security Review.
Parler à un expert