La configuration de innerHTML est synchrone, tout comme la plupart des modifications que vous pouvez apporter au DOM. Cependant, le rendu de la page Web est une autre histoire.
(N'oubliez pas que DOM signifie "Document Object Model". Il s'agit simplement d'un "modèle", une représentation de données. Ce que l'utilisateur voit sur son écran est une image de ce à quoi ce modèle devrait ressembler. Ainsi, changer de modèle ne se fait pas instantanément changer l'image - la mise à jour prend un certain temps.)
L'exécution de JavaScript et le rendu de la page Web se produisent en fait séparément. Pour simplifier, tout d'abord le JavaScript de la page s'exécute (à partir de la boucle d'événements - regardez cette excellente vidéo pour plus de détails), puis après que le navigateur rend toute modification apportée à la page Web pour l'utilisateur de voir. C'est pourquoi le "blocage" est si important - l'exécution de code intensif en calcul empêche le navigateur de passer l'étape "exécuter JS" et de passer à l'étape "rendre la page", provoquant le gel ou le bégaiement de la page.
Le pipeline de Chrome ressemble à ceci:
Comme vous pouvez le voir, tout le JavaScript se produit en premier. Ensuite, la page est stylisée, mise en page, peinte et composée - le «rendu». Tout ce pipeline n'exécutera pas chaque image. Cela dépend des éléments de page modifiés, le cas échéant, et de la manière dont ils doivent être rendus.
Remarque: alert()
est également synchrone et s'exécute pendant l'étape JavaScript, c'est pourquoi la boîte de dialogue d'alerte apparaît avant que vous ne voyiez les modifications apportées à la page Web.
Vous pourriez maintenant demander "Attendez, qu'est-ce qui est exactement exécuté dans cette étape 'JavaScript' du pipeline? Est-ce que tout mon code s'exécute 60 fois par seconde?" La réponse est "non", et cela revient au fonctionnement de la boucle d'événements JS. Le code JS ne s'exécute que s'il est dans la pile - à partir d'éléments tels que les écouteurs d'événements, les délais d'attente, etc. Voir la vidéo précédente (vraiment).
https://developers.google.com/web/fundamentals/performance/rendering/