Experiência do Tecnoblog com comentários no Discourse

Olá!

Estou muito animado com essa nova funcionalidade. Já faz tempo que eu aguardo uma solução como essa, e o feedback inicial dos nossos leitores no Tecnoblog tem sido ótimo — eles adoram ter a comunidade integrada.

No entanto, após alguns testes no mundo real, identifiquei alguns obstáculos técnicos que precisamos superar para que isso pareça um sistema de comentários verdadeiramente nativo e, mais importante, para torná-lo sustentável para sites de alto tráfego.

Aqui está o que eu encontrei até agora:

1. Desempenho e Carga do Servidor

A carga do nosso servidor aumentou significativamente depois que incorporamos o aplicativo completo. Olhando para o Cloudflare, o volume de solicitações multiplicou por 10. Algumas ideias sobre como otimizar isso:

  • Carregamento Preguiçoso (Lazy Loading): Implementar o carregamento preguiçoso para o JS ajuda muito (eu já estou usando uma solução alternativa para isso).
            <script type="text/javascript">
                DiscourseEmbed = {
                    discourseUrl: '<?php echo esc_url($discourse_url); ?>',
                    
                    <?php if ($use_topic_id): ?>
                        // Modo ID: Tópico salvo no banco, imune a mudanças de URL
                        topicId: <?php echo intval($topic_id); ?>,
                    <?php else: ?>
                        // Modo URL: Fallback quando a criação via API falha
                        discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                    <?php endif; ?>
                    fullApp: true,
                    embedHeight: '800px',
                };

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

                    // Verifica se o navegador suporta IntersectionObserver
                    if ('IntersectionObserver' in window) {
                        var observer = new IntersectionObserver(function(entries, observer) {
                            entries.forEach(function(entry) {
                                if (entry.isIntersecting) {
                                    // Quando o div entra na tela, carrega o script
                                    loadDiscourse();
                                    observer.unobserve(entry.target);
                                }
                            });
                        }, { rootMargin: "1500px" }); // Carrega 1500px antes de chegar no div

                        observer.observe(container);
                    } else {
                        // Fallback para navegadores antigos
                        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>

Aqui você pode ver o número de solicitações caindo depois que o Carregamento Prejudoso foi implementado (e algumas partes do site ainda estavam em cache, então este não é o resultado final):

  • Redução da carga útil: Podemos reduzir os recursos carregados dentro da incorporação? Por exemplo: notei consultas para URLs de Chat e verificações de crédito de IA — essas são necessárias para a visualização incorporada?

  • Frequência de Solicitações: As solicitações POST em tempo real são um pouco agressivas. Talvez possamos reduzir a frequência de polling para a versão incorporada?

  • Cache: Melhor gerenciamento de cache para tópicos incorporados para lidar com picos de tráfego.

2. Bagunça nas Análises

No momento, a incorporação está disparando scripts do Google Analytics/GTM. Isso está duplicando nossas visualizações de página (um hit para o post, outro para o iframe), o que prejudica nossos dados. Seria ideal se o sistema pudesse detectar que está em um iframe e desativar automaticamente qualquer script de rastreamento (inclusive as análises do Discourse).

3. Problema de Altura do iFrame

Este é provavelmente o maior obstáculo para a UX. Se um post não tem comentários, há um espaço vazio estranho. Se ele tem um thread longo, o iframe é cortado dentro dos primeiros 2 ou 3 comentários, forçando um “rolar dentro de um rolar”, o que é bastante ruim, especialmente em dispositivos móveis.

Para realmente competir com algo como o Disqus, precisamos que a altura seja dinâmica (de acordo com o número de comentários) e também ter um botão “Ler Mais” que expanda o thread após um certo número de respostas.

4. Conflitos de Plugins

Como a incorporação carrega todos os plugins ativos, estamos vendo alguns comportamentos estranhos. Por exemplo, o “Google One Tap” aparece dentro do post do blog. Quando um usuário faz login, o iframe é atualizado e o leva à página inicial da comunidade em vez do thread de comentários. Poder desabilitar manualmente plugins específicos para a visualização incorporada seria uma grande ajuda.

5. Atrito no Login

O fluxo atual é um pouco um assassino de conversão: O usuário clica em login → Uma nova aba se abre → O login acontece → O usuário fica na página inicial da comunidade. De volta ao post do blog, o iframe ainda parece desconectado até que o usuário atualize manualmente toda a página. É um ciclo confuso que faz as pessoas desistirem e saírem antes de comentar.

Desde que ativamos a nova incorporação, nossos registros diários mais do que dobraram, o que é ótimo. No entanto, nossas métricas de engajamento não se moveram em nada. Na verdade, nosso DAU/MAU caiu — temos mais usuários conectados, mas eles não estão interagindo. Métricas como “Usuários Engajados Diariamente”, “Novos Contribuidores” e “Publicações” não viram nenhum aumento.

Isso prova que as pessoas querem participar da conversa, mas estão se perdendo no ciclo de login e abandonando o post antes de poderem realmente comentar.

6. Interface Móvel

Em dispositivos móveis, a janela de resposta ocupa toda a tela, então você perde todo o contexto da conversa à qual está respondendo. Parece um pouco claustrofóbico — qualquer coisa que possamos fazer para mantê-la mais compacta seria uma grande vitória.


Eu realmente quero fazer deste o sistema padrão para o Tecnoblog (e também em outro site que possuímos). Me avise se quiser mergulhar mais fundo em algum desses pontos!

14 curtidas

Isso será corrigido por

11 curtidas

Obrigado pelo feedback detalhado, @Thiago_Mobilon!

Vou analisar a lista e tentar cobrir tudo eventualmente.

Acabei de fazer uma verificação aqui, e parece que o CSS está mal configurado no seu site do Discourse. Você tem cabeçalhos cache-control duplicados, e um deles é 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 curtidas

Você está usando a integração nativa do Google Analytics no Discourse?

8 curtidas

Tratando isso em

9 curtidas

Resolvido em

11 curtidas

Acredito que o Cloudflare tenha adicionado esse cabeçalho porque ignorei o cache para o diretório /comunidade/. Se eu não removê-lo, ele aplicará suas regras de cache ao CSS e JS do Discourse, o que poderia potencialmente criar conflitos mais tarde.

De qualquer forma, quando mencionei o problema de cache, foi mais com o objetivo de reduzir a carga do servidor. Os arquivos CSS são estáticos, correto? Se for, o fato de eles não serem cacheados, embora indesejável, não afetaria diretamente a carga do servidor.

5 curtidas

Estou utilizando a integração do Discourse com o Google Tag Manager.

4 curtidas

Eles afetam o desempenho do usuário final, pois representam 59 solicitações para baixar 1,43 MB de CSS (comprimido para 340 KB) em cada artigo.

Além disso, eles também são servidos pelo servidor Ruby, já que esperamos que os sites não invalidem o cache, o que significa que, em condições normais, essa rota é raramente utilizada.

Se não me engano, servir esses arquivos com um cache inválido significa que eles até mesmo acessam o banco de dados.

4 curtidas

Essa é uma ótima ideia, vou adicionar suporte nativo para isso

11 curtidas

Esse é um problema mais geral com a composição de mensagens em movimento, e se beneficiará das melhorias de Creating/Editing a post on mobile: let's discuss the 2026 Discourse experience.

8 curtidas

Temos um cache excelente para usuários anônimos que acessam páginas de tópicos, e ele também cobre esse novo modo, então você deve conseguir escalar bem para lidar com picos, desde que haja workers suficientes do Pitchfork e workers de E/S do Redis.

5 curtidas

O polling reduz automaticamente sua frequência em abas em segundo plano ou durante eventos de alta carga, e o mesmo deve se aplicar aqui.

5 curtidas

Optei por marcar aqueles em

8 curtidas

Estou enfrentando dificuldades para fazer a altura dinâmica funcionar corretamente. Apesar de atualizar o Discourse e atualizar meu snippet com as configurações mais recentes, o problema persiste.

        <h4 class="comments-main-title component-title">Comentários</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): ?>
                    // Modo ID: Tópico salvo no banco, imune a mudanças de URL
                    topicId: <?php echo intval($topic_id); ?>,
                <?php else: ?>
                    // Modo URL: Fallback quando a criação via API falha
                    discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                <?php endif; ?>
                fullApp: true,
                lazyLoad: true, // desativa o carregamento preguiçoso do iframe
                lazyLoadMargin: '1500', // pixels antes da viewport para iniciar o carregamento
                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 curtidas

Podemos usar <iframe loading="lazy"> aqui? Assim, não precisamos de JS personalizado ou observadores de interseção?

4 curtidas

Ah, isso já tem amplo suporte entre os navegadores? Aprendi algo novo! Vou fazer a alteração o mais rápido possível.

8 curtidas

Obrigado por testar, encontrei o problema

5 curtidas

Excelente! A altura dinâmica está funcionando como esperado. No entanto, isso introduziu um pequeno problema: quando clico para responder, o campo de entrada da resposta tenta se ajustar à altura do iframe. Neste caso, ele erroneamente ficou com 7385px de altura.

A postagem continha 31 comentários, e o iframe incorporado tinha 9757px de altura (eu havia definido o embedMaxHeight para 15000px).

Atualização: Na verdade, notei que o formulário de comentários expande a altura do iframe até o máximo, então quando clico em “descartar”, o layout acaba ficando com um grande espaço em branco abaixo dos comentários.

Screenshot 2026-04-16 at 16.03.37

5 curtidas

Acho que você vai precisar de um max-height com um valor mais razoável lá, como 1000 a 1500px.

Então, esse recurso vai resolver seu problema inicial de

e aumenta até certo ponto, mas, considerando o comportamento de rolagem infinita nativa do Discourse, você não quer que a altura aumente tanto.

Esse recurso não vai remover o “rolagem dentro de rolagem” tão cedo.

Quanto ao compositor móvel, estou investigando o que podemos fazer aqui.

6 curtidas