L'esperienza di Tecnoblog con i commenti di Discourse

Ciao!

Sono davvero entusiasta di questa nuova funzionalità. Aspettavo da tempo una soluzione del genere e i primi feedback dei nostri lettori di Tecnoblog sono stati eccellenti: adorano avere la comunità integrata.

Tuttavia, dopo alcuni test nel mondo reale, ho individuato alcuni ostacoli tecnici che dobbiamo superare per rendere il sistema di commenti più simile a uno nativo e, soprattutto, sostenibile per siti ad alto traffico.

Ecco cosa ho riscontrato finora:

1. Prestazioni e carico del server

Il carico del nostro server è aumentato significativamente dopo aver incorporato l’app completa. Guardando su Cloudflare, il volume delle richieste è aumentato di 10 volte. Ecco alcune idee su come ottimizzare questo aspetto:

  • Caricamento differito (Lazy Loading): Implementare il caricamento differito per il JS aiuta molto (sto già utilizzando una soluzione alternativa per questo).
            <script type="text/javascript">
                DiscourseEmbed = {
                    discourseUrl: '<?php echo esc_url($discourse_url); ?>',
                    
                    <?php if ($use_topic_id): ?>
                        // Modo ID: Topic salvato nel database, immune ai cambiamenti di URL
                        topicId: <?php echo intval($topic_id); ?>,
                    <?php else: ?>
                        // Modo URL: Fallback quando la creazione via API fallisce
                        discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                    <?php endif; ?>
                    fullApp: true,
                    embedHeight: '800px',
                };

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

                    // Verifica se il browser supporta IntersectionObserver
                    if ('IntersectionObserver' in window) {
                        var observer = new IntersectionObserver(function(entries, observer) {
                            entries.forEach(function(entry) {
                                if (entry.isIntersecting) {
                                    // Quando il div entra nella viewport, carica lo script
                                    loadDiscourse();
                                    observer.unobserve(entry.target);
                                }
                            });
                        }, { rootMargin: "1500px" }); // Carica 1500px prima di raggiungere il div

                        observer.observe(container);
                    } else {
                        // Fallback per browser più vecchi
                        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>

Qui puoi vedere il numero di richieste diminuire dopo l’implementazione del Lazy Load (e alcune parti del sito erano ancora in cache, quindi non è il risultato finale):

  • Riduzione del payload: Possiamo ridurre le risorse caricate all’interno dell’embed? Ad esempio, ho notato query per URL delle chat e controlli sui crediti AI: sono necessari per la vista embed?

  • Frequenza delle richieste: Le richieste POST in tempo reale sono un po’ aggressive. Forse possiamo ridurre la frequenza di polling per la versione embed?

  • Cache: Gestione della cache migliorata per i topic incorporati per gestire i picchi di traffico.

2. Caos nelle analisi

Al momento, l’embed sta attivando gli script di Google Analytics/GTM. Questo sta raddoppiando le nostre visualizzazioni di pagina (un hit per il post, un altro per l’iframe), il che compromette i nostri dati. Sarebbe ideale se il sistema potesse rilevare che si trova in un iframe e disabilitare automaticamente gli script di tracciamento (inclusi quelli di analytics di Discourse).

3. Il problema dell’altezza dell’iFrame

Questo è probabilmente l’ostacolo più grande per l’UX. Se un post non ha commenti, c’è uno strano spazio vuoto. Se ha un thread lungo, l’iframe viene tagliato dopo i primi 2 o 3 commenti, costringendo a uno “scroll dentro lo scroll”, che è piuttosto pessimo, soprattutto su mobile.

Per competere davvero con qualcosa come Disqus, abbiamo bisogno che l’altezza sia dinamica (in base al numero di commenti) e anche di un pulsante “Leggi tutto” che espanda il thread dopo un certo numero di risposte.

4. Conflitti tra plugin

Poiché l’embed carica tutti i plugin attivi, stiamo riscontrando alcuni comportamenti strani. Ad esempio, “Google One Tap” appare all’interno del post del blog. Quando un utente effettua il login, l’iframe si aggiorna e lo riporta alla homepage della comunità invece che al thread dei commenti. La possibilità di disabilitare manualmente plugin specifici per la vista embed sarebbe una manna dal cielo.

5. Attrito nel login

Il flusso attuale è un po’ un killer di conversioni: l’utente clicca su login → si apre una nuova scheda → avviene il login → l’utente viene lasciato sulla homepage della comunità. Tornando sul post del blog, l’iframe sembra ancora non aver effettuato l’accesso finché l’utente non aggiorna manualmente l’intera pagina. È un ciclo confuso che fa desistere le persone e le porta ad abbandonare prima di poter commentare.

Dalla nostra attivazione del nuovo embed, i registrazioni giornaliere sono più che raddoppiate, il che è fantastico. Tuttavia, le nostre metriche di engagement non sono cambiate affatto. In realtà, i nostri DAU/MAU sono diminuiti – abbiamo più utenti connessi, ma non interagiscono. Metriche come “Utenti attivi giornalieri”, “Nuovi contributori” e “Pubblicazioni” non hanno visto alcun aumento.

Questo dimostra che le persone vogliono unirsi alla conversazione, ma si perdono nel ciclo di login e abbandonano il post prima di poter effettivamente commentare.

6. Interfaccia mobile

Su mobile, la finestra di risposta occupa tutto lo schermo, quindi si perde tutto il contesto della conversazione a cui si sta rispondendo. Sembra un po’ claustrofobico: qualsiasi cosa possiamo fare per renderla più compatta sarebbe un grande vantaggio.


Voglio davvero rendere questo il sistema predefinito per Tecnoblog (e anche per un altro sito che possediamo). Fammi sapere se vuoi approfondire qualche punto!

14 Mi Piace

Questo verrà risolto da

11 Mi Piace

Grazie per il feedback dettagliato @Thiago_Mobilon !

Lavorerò sulla lista e cercherò di coprire tutto alla fine.

Ho appena fatto un controllo qui, e sembra che il tuo CSS sia configurato in modo errato sul tuo sito Discourse. Hai intestazioni cache-control duplicate, e una di esse è 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 Mi Piace

Stai utilizzando l’integrazione di Google Analytics integrata in Discourse?

8 Mi Piace

Gestione di questi in

9 Mi Piace

Gestito in

11 Mi Piace

Penso che Cloudflare abbia aggiunto quell’intestazione perché ho bypassato la cache per la directory /comunidade/. Se non la rimuovo, applicherà le sue regole di caching al CSS e al JS di Discourse, il che potrebbe potenzialmente creare conflitti in futuro.

Comunque, quando ho sollevato la questione del caching, era più con l’obiettivo di ridurre il carico del server. I file CSS sono statici, corretto? Se è così, il fatto che non siano in cache, sebbene indesiderabile, non avrebbe un impatto diretto sul carico del server.

5 Mi Piace

Sto utilizzando l’integrazione di Discourse con Google Tag Manager.

4 Mi Piace

Influiscono sulle prestazioni dell’utente finale, poiché si tratta di 59 richieste per scaricare 1,43 MB di CSS (compressi a 340 KB) per ogni articolo.

Inoltre, vengono serviti dal server Ruby, poiché ci aspettiamo che i siti non invalidino la cache, il che significa che in condizioni normali questo percorso viene utilizzato molto raramente.

Se non sbaglio, servire questi file con una cache invalidata significa che colpiscono anche il database.

4 Mi Piace

Questa è un’ottima idea, sto aggiungendo il supporto nativo per essa

11 Mi Piace

Questo è un problema più generale legato alla composizione in movimento, e beneficerà dei miglioramenti discussi in Creating/Editing a post on mobile: let's discuss the 2026 Discourse experience.

8 Mi Piace

Abbiamo una cache fantastica per gli utenti anonimi che accedono alle pagine degli argomenti, e copre anche questa nuova modalità, quindi dovresti riuscire a scalare bene per gestire i picchi, purché ci siano abbastanza worker Pitchfork e worker I/O Redis.

5 Mi Piace

Il polling riduce automaticamente la frequenza nelle schede in background o durante eventi di carico elevato, e lo stesso dovrebbe valere qui.

5 Mi Piace

Ho optato per il tagging di quelli in

8 Mi Piace

Sto riscontrando difficoltà nel far funzionare correttamente l’altezza dinamica. Nonostante abbia aggiornato Discourse e aggiornato il mio snippet con le configurazioni più recenti, il problema persiste.

        <h4 class="comments-main-title component-title">Commenti</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): ?>
                    // Modalità ID: Argomento salvato nel database, immune a cambiamenti dell'URL
                    topicId: <?php echo intval($topic_id); ?>,
                <?php else: ?>
                    // Modalità URL: Fallback quando la creazione tramite API fallisce
                    discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                <?php endif; ?>
                fullApp: true,
                lazyLoad: true, // disabilita il caricamento lento dell'iframe
                lazyLoadMargin: '1500', // pixel prima della viewport per iniziare il caricamento
                dynamicHeight: true,
                embedMinHeight: '400',
                embedMaxHeight: '3000',
					  embedHeight: '800px',
                // className: 'NOME_CLASSE',
            };

            (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 Mi Piace

Potremmo usare <iframe loading="lazy"> qui? In questo modo, non avremmo bisogno di JS personalizzato o di intersection observer?

4 Mi Piace

Oh, è ora ampiamente supportato tra i browser? TIL! Lo cambierò il prima possibile.

8 Mi Piace

Grazie per i test, ho trovato il problema

5 Mi Piace

Ottimo! L’altezza dinamica ora funziona come previsto. Tuttavia, questo ha introdotto un piccolo problema: quando clicco per rispondere, il campo di input per la replica cerca di adattarsi all’altezza dell’iframe. In questo caso, è diventato erroneamente alto 7385px.

Il post conteneva 31 commenti e l’iframe incorporato era alto 9757px (avevo impostato embedMaxHeight a 15000px).

Aggiornamento: ho effettivamente notato che il modulo dei commenti espande l’altezza dell’iframe al suo massimo, quindi quando clicco “scarta”, il layout termina con un enorme spazio vuoto sotto i commenti.

Screenshot 2026-04-16 at 16.03.37

5 Mi Piace

Credo che avrai bisogno di un max-height con un valore più ragionevole, come 1000-1500px.

Così questa funzionalità risolverà il tuo problema iniziale di

e si espanderà fino a un certo punto, ma dato il comportamento di scroll infinito nativo di Discourse, non vuoi che l’altezza aumenti troppo.

Questa funzionalità non eliminerà lo “scroll dentro scroll” nel prossimo futuro.

Per quanto riguarda il compositore mobile, sto esaminando cosa possiamo fare qui.

6 Mi Piace