Html
Senior
Quiz-Html-Senior
Shadow-Dom
Web-Components
Performance-Web
Core-Web-Vitals
Csp-Securite
Cors
Intersection-Observer
Resource-Timing-Api
Subresource-Integrity
Http2
Bfcache
Qcm-Html-Avance
📝
HTML Senior — Performance et APIs
20 questions avancées HTML : shadow DOM, web components, performance (CLS, LCP, FID), sécurité (CSP, CORS, SRI), APIs natives (Intersection Observer, Resource Timing), optimisation des ressources et architectures modernes du web. Idéal pour réussir un entretien HTML Senior.
Banque de révision : les 25 questions corrigées
Voici l'intégralité des 25 questions de « HTML Senior — Performance et APIs », chacune avec sa bonne réponse et son explication. Le quiz interactif ci-dessus en tire une sélection aléatoire à chaque tentative — utilisez cette liste complète pour réviser.
Explication :
Les navigateurs ont trois modes de rendu : Quirks (compatible anciens navigateurs, box model différent), Almost Standards (quelques compromis), Standards (rendu standard complet). Le DOCTYPE déclenche le mode. Un
<!DOCTYPE html> déclenche le mode standards dans tous les navigateurs modernes.
Toujours utiliser
<!DOCTYPE html> pour garantir le mode standards. Évitez les DOCTYPEs transitionnels ou frameset qui déclenchent le mode almost standards dans certains navigateurs.
Explication :
Le speculative parsing (ou preload scanner) est une optimisation des navigateurs. Pendant que le parser principal construit le DOM (bloqué par les scripts), un scanner secondaire analyse le reste du HTML pour découvrir et charger les ressources (images, CSS, scripts) en parallèle.
Pour optimiser : placez les
<link rel="preload"> pour les ressources critiques, utilisez async/defer pour les scripts non bloquants.
Explication :
Normal : le navigateur arrête le parsing HTML, télécharge et exécute le script immédiatement. Async : télécharge en parallèle du parsing, exécute dès que disponible (peut interrompre le parsing). Defer : télécharge en parallèle, exécute dans l'ordre après le parsing HTML complet (avant DOMContentLoaded).
Utilisez
defer pour les scripts qui dépendent du DOM complet, async pour les scripts indépendants (analytics), normal pour les scripts critiques.
Explication :
Le layout thrashing est un problème de performance causé par des accès répétés à des propriétés qui forcent un reflow synchrone (offsetHeight, clientWidth, scrollTop, etc.) entre des modifications du DOM. Le navigateur doit recalculer la géométrie à chaque lecture.
Solutions : grouper les lectures, puis les écritures ; utiliser
requestAnimationFrame ; éviter d'accéder aux propriétés de layout dans les boucles.
Explication :
La délégation d'événement exploite le bubbling : on attache un seul écouteur sur un parent (ex: document.body) et on utilise
event.target pour identifier l'élément réel. Avantages : moins d'écouteurs (mémoire), fonctionne pour les éléments ajoutés dynamiquement.
Exemple :
document.querySelector("ul").addEventListener("click", (e) => { if(e.target.tagName === "LI") { ... } })
Explication :
Le Shadow DOM permet de créer un DOM isolé (arbre fantôme) pour un composant. Les styles définis dans le Shadow DOM ne s'appliquent qu'à l'intérieur, et les styles extérieurs ne le traversent pas (sauf via CSS custom properties et parts).
Utilisé par les Web Components. Exemple :
element.attachShadow({ mode: "open" }). Les navigateurs l'utilisent pour les contrôles natifs (<video>).
Explication :
pushState() et replaceState() modifient l'URL et l'historique du navigateur sans rechargement. Pour le SEO : le serveur doit être configuré pour servir la même page (index.html) pour toutes les routes (fallback), ou implémenter le rendu côté serveur (SSR) ou le prérendu.
Pour les SPA, utilisez le rendu côté serveur (Next.js, Nuxt) ou le prérendu (Gatsby) pour le SEO. Configurez votre serveur avec un fallback vers index.html.
Explication :
CSP est un en-tête HTTP (ou meta tag) qui définit les sources autorisées pour les ressources. Exemple :
Content-Security-Policy: script-src "self" https://trusted.cdn.com bloque les scripts inline et les chargements depuis des sources non autorisées, prévenant le XSS.
Commencez en mode "report-only" pour tester. Activez le mode strict avec
nonce ou hash pour les scripts inline.
Explication :
preload : charge une ressource critique nécessaire pour la page courante (ex: police, image LCP). prefetch : charge une ressource probablement utilisée dans les prochaines navigations. preconnect : établit la connexion DNS/TLS à l'avance. prerender : précharge et prérint une page entière.
Utilisez preload pour les ressources critiques, preconnect pour les origines tierces (CDN, APIs), prefetch pour les pages suivantes (ex: page de produit depuis une liste).
Explication :
DOMContentLoaded se déclenche quand le DOM est prêt (HTML parsé, scripts defer exécutés). load attend que toutes les ressources (images, CSS, iframes) soient chargées. LCP (Largest Contentful Paint) se produit généralement entre DOMContentLoaded et load. TTI (Time to Interactive) peut être avant load si les ressources non bloquantes continuent de charger.
Utilisez DOMContentLoaded pour initialiser l'interactivité précoce, load pour charger les ressources secondaires (analytics).
Explication :
L'attribut
loading="lazy" utilise l'Intersection Observer API pour détecter quand l'image ou l'iframe approche du viewport. Le chargement est différé jusqu'à ce moment, améliorant le LCP et économisant la bande passante.
Vérifiez dans les outils développeur (Network tab) que les images ne se chargent qu'au scroll. Ne lazy loader pas les images LCP (visible au chargement).
Explication :
CLS (Cumulative Layout Shift) mesure l'instabilité visuelle. Les déplacements se produisent quand des éléments sont ajoutés ou redimensionnés après le rendu initial (ex: image qui se charge sans dimensions définies).
Solution : toujours spécifier
width et height sur les images, ou utiliser CSS aspect-ratio pour réserver l'espace. Évitez d'insérer du contenu au-dessus d'un contenu existant.
Explication :
srcset permet de fournir différentes résolutions (densité d'écran) de la même image. <picture> permet le "art direction" : différentes images (crops, formats) selon la taille d'écran, ou différents formats (WebP, AVIF) pour la compatibilité.
Utilisez srcset pour les images responsives standards, picture pour le WebP/AVIF (avec fallback JPEG) ou pour des versions recadrées sur mobile.
Explication :
L'élément
<dialog> crée des boîtes de dialogue natives. .showModal() ouvre un modal (bloque le reste de la page, fond semi-transparent). .show() ouvre non-modal. .close() ferme. returnValue récupère la valeur sélectionnée.
Un bouton avec
formmethod="dialog" dans un formulaire ferme automatiquement le dialog. CSS pseudo-element ::backdrop pour styliser le fond.
Explication :
CORS permet aux serveurs de contrôler quels domaines peuvent accéder à leurs ressources. Pour les requêtes "non-simple" (méthode autre que GET/POST, en-têtes personnalisés, content-type non standard), le navigateur envoie un preflight OPTIONS avant la requête réelle pour vérifier les permissions.
Le serveur doit répondre aux OPTIONS avec les en-têtes Access-Control-Allow-*. En développement, un proxy peut éviter les problèmes CORS.
Explication :
Permissions Policy (ex-Feature Policy) permet de débloquer/verrouiller des fonctionnalités du navigateur (geolocation, camera, microphone, autoplay, synchronous XHR, etc.) pour la page et ses iframes.
Exemple :
Permissions-Policy: geolocation=(self), camera=(). Utile pour la sécurité et les performances (ex: désactiver synchronous XHR).
Explication :
Intersection Observer est une API asynchrone qui exécute un callback quand un élément entre/sort du viewport ou d'un élément racine. Contrairement à
scroll + getBoundingClientRect (synchrone, force reflow), l'Observer fonctionne hors du thread principal, ne bloque pas le rendu, et est plus performant.
Cas d'usage : lazy loading d'images, chargement infini (infinite scroll), tracking de visibilité, animations au scroll.
Explication :
Navigation Timing API (performance.timing déprécié, performance.getEntriesByType("navigation")) donne les métriques de chargement de la page. Resource Timing API (performance.getEntriesByType("resource")) donne les détails de chaque ressource individuelle (temps DNS, connexion, transfert).
Utilisez PerformanceObserver pour capturer les métriques en temps réel. Ces API sont la base des outils RUM (Real User Monitoring).
Explication :
L'attribut
crossorigin contrôle si les requêtes cross-origin envoient les credentials (cookies, certificats client). Valeurs : "anonymous" (pas de credentials), "use-credentials" (avec credentials). Affecte aussi la tainted canvas : une image cross-origin sans CORS approprié ne peut pas être lue par canvas.getImageData().
Pour les scripts externes, crossorigin="anonymous" est nécessaire pour capturer les erreurs (window.onerror).
Explication :
HTTP/2 Server Push permet au serveur d'envoyer des ressources sans attendre la requête. Problèmes : sur-envoi (ressources déjà en cache), compétition avec la bande passante, suppression de la priorisation.
preload est préféré car il respecte le cache et donne plus de contrôle.
Si vous utilisez Server Push, implémentez la détection de cache avec l'en-tête
Cache-Digest. Dans la plupart des cas, preload est plus simple et efficace.
Explication :
SRI (Subresource Integrity) utilise l'attribut
integrity avec un hash (SHA-256, SHA-384, SHA-512) des ressources externes (scripts, styles). Si la ressource chargée ne correspond pas au hash (ex: CDN hackée, attaque MITM), le navigateur bloque l'exécution.
Exemple :
<script src="https://cdn.com/lib.js" integrity="sha384-..." crossorigin="anonymous"></script>. Générez les hashs avec openssl dgst -sha384 fichier.js.
Explication :
Shadow DOM ouvert : accessible en JavaScript (element.shadowRoot). Fermé : inaccessible (null), utilisé par certains composants natifs (video). Pour l'accessibilité, les relations ARIA ne traversent pas les frontières du shadow DOM ; il faut dupliquer les attributs ARIA ou utiliser des parties accessibles (ElementInternals).
Pour les composants personnalisés, utilisez mode: "open" pour faciliter le débogage et l'accessibilité. Utilisez
ElementInternals pour exposer les rôles ARIA.
Explication :
Les ressources render-blocking sont les CSS externes (bloquent le rendu) et les scripts synchrones (bloquent le parsing HTML). Pour optimiser : inline le CSS critique (au-dessus de la fold), différer le CSS non critique avec
media="print" onload, utiliser defer/async pour les scripts.
Utilisez Lighthouse ou WebPageTest pour identifier les ressources bloquantes. Visez un First Paint < 1s.
Explication :
Le BFCache (ou page cache) garde la page dans un état figé (y compris l'état JavaScript). Quand l'utilitaire utilise retour/avant, la page est restaurée instantanément. L'événement
pageshow avec event.persisted indique si la page vient du BFCache.
Évitez de casser le BFCache (onunload, unload). Utilisez
pageshow pour rafraîchir les données obsolètes. Le BFCache est excellent pour les performances.
Explication :
FOIT (Flash of Invisible Text) : texte invisible jusqu'au chargement de la police. FOUT (Flash of Unstyled Text) : police système puis remplacement. font-display : swap (FOUT, recommandé pour la performance perçue), optional (utilise le cache, pas de fallback réseau), fallback (FOIT très court puis swap), block (FOIT long).
Utilisez
font-display: swap pour le texte principal. Préchargez les polices critiques avec <link rel="preload" as="font">. Utilisez des polices variables pour réduire le nombre de fichiers.