L'esperienza di Tecnoblog con i commenti di Discourse

Ciao!

Sono davvero entusiasta di questa nuova funzionalità. Aspettavo una soluzione del genere da molto tempo, e i primi feedback dai nostri lettori su Tecnoblog sono stati ottimi: amano avere la community integrata.

Tuttavia, dopo alcuni test reali, ho individuato alcune sfide tecniche che dobbiamo superare per rendere questo sistema di commenti davvero nativo e, soprattutto, sostenibile per siti ad alto traffico.

Ecco cosa ho rilevato finora:

1. Prestazioni e carico del server

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

  • Caricamento differito (Lazy Loading): Implementare il lazy load per il JavaScript aiuta molto (sto già usando una soluzione temporanea per questo).
            <script type="text/javascript">
                DiscourseEmbed = {
                    discourseUrl: '<?php echo esc_url($discourse_url); ?>',
                    
                    <?php if ($use_topic_id): ?>
                        // Modalità ID: Argomento salvato nel database, immune ai cambiamenti di 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,
                    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 nello schermo, carica lo script
                                    loadDiscourse();
                                    observer.unobserve(entry.target);
                                }
                            });
                        }, { rootMargin: "1500px" }); // Carica 1500px prima di raggiungere il div

                        observer.observe(container);
                    } else {
                        // Fallback per browser 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 nella cache, quindi non è il risultato finale):

  • Riduzione del payload: Possiamo ridurre le risorse caricate nell’incorporamento? Ad esempio: ho notato query per URL della chat e controlli dei crediti AI: sono necessari per la visualizzazione incorporata?

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

  • Cache: Migliore gestione della cache per gli argomenti incorporati per gestire picchi di traffico.

2. Caos nell’analisi

Attualmente, l’incorporamento esegue script di Google Analytics/GTM. Questo raddoppia le 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 di essere in un iframe e disattivare automaticamente tutti gli script di tracciamento (anche quelli di analisi di Discourse).

3. Il problema dell’altezza dell’iframe

Questa è probabilmente la sfida più grande per l’esperienza utente. Se un post non ha commenti, c’è uno strano spazio vuoto. Se ha una lunga discussione, l’iframe viene tagliato dopo i primi 2 o 3 commenti, costringendo a uno “scroll dentro uno scroll”, che è piuttosto brutto, specialmente su mobile.

Per competere davvero con qualcosa come Disqus, abbiamo bisogno che l’altezza sia dinamica (in base al numero di commenti) e che ci sia anche un pulsante “Leggi altro” che espande la discussione dopo un certo numero di risposte.

4. Conflitti con i plugin

Poiché l’incorporamento carica tutti i plugin attivi, stiamo osservando comportamenti strani. Ad esempio, “Google One Tap” appare all’interno del post del blog. Quando un utente accede, l’iframe si aggiorna e lo riporta alla home page della community invece che al thread dei commenti. Poter disabilitare manualmente plugin specifici per la visualizzazione incorporata sarebbe una salvezza.

5. Attrito nell’accesso

Il flusso attuale è un po’ un killer delle conversioni: l’utente clicca su accedi → si apre una nuova scheda → avviene l’accesso → l’utente rimane sulla home page della community. Tornando al post del blog, l’iframe appare ancora come non connesso finché l’utente non aggiorna manualmente l’intera pagina. È un circolo vizioso confuso che porta le persone ad arrendersi e abbandonare prima di poter commentare.

Dopo aver attivato il nuovo incorporamento, le nostre registrazioni giornaliere sono più che raddoppiate, il che è ottimo. Tuttavia, le nostre metriche di engagement non si sono mosse affatto. Anzi, il nostro DAU/MAU è sceso: abbiamo più utenti connessi, ma non stanno interagendo. Metriche come “Utenti attivi quotidiani”, “Nuovi contributori” e “Pubblicazioni” non hanno registrato alcun aumento.

Questo dimostra che le persone vogliono partecipare alla conversazione, ma si perdono nel loop di accesso e abbandonano il post prima di poter effettivamente commentare.

6. Interfaccia utente mobile

Su mobile, la finestra di risposta occupa tutto lo schermo, quindi perdi ogni contesto della conversazione a cui stai rispondendo. Si sente un po’ claustrofobico: qualsiasi cosa possiamo fare per mantenerla più compatta sarebbe un grande successo.


Voglio davvero rendere questo il sistema predefinito per Tecnoblog (e anche per un altro sito di nostra proprietà). Fammi sapere se vuoi approfondire uno di questi punti!

8 Mi Piace

Questo verrà risolto da

6 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 due 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
4 Mi Piace

Stai utilizzando l’integrazione nativa di Google Analytics di Discourse?

3 Mi Piace

Gestione di queste problematiche in

4 Mi Piace

Gestito in

7 Mi Piace

Credo 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 ai file CSS e JS di Discourse, il che potrebbe potenzialmente creare conflitti in seguito.

Comunque, quando ho sollevato il problema della cache, l’obiettivo era più quello di ridurre il carico sul server. I file CSS sono statici, giusto? Se è così, il fatto che non siano memorizzati nella cache, sebbene indesiderabile, non avrebbe un impatto diretto sul carico del server.

2 Mi Piace

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

1 Mi Piace

Influenzano le prestazioni per l’utente finale, poiché su ogni articolo vengono eseguite 59 richieste per scaricare 1,43 MB di CSS (compressi in 340 KB).

Inoltre, vengono forniti dal server Ruby, poiché ci aspettiamo che i siti non interrompano la cache; ciò significa che, in condizioni normali, questa rotta viene utilizzata molto raramente.

Se non sbaglio, servirli con una cache interrotta significa che raggiungono persino il database.

1 Mi Piace

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

6 Mi Piace

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

4 Mi Piace

Disponiamo di una cache eccellente per gli utenti anonimi che accedono alle pagine degli argomenti, che copre anche questa nuova modalità. Dovresti quindi essere in grado di scalare bene per gestire i picchi, purché ci siano un numero sufficiente di worker Pitchfork e worker I/O Redis.

2 Mi Piace

Il polling riduce automaticamente l’intensità nelle schede in background o durante eventi di alto carico, e lo stesso dovrebbe valere qui.

2 Mi Piace

Ho optato per l’etichettatura di quelli in

5 Mi Piace