L'expérience de Tecnoblog avec les commentaires Discourse

Salut !

Je suis vraiment enthousiaste à l’idée de cette nouvelle fonctionnalité. J’attends une solution comme celle-ci depuis longtemps, et les premiers retours de nos lecteurs chez Tecnoblog sont excellents — ils adorent avoir la communauté intégrée.

Cependant, après quelques tests en conditions réelles, j’ai repéré quelques obstacles techniques que nous devons surmonter pour que cela ressemble à un système de commentaires véritablement natif et, plus important encore, pour le rendre viable pour les sites à fort trafic.

Voici ce que j’ai découvert jusqu’à présent :

1. Performance et charge serveur

La charge de notre serveur a augmenté de façon significative après l’intégration de l’application complète. En consultant Cloudflare, notre volume de requêtes a été multiplié par 10. Voici quelques idées pour optimiser cela :

  • Chargement différé (Lazy Loading) : Mettre en place un chargement différé pour le JS aide beaucoup (j’utilise déjà une solution de contournement pour cela).
            <script type="text/javascript">
                DiscourseEmbed = {
                    discourseUrl: '<?php echo esc_url($discourse_url); ?>',
                    
                    <?php if ($use_topic_id): ?>
                        // Mode ID : Sujet enregistré en base, immunisé contre les changements d'URL
                        topicId: <?php echo intval($topic_id); ?>,
                    <?php else: ?>
                        // Mode URL : Solution de repli en cas d'échec de la création via l'API
                        discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                    <?php endif; ?>
                    fullApp: true,
                    embedHeight: '800px',
                };

                (function() {
                    var container = document.getElementById('discourse-comments');

                    // Vérifie si le navigateur prend en charge IntersectionObserver
                    if ('IntersectionObserver' in window) {
                        var observer = new IntersectionObserver(function(entries, observer) {
                            entries.forEach(function(entry) {
                                if (entry.isIntersecting) {
                                    // Quand le div entre dans la fenêtre, charge le script
                                    loadDiscourse();
                                    observer.unobserve(entry.target);
                                }
                            });
                        }, { rootMargin: "1500px" }); // Charge 1500px avant d'atteindre le div

                        observer.observe(container);
                    } else {
                        // Solution de repli pour les anciens navigateurs
                        loadDiscourse();
                    }

                    function loadDiscourse() {
                        var d = document.createElement('script'); 
                        d.type = 'text/javascript'; 
                        d.async = true;
                        d.src = window.DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
                    }
                })();
            </script>

Ici, vous pouvez voir la baisse du nombre de requêtes après la mise en place du chargement différé (et certaines parties du site étaient encore en cache, donc ce n’est pas le résultat final) :

  • Réduction de la charge utile : Pouvons-nous réduire les ressources chargées dans l’intégration ? Par exemple, j’ai remarqué des requêtes pour les URL de chat et les vérifications de crédits IA — sont-elles nécessaires pour la vue intégrée ?

  • Fréquence des requêtes : Les requêtes POST en temps réel sont un peu agressives. Peut-être pouvons-nous réduire la fréquence de sondage pour la version intégrée ?

  • Cache : Une gestion améliorée du cache pour les sujets intégrés afin de gérer les pics de trafic.

2. Problèmes d’analyse (Analytics)

Pour l’instant, l’intégration déclenche les scripts Google Analytics/GTM. Cela double nos pages vues (un clic pour l’article, un autre pour l’iframe), ce qui fausse nos données. Il serait idéal que le système puisse détecter qu’il est dans une iframe et désactiver automatiquement tous les scripts de suivi (y compris les analyses Discourse).

3. Le problème de hauteur de l’iframe

C’est probablement le plus grand obstacle pour l’expérience utilisateur. Si un article n’a aucun commentaire, il y a un espace vide étrange. S’il y a un long fil de discussion, l’iframe est coupée après les 2 ou 3 premiers commentaires, obligeant à un « défilement dans un défilement », ce qui est assez mauvais, surtout sur mobile.

Pour vraiment rivaliser avec quelque chose comme Disqus, nous avons besoin d’une hauteur dynamique (selon le nombre de commentaires) et aussi d’un bouton « Lire la suite » qui développe le fil après un certain nombre de réponses.

