Le Server Side Rendering est un concept de plus en plus populaire grâce à ses nombreux avantages.
Néanmoins, cela reste un concept difficile à appréhender et il est important de bien comprendre son fonctionnement avant de le mettre en place.
Si vous préférez le format vidéo, voici la vidéo YouTube correspondante à cet article.
Single Page Application
Tout d’abord il faut être à l’aise avec les concepts de Single Page Application (SPA) et de Client Side Rendering (CSR).
Le framework Angular permet de créer des SPA, une SPA est un type d'application web qui charge une seule page initiale et met à jour son contenu dynamiquement sans recharger la page entière depuis le serveur.
Le navigateur exécute du Javascript pour générer les pages sans requêter le serveur
Le rendu de la page se fait côté client, où le navigateur gère le rendu et l'affichage des pages, d’où le nom de Client Side Rendering.
Avec du Client-Side Rendering, le chargement initial de notre application se fait en deux temps :
Le bundle correspond à tous les fichiers Html, Javascript et CSS de notre application Angular.
Le bundle est principalement constitué de fichier Javascript car lors du build de notre application, le build transforme tous nos fichiers Typescript et HTML en fichiers Javascript (à l'exception du fichier index.html).
Dossier du bundle d'une application Angular après un ng build
Nous pouvons voir très facilement le chargement du bundle de notre application en allant dans l’onglet Network du navigateur.
Ci-dessous vous pouvez voir le chargement d’une application Angular.
Chargement des fichiers du bundle (Onglet Network)
Parmi ces fichiers HTML, Javascript et CSS, le fichier le plus important est le document HTML. C’est le document principal de l’application, le fichier “index.html” de notre bundle, c’est lui qui est chargé en premier et qui donne les liens des autres fichiers du bundle.
Avec du Client Side Rendering, le document HTML de l’application est aussi appelé squelette de l’application, car le body du document HTML est vide et ne contient que les liens vers les autres fichiers.
Document principal HTML ou Squelette
Ce n’est qu’une fois le bundle totalement chargé par le navigateur, que celui-ci exécute le Javascript qui permet de générer la page de l’application.
C’est à ce moment-là que nous allons afficher nos composants Angular à l’utilisateur. Et si nos composants ont besoin de données provenant d’API c’est maintenant que nous allons les charger.
Résumé du Client-Side Rendering
Avec le Client-Side Rendering nous devons d’abord charger le bundle de notre application. Pour cela nous chargeons d’abord le Squelette HTML de notre application qui va nous permettre de charger les autres fichiers du bundle (Javascript et CSS).
Ce n’est qu’une fois les fichiers du bundle chargés, que le rendement de nos pages commencent, c’est ce qu’on appelle le Client-Side Rendering.
Voici le fonctionnement du Client-Side Rendering avec une image :
Fonctionnement du Client Side Rendering
Le Client Side Rendering est très facile à mettre en place, car activé par défaut sur tous les frameworks modernes de Single Page Application. Néanmoins, il possède deux inconvénients majeurs.
Pages incompréhensibles pour les robots
Le premier inconvénient concerne les applications qui ont pour but d’être bien référencées sur les moteurs de recherche. Le problème est que nous envoyons un document HTML vide aux robots et ce document par lui-même est incompréhensible pour les robots.
Le robot reçoit une page sans contenu
Seuls les robots les plus avancés pourront potentiellement charger votre application entièrement, mais même là le rendement des pages peut poser problème. C’est pour cela que même Google conseille aux développeurs de mettre en place du Server Side Rendering pour éviter ce problème.
Performances dégradées pour le premier chargement de l’application
Le deuxième inconvénient majeur, qui concerne à la fois les applications publiques référençables et les applications privées (Dashboard d’un SAAS, applications internes à une entreprise…), c’est que le temps de chargement initial de notre application est dégradé avec le Client Side Rendering.
Le rendement de la page n'a lieu qu'après le chargement du bundle (CSR)
En effet, pour que le rendement de la page commence, le client doit attendre d’avoir fini de télécharger tous les fichiers du bundle. Et le temps de téléchargement sera plus ou moins dégradé suivant la bande passante du client (Fibre, 4G, 3G).
Et une fois le chargement du bundle effectué, le rendement de la page demande des ressources au processeur du client, le processeur pouvant être de très faible puissance (Mobile) et/ou monopolisé par d’autres tâches.
Si vous pensez que votre application n’a pas ce problème de performance, je vous invite à lancer un test avec l’outil Lighthouse ou PageSpeed Insights en mode Mobile et vous vous rendrez compte du problème de performances.
Ces deux inconvénients sont les raisons principales pour lesquelles vous entendez autant parler de Server Side Rendering.
Comprendre le Server Side Rendering
Angular permet de mettre en place le Server Side Rendering avec leur librairie nommée Angular Universal, renommée Angular SSR à partir de la version 17 (Le fonctionnement est exactement le même).
Rendement de la page statique
Une fois que l’on a installé Angular Universal ou Angular SSR sur notre projet. Lorsque le client arrive sur notre application, le serveur va rendre la page côté serveur (Server Side Rendering), puis l’envoyer au client.
Rendement de la page côté serveur avec le Server Side Rendering
Le document HTML principal que reçoit le client n’est plus un squelette comme avec le Client Side Rendering, mais une page complète.
Document HTML principal contenant une page complète
Cette page étant complète, elle peut être affichée directement dans le navigateur du client.
Transition vers la Single Page Application
La page rendue côté serveur, envoyée au client, est une page statique qui n’a pas les fonctionnalités d’une Single Page Application. Et il serait dommage de se priver des fonctionnalités des SPA modernes et de revenir aux pages statiques des années 2000.
Pour cela, Angular ne renvoie pas seulement une page statique, mais il fait une transition de la page statique à la Single Page Application en chargeant le bundle en arrière-plan, ce qui est invisible pour l’utilisateur.
Téléchargement des fichiers du bundle et transition vers une Single Page Application
Le Server-Side Rendering se déroule donc en deux parties :
Fonctionnement du Server Side Rendering avec Angular
Le Server Side Rendering possède deux avantages très importants pour notre application Angular.
Pages compréhensibles par les robots
Notre serveur renvoie maintenant une page complète aux robots des moteurs de recherche ou des réseaux sociaux.
Ces derniers pourront donc parcourir facilement notre page, cela permettra aux robots d’afficher un titre et une description professionnels dans les résultats de recherche. Mais aussi d’analyser le contenu de notre page pour la proposer de manière pertinente aux utilisateurs des moteurs de recherche.
De plus, cela nous permettra d’avoir des prévisualisations lorsque l’on va partager un lien de notre site sur un réseau social.
Un chargement initial ultra rapide
Ensuite, de par son fonctionnement, le Server Side Rendering fournit directement au client une page complète en HTML que le client peut afficher directement, sans devoir exécuter du Javascript !
Le navigateur reçoit directement une page complète à afficher (SSR)
Le chargement initial de notre page est donc beaucoup plus rapide, car la page complète est un fichier beaucoup moins volumineux que l’ensemble du bundle (bande passante) et que la page n’a pas besoin de Javascript pour être affichée (processeur).
Ce chargement initial plus rapide évite les abandons de page lors du chargement, car 53% des internautes abandonnent un site s’il met plus de 3 sec à charger (Source: Google).
Cette performance améliore aussi la satisfaction des utilisateurs et augmente leur engagement, en effet, une amélioration de 2 sec dans le temps de chargement permet de doubler le taux de conversion (Source: Cloudflare).
Le Server Side Rendering a malgré tout des inconvénients.
Le premier inconvénient est que le Server Side Rendering a besoin d’un serveur pour fonctionner, ce qui nécessite une infrastructure différente qu’avec le Client Side Rendering. Ce serveur a aussi un coût plus élevé que les CDN qui sont généralement gratuits et qui suffisent pour du CSR.
Le deuxième inconvénient est une contrainte pour les développeurs. En effet, à partir du moment où le SSR est mis en place, notre application va s’exécuter dans deux contextes différents: Le Navigateur et Le Serveur.
Le développeur doit avoir une vision claire de ces deux contextes d’exécution car ils ont chacun des fonctionnalités qui leur sont propres. Par exemple, vous ne pouvez pas utiliser le localStorage côté serveur car c’est une fonctionnalité réservée à l’API du navigateur (Browser API).
C’est pourquoi il est important de faire attention en mettant en place le SSR, sous peine de facilement casser son application.
Ces inconvénients sont principalement des contraintes techniques ou de développement. Les avantages étant orientés résultats (SEO, Performances, Engagement utilisateur…), les avantages du SSR surpassent largement ses inconvénients pour nos projets d’applications web.
Pour conclure, malgré des contraintes techniques et d’infrastructures auxquelles il faut faire attention sous peine de casser notre application, le Server-Side Rendering est indispensable pour réaliser des applications Angular SEO-Friendly et pour obtenir des performances inégalées sur l’ensemble de nos applications Angular.
Abonnez vous pour ne pas rater les nouveaux articles !
© Gaëtan Rouziès - Tous Droits Réservés