Experiencia de Tecnoblog con los comentarios de Discourse

¡Hola!

¡Estoy muy emocionado por esta nueva función! He estado esperando una solución como esta durante mucho tiempo, y los primeros comentarios de nuestros lectores en Tecnoblog han sido excelentes: les encanta tener la comunidad integrada.

Sin embargo, tras algunas pruebas en entornos reales, he detectado varios obstáculos técnicos que debemos superar para que esto se sienta como un sistema de comentarios verdaderamente nativo y, lo más importante, para que sea sostenible en sitios con alto tráfico.

Esto es lo que he encontrado hasta ahora:

1. Rendimiento y carga del servidor

Nuestra carga de servidor aumentó significativamente después de incrustar la aplicación completa. Al revisar Cloudflare, nuestro volumen de solicitudes se multiplicó por 10. Aquí algunas ideas para optimizarlo:

  • Carga diferida (Lazy Loading): Implementar la carga diferida para el JavaScript ayuda mucho (ya estoy usando un workaround para esto).
            <script type="text/javascript">
                DiscourseEmbed = {
                    discourseUrl: '<?php echo esc_url($discourse_url); ?>',
                    
                    <?php if ($use_topic_id): ?>
                        // Modo ID: Tópico guardado en la base de datos, inmune a cambios de URL
                        topicId: <?php echo intval($topic_id); ?>,
                    <?php else: ?>
                        // Modo URL: Fallback cuando la creación vía API falla
                        discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                    <?php endif; ?>
                    fullApp: true,
                    embedHeight: '800px',
                };

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

                    // Verifica si el navegador soporta IntersectionObserver
                    if ('IntersectionObserver' in window) {
                        var observer = new IntersectionObserver(function(entries, observer) {
                            entries.forEach(function(entry) {
                                if (entry.isIntersecting) {
                                    // Cuando el div entra en pantalla, carga el script
                                    loadDiscourse();
                                    observer.unobserve(entry.target);
                                }
                            });
                        }, { rootMargin: "1500px" }); // Carga 1500px antes de llegar al div

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

Aquí puedes ver cómo disminuyó el número de solicitudes después de implementar la carga diferida (y algunas partes del sitio web aún estaban en caché, así que no es el resultado final):

  • Reducción del payload: ¿Podemos reducir los recursos cargados dentro del incrustado? Por ejemplo: noté consultas para URLs de Chat y verificaciones de créditos de IA… ¿son necesarias para la vista incrustada?

  • Frecuencia de solicitudes: Las solicitudes POST en tiempo real son un poco agresivas. ¿Quizás podamos reducir la frecuencia de sondeo para la versión incrustada?

  • Caché: Mejorar la gestión de caché para temas incrustados para manejar picos de tráfico.

2. Caos en las analíticas

Actualmente, el incrustado está ejecutando scripts de Google Analytics/GTM. Esto está duplicando nuestras visitas a la página (una por la publicación y otra por el iframe), lo que distorsiona nuestros datos. Sería ideal que el sistema detectara que está dentro de un iframe y desactivara automáticamente cualquier script de seguimiento (incluidas las analíticas de Discourse).

3. El problema de la altura del iframe

Este es probablemente el mayor obstáculo para la experiencia de usuario (UX). Si una publicación no tiene comentarios, aparece un espacio vacío extraño. Si tiene un hilo largo, el iframe se corta después de los primeros 2 o 3 comentarios, obligando a un “desplazamiento dentro de un desplazamiento”, lo cual es bastante malo, especialmente en móviles.

Para competir realmente con algo como Disqus, necesitamos que la altura sea dinámica (según la cantidad de comentarios) y también tener un botón “Leer más” que expanda el hilo después de cierto número de respuestas.

4. Conflictos de complementos

Dado que el incrustado carga todos los complementos activos, estamos viendo comportamientos extraños. Por ejemplo, “Google One Tap” aparece dentro de la publicación del blog. Cuando un usuario inicia sesión, el iframe se actualiza y lo lleva a la página principal de la comunidad en lugar de al hilo de comentarios. Poder desactivar manualmente complementos específicos para la vista incrustada sería un salvavidas.

5. Fricción en el inicio de sesión

El flujo actual es un poco un asesino de conversiones: el usuario hace clic en iniciar sesión → se abre una nueva pestaña → se inicia la sesión → el usuario queda en la página principal de la comunidad. De vuelta en la publicación del blog, el iframe sigue pareciendo desconectado hasta que el usuario actualiza manualmente toda la página. Es un ciclo confuso que hace que la gente se rinda y se vaya antes de comentar.

Desde que activamos el nuevo incrustado, nuestros registros diarios se han más que duplicado, lo cual es genial. Sin embargo, nuestras métricas de participación no han cambiado en absoluto. De hecho, nuestra relación DAU/MAU ha bajado: tenemos más usuarios conectados, pero no están interactuando. Métricas como “Usuarios activos diarios”, “Nuevos contribuyentes” y “Publicaciones” no han mostrado ningún aumento.

Esto demuestra que la gente quiere unirse a la conversación, pero se pierden en el ciclo de inicio de sesión y abandonan la publicación antes de poder comentar realmente.

6. Interfaz de usuario móvil

En móviles, la ventana de respuesta ocupa toda la pantalla, por lo que pierdes todo el contexto de la conversación a la que estás respondiendo. Se siente un poco claustrofóbico… cualquier cosa que podamos hacer para mantenerla más compacta sería una gran victoria.


Realmente quiero hacer de esto el sistema predeterminado para Tecnoblog (y también para otro sitio que poseemos). ¡Avísame si quieres profundizar en alguno de estos puntos!

8 Me gusta

Esto se solucionará con

6 Me gusta

¡Gracias por los comentarios detallados, @Thiago_Mobilon!

Voy a trabajar en la lista e intentar cubrir todo eventualmente.

Acabo de hacer una verificación aquí y parece que tu CSS está mal configurado en tu sitio de Discourse. Tienes encabezados cache-control duplicados, y uno de ellos es 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 Me gusta

¿Estás utilizando la integración nativa de Google Analytics de Discourse?

3 Me gusta

Manejando esto en

4 Me gusta

Gestionado en

7 Me gusta

Creo que Cloudflare debe haber añadido ese encabezado porque omití la caché para el directorio /comunidade/. Si no lo elimino, aplicará sus reglas de caché al CSS y JS de Discourse, lo que podría generar conflictos más adelante.

De todos modos, cuando mencioné el problema de la caché, mi objetivo principal era reducir la carga del servidor. ¿Los archivos CSS son estáticos, verdad? Si es así, el hecho de que no estén en caché, aunque no sea deseable, no afectaría directamente a la carga del servidor.

2 Me gusta

Estoy utilizando la integración de Discourse con Google Tag Manager.

1 me gusta

Afectan el rendimiento del usuario final, ya que son 59 solicitudes que descargan 1,43 MB de CSS (comprimidos a 340 KB) en cada artículo.

Además, también son servidos por el servidor Ruby, ya que esperamos que los sitios no rompan la caché, lo que significa que, en condiciones normales, esta ruta se utiliza muy raramente.

Si no estoy equivocado, servirlos con una caché rota implica que incluso acceden a la base de datos.

1 me gusta

Esta es una gran idea, estoy agregando soporte nativo para ello

6 Me gusta

Ese es un problema más general al redactar en movimiento, y se beneficiará de las mejoras de Creating/Editing a post on mobile: let's discuss the 2026 Discourse experience.

4 Me gusta

Contamos con una caché excelente para usuarios anónimos que acceden a páginas de temas, y también cubre este nuevo modo, por lo que deberías poder escalar bien para manejar picos siempre que haya suficientes trabajadores de Pitchfork y trabajadores de E/S de Redis.

2 Me gusta

El sondeo reduce automáticamente la frecuencia en pestañas en segundo plano o durante eventos de alta carga, y lo mismo debería aplicarse aquí.

2 Me gusta

Me he sumado a la etiqueta de esos casos en

5 Me gusta