4. Conflits de plugins

Comme l’intégration charge tous les plugins actifs, nous observons certains comportements étranges. Par exemple, « Google One Tap » apparaît à l’intérieur de l’article de blog. Lorsqu’un utilisateur se connecte, l’iframe se rafraîchit et le redirige vers la page d’accueil de la communauté au lieu du fil de commentaires. Pouvoir désactiver manuellement certains plugins pour la vue intégrée serait une véritable aubaine.

5. Friction lors de la connexion

Le flux actuel est un vrai tueur de conversion : L’utilisateur clique sur connexion → Un nouvel onglet s’ouvre → La connexion se fait → L’utilisateur se retrouve sur la page d’accueil de la communauté. Sur l’article de blog, l’iframe semble toujours déconnecté jusqu’à ce que l’utilisateur rafraîchisse manuellement toute la page. C’est une boucle confuse qui pousse les gens à abandonner et à partir avant de commenter.

Depuis l’activation de la nouvelle intégration, nos inscriptions quotidiennes ont plus que doublé, ce qui est excellent. Cependant, nos métriques d’engagement n’ont pas bougé. En fait, notre DAU/MAU a baissé — nous avons plus d’utilisateurs connectés, mais ils n’interagissent pas. Des métriques comme « Utilisateurs engagés quotidiens », « Nouveaux contributeurs » et « Publications » n’ont vu aucune augmentation.

Cela prouve que les gens veulent rejoindre la conversation, mais ils se perdent dans la boucle de connexion et abandonnent l’article avant de pouvoir réellement commenter.

6. Interface mobile

Sur mobile, la fenêtre de réponse prend tout l’écran, donc on perd tout le contexte de la conversation à laquelle on répond. Cela fait un peu claustrophobe — tout ce qu’on peut faire pour la rendre plus compacte serait un gros avantage.


Je veux vraiment que ce soit le système par défaut pour Tecnoblog (et aussi pour un autre site que nous possédons). Faites-moi savoir si vous voulez approfondir l’un de ces points !

14 « J'aime »

Ce problème sera corrigé par

11 « J'aime »

Merci pour les retours détaillés @Thiago_Mobilon !

Je vais travailler sur la liste et essayer de tout couvrir au final.

Je viens de faire un check ici, et il semble que votre CSS soit mal configuré sur votre site Discourse. Vous avez des en-têtes cache-control en double, et l’un d’eux est no-cache.

curl -v https://tecnoblog.net/comunidade/stylesheets/common_cd45efa28175431b0b8ff143783178d55206920b.css?__ws=tecnoblog.net -s 2>&1 | grep cache-control
< cache-control: max-age=31556952, public, immutable
< cache-control: no-store, no-cache, must-revalidate, private
9 « J'aime »

Utilisez-vous l’intégration Google Analytics intégrée à Discourse ?

8 « J'aime »

Cela est géré dans

9 « J'aime »

Géré dans

11 « J'aime »

Je pense que Cloudflare a dû ajouter cet en-tête parce que j’ai contourné la mise en cache pour le répertoire /comunidade/. Si je ne le supprime pas, il appliquera ses règles de mise en cache au CSS et au JS de Discourse, ce qui pourrait potentiellement créer des conflits plus tard.

En tout cas, lorsque j’ai soulevé la question de la mise en cache, c’était surtout dans le but de réduire la charge du serveur. Les fichiers CSS sont statiques, n’est-ce pas ? Si c’est le cas, le fait qu’ils ne soient pas mis en cache, bien que regrettable, n’aurait pas d’impact direct sur la charge du serveur.

5 « J'aime »

J’utilise l’intégration de Discourse avec Google Tag Manager.

4 « J'aime »

Ils ont un impact sur les performances pour les utilisateurs finaux, car il s’agit de 59 requêtes qui téléchargent 1,43 Mo de CSS (compressé à 340 Ko) pour chaque article.

Et ils sont également servis par le serveur Ruby, car nous nous attendons à ce que les sites ne cassent pas le cache, ce qui signifie que, dans des conditions normales, cette route est très rarement utilisée.

Si je ne me trompe pas, servir ces fichiers avec un cache cassé signifie qu’ils atteignent même la base de données.

4 « J'aime »

C’est une excellente idée, j’ajoute un support natif pour cela

11 « J'aime »

C’est un problème plus général lié à la rédaction en déplacement, et il sera amélioré grâce aux évolutions de Creating/Editing a post on mobile: let's discuss the 2026 Discourse experience.

8 « J'aime »

Nous disposons d’un cache performant pour les utilisateurs anonymes accédant aux pages de sujets, et il couvre également ce nouveau mode. Vous devriez donc pouvoir passer à l’échelle sans problème pour absorber les pics de trafic, à condition d’avoir suffisamment de workers Pitchfork et de workers Redis I/O.

5 « J'aime »

Le polling réduit automatiquement sa fréquence sur les onglets en arrière-plan ou lors d’événements de charge élevée, et il en va de même ici.

5 « J'aime »

J’ai activé le balisage pour ceux-ci

8 « J'aime »

Je rencontre des difficultés pour faire fonctionner la hauteur dynamique correctement. Malgré la mise à jour de Discourse et l’actualisation de mon extrait avec les dernières configurations, le problème persiste.

        <h4 class="comments-main-title component-title">Commentaires</h4>
        <div id='discourse-comments'></div>

        <meta name='discourse-username' content='<?php echo esc_attr($discourse_author); ?>'>

        <script type="text/javascript">
            DiscourseEmbed = {
                discourseUrl: '<?php echo esc_url($discourse_url); ?>',
                
                <?php if ($use_topic_id): ?>
                    // Mode ID : Sujet enregistré en base de données, immunisé contre les changements d'URL
                    topicId: <?php echo intval($topic_id); ?>,
                <?php else: ?>
                    // Mode URL : Solution de repli en cas d'échec de la création via l'API
                    discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                <?php endif; ?>
                fullApp: true,
                lazyLoad: true, // désactiver le chargement paresseux de l'iframe
                lazyLoadMargin: '1500', // pixels avant le viewport pour commencer le chargement
                dynamicHeight: true,
                embedMinHeight: '400',
                embedMaxHeight: '3000',
					  embedHeight: '800px',
                // className: 'CLASS_NAME',
            };

            (function() {
            var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
            d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
            })();
        </script>
4 « J'aime »

Pourrions-nous utiliser <iframe loading="lazy"> ici ? Ainsi, nous n’aurions pas besoin de JS personnalisé ou d’observateurs d’intersection ?

4 « J'aime »

Ah, c’est maintenant largement pris en charge par les navigateurs ? Je viens de l’apprendre ! Je vais changer ça dès que possible.

8 « J'aime »

Merci pour les tests, le problème a été identifié

5 « J'aime »

Excellent ! La hauteur dynamique fonctionne désormais comme prévu. Cependant, cela a introduit un petit problème : lorsque je clique pour répondre, le champ de saisie de la réponse tente de s’ajuster à la hauteur de l’iframe. Dans ce cas, il est devenu erronément de 7385px de hauteur.

Le message contenait 31 commentaires, et l’iframe intégré faisait 9757px de hauteur (j’avais réglé embedMaxHeight à 15000px).

Mise à jour : J’ai remarqué que le formulaire de commentaire étend la hauteur de l’iframe à son maximum, donc lorsque je clique sur « annuler », la mise en page se termine avec un grand espace vide restant sous les commentaires.

Screenshot 2026-04-16 at 16.03.37

5 « J'aime »

Je pense que vous aurez besoin d’une max-height à une valeur plus raisonnable, comme 1000 à 1500px.

Ainsi, cette fonctionnalité couvrira votre problème initial :

et augmentera jusqu’à un certain point, mais étant donné le comportement de défilement infini natif de Discourse, vous ne voulez pas que la hauteur augmente autant.

Cette fonctionnalité ne supprimera pas le « défilement dans le défilement » de sitôt.

En ce qui concerne le composeur mobile, je regarde ce que nous pouvons faire ici.

6 « J'aime »