Die Erfahrung von Tecnoblog mit Discourse-Kommentaren

Hi!

Ich bin wirklich begeistert von dieser neuen Funktion. Ich habe lange auf eine solche Lösung gewartet, und das erste Feedback unserer Leser bei Tecnoblog war großartig – sie lieben es, die Community integriert zu haben.

Allerdings habe ich nach einigen Tests in der Praxis ein paar technische Hürden entdeckt, die wir beseitigen müssen, damit sich das wie ein wirklich natives Kommentarsystem anfühlt und, was noch wichtiger ist, damit es für Websites mit hohem Traffic nachhaltig ist.

Hier ist, was ich bisher festgestellt habe:

1. Leistung & Serverlast

Unsere Serverlast ist deutlich angestiegen, nachdem wir die vollständige App eingebettet haben. Laut Cloudflare hat sich unser Anfragevolumen verzehnfacht. Hier ein paar Ideen zur Optimierung:

  • Lazy Loading: Die Implementierung von Lazy Loading für das JS hilft sehr (ich verwende bereits einen Workaround dafür).
            <script type="text/javascript">
                DiscourseEmbed = {
                    discourseUrl: '<?php echo esc_url($discourse_url); ?>',
                    
                    <?php if ($use_topic_id): ?>
                        // ID-Modus: Thema in der Datenbank gespeichert, immun gegen URL-Änderungen
                        topicId: <?php echo intval($topic_id); ?>,
                    <?php else: ?>
                        // URL-Modus: Fallback, wenn die Erstellung über die API fehlschlägt
                        discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                    <?php endif; ?>
                    fullApp: true,
                    embedHeight: '800px',
                };

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

                    // Prüft, ob der Browser IntersectionObserver unterstützt
                    if ('IntersectionObserver' in window) {
                        var observer = new IntersectionObserver(function(entries, observer) {
                            entries.forEach(function(entry) {
                                if (entry.isIntersecting) {
                                    // Wenn das div in den sichtbaren Bereich kommt, wird das Skript geladen
                                    loadDiscourse();
                                    observer.unobserve(entry.target);
                                }
                            });
                        }, { rootMargin: "1500px" }); // Lädt 1500px vor Erreichen des div

                        observer.observe(container);
                    } else {
                        // Fallback für ältere Browser
                        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>

Hier kannst du sehen, wie die Anzahl der Anfragen nach der Implementierung von Lazy Loading gesunken ist (und einige Teile der Website waren noch im Cache, also ist dies nicht das Endergebnis):

  • Payload reduzieren: Können wir die innerhalb des Embeds geladenen Ressourcen reduzieren? Z. B. habe ich Abfragen für Chat-URLs und AI-Credit-Checks bemerkt – sind diese für die Embed-Ansicht notwendig?

  • Anfragehäufigkeit: Die Echtzeit-POST-Anfragen sind etwas aggressiv. Vielleicht können wir die Abfragehäufigkeit für die Embed-Version reduzieren?

  • Cache: Verbessertes Cache-Management für eingebettete Themen, um Traffic-Spitzen zu bewältigen.

2. Analytics-Chaos

Aktuell löst das Embed Google Analytics/GTM-Skripte aus. Dies verdoppelt unsere Seitenaufrufe (ein Hit für den Beitrag, ein anderer für den iframe), was unsere Daten verfälscht. Es wäre ideal, wenn das System erkennen könnte, dass es sich in einem iframe befindet, und alle Tracking-Skripte automatisch deaktivieren würde (einschließlich der Discourse-Analytics).

3. Das iFrame-Höhenproblem

Das ist wahrscheinlich die größte Hürde für die UX. Wenn ein Beitrag keine Kommentare hat, entsteht eine seltsame leere Lücke. Wenn es einen langen Thread gibt, wird der iframe nach den ersten 2 oder 3 Kommentaren abgeschnitten, was zu einem „Scrollen-im-Scrollen“ führt, was ziemlich schlecht ist, besonders auf Mobilgeräten.

Um wirklich mit etwas wie Disqus mithalten zu können, muss die Höhe dynamisch sein (je nach Anzahl der Kommentare) und außerdem einen „Mehr anzeigen“-Button haben, der den Thread nach einer bestimmten Anzahl von Antworten erweitert.

4. Plugin-Konflikte

Da das Embed alle aktiven Plugins lädt, beobachten wir einige seltsames Verhalten. Zum Beispiel弹出t „Google One Tap“ innerhalb des Blogbeitrags auf. Wenn sich ein Benutzer anmeldet, wird der iframe aktualisiert und leitet ihn zur Community-Startseite weiter, anstatt im Kommentar-Thread zu bleiben. Die Möglichkeit, bestimmte Plugins für die Embed-Ansicht manuell zu deaktivieren, wäre ein Segen.

5. Login-Reibung

Der aktuelle Ablauf ist ein echter Konversions-Killer: Benutzer klickt auf Anmelden → Neuer Tab öffnet sich → Anmeldung erfolgt → Benutzer landet auf der Community-Startseite. Zurück im Blogbeitrag sieht der iframe immer noch so aus, als wäre der Benutzer nicht angemeldet, bis der Benutzer die gesamte Seite manuell aktualisiert. Es ist ein verwirrender Kreislauf, der dazu führt, dass die Leute aufgeben und gehen, bevor sie kommentieren können.

Seit wir das neue Embed aktiviert haben, haben sich unsere täglichen Registrierungen mehr als verdoppelt, was großartig ist. Unsere Engagement-Metriken haben sich jedoch überhaupt nicht verbessert. Tatsächlich sind unsere DAU/MAU gesunken – wir haben mehr angemeldete Benutzer, aber sie interagieren nicht. Metriken wie „Täglich aktive Benutzer“, „Neue Mitwirkende“ und „Beiträge“ haben keine Zunahme verzeichnet.

Dies beweist, dass die Leute mitmachen wollen, aber sie verirren sich im Login-Kreislauf und brechen den Beitrag ab, bevor sie tatsächlich kommentieren können.

6. Mobile UI

Auf Mobilgeräten nimmt das Antwortfenster den gesamten Bildschirm ein, sodass man den Kontext der Konversation verliert, auf die man antwortet. Es fühlt sich etwas beengend an – alles, was wir tun können, um es kompakter zu gestalten, wäre ein großer Gewinn.


Ich möchte wirklich, dass dies das Standardsystem für Tecnoblog (und auch für eine andere Website, die wir besitzen) wird. Sag mir Bescheid, wenn du tiefer in einen dieser Punkte einsteigen möchtest!

14 „Gefällt mir“

Dies wird durch

behoben.

11 „Gefällt mir“

Vielen Dank für das detaillierte Feedback, @Thiago_Mobilon!

Ich werde mich an die Liste machen und versuchen, alles abzudecken.

Ich habe gerade einen Check durchgeführt, und es sieht so aus, als wäre deine CSS-Konfiguration auf deiner Discourse-Site fehlerhaft. Du hast doppelte cache-control-Header, und einer davon ist 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 „Gefällt mir“

Verwendest du die integrierte Google Analytics-Integration von Discourse?

8 „Gefällt mir“

Die Behandlung dieser Abfragen wird in

bearbeitet.

9 „Gefällt mir“

Wird bearbeitet in

11 „Gefällt mir“

Ich nehme an, Cloudflare hat diesen Header hinzugefügt, weil ich das Caching für das /comunidade/-Verzeichnis umgangen habe. Wenn ich es nicht entferne, werden seine Caching-Regeln auf das Discourse-CSS und -JS angewendet, was potenziell später zu Konflikten führen könnte.

Jedenfalls ging es bei dem Caching-Problem mehr darum, die Serverlast zu reduzieren. Die CSS-Dateien sind statisch, oder? Wenn dem so ist, würde die Tatsache, dass sie nicht zwischengespeichert werden, wenn auch unerwünscht, die Serverlast nicht direkt beeinflussen.

5 „Gefällt mir“

Ich nutze die Discourse-Integration mit Google Tag Manager.

4 „Gefällt mir“

Sie beeinträchtigen die Leistung für den Endnutzer, da bei jedem Artikel 59 Anfragen zum Herunterladen von 1,43 MB CSS (komprimiert auf 340 KB) gestellt werden.

Und sie werden auch vom Ruby-Server bereitgestellt, da wir davon ausgehen, dass Websites den Cache nicht brechen, was bedeutet, dass dieser Pfad unter normalen Bedingungen sehr selten genutzt wird.

Wenn ich mich nicht irre, bedeutet das Bereitstellen dieser Dateien mit einem gebrochenen Cache, dass sie sogar die Datenbank treffen.

4 „Gefällt mir“

Das ist eine großartige Idee, ich füge native Unterstützung dafür hinzu.

11 „Gefällt mir“

Das ist ein allgemeineres Problem beim Verfassen von Beiträgen unterwegs und wird von Verbesserungen profitieren, die in Creating/Editing a post on mobile: let's discuss the 2026 Discourse experience diskutiert werden.

8 „Gefällt mir“

Wir haben einen hervorragenden Cache für anonyme Benutzer, die Themen-Seiten aufrufen, und dieser deckt auch diesen neuen Modus ab. Solange genügend Pitchfork-Worker und Redis-I/O-Worker verfügbar sind, sollten Sie also gut skalieren können, um Spitzen zu bewältigen.

5 „Gefällt mir“

Das Pooling reduziert sich automatisch in Hintergrund-Tabs oder bei hoher Last, und das sollte hier auch gelten.

5 „Gefällt mir“

Ich habe mich dafür entschieden, diese in

zu taggen.

8 „Gefällt mir“

Ich habe Schwierigkeiten, die dynamische Höhe zum Laufen zu bringen. Trotz des Updates von Discourse und der Aktualisierung meines Snippets mit den neuesten Konfigurationen bleibt das Problem bestehen.

        <h4 class="comments-main-title component-title">Kommentare</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): ?>
                    // ID-Modus: Thema in der Datenbank gespeichert, immun gegen URL-Änderungen
                    topicId: <?php echo intval($topic_id); ?>,
                <?php else: ?>
                    // URL-Modus: Fallback, wenn die Erstellung über die API fehlschlägt
                    discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                <?php endif; ?>
                fullApp: true,
                lazyLoad: true, // Deaktiviere das verzögerte Laden des iframes
                lazyLoadMargin: '1500', // Pixel vor dem Viewport, um das Laden zu starten
                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 „Gefällt mir“

Könnten wir hier <iframe loading="lazy"> verwenden? Auf diese Weise brauchen wir kein benutzerdefiniertes JS oder Intersection Observer.

4 „Gefällt mir“

Oh, das wird jetzt in allen Browsern weitgehend unterstützt? TIL! Ich werde es so schnell wie möglich ändern.

8 „Gefällt mir“

Danke fürs Testen, das Problem wurde gefunden

5 „Gefällt mir“

Ausgezeichnet! Die dynamische Höhe funktioniert nun wie erwartet. Allerdings hat dies ein kleines Problem aufgeworfen: Wenn ich auf „Antworten“ klicke, versucht das Eingabefeld für die Antwort, sich an die Höhe des iframes anzupassen. In diesem Fall ist es fälschlicherweise auf 7385px Höhe angewachsen.

Der Beitrag enthielt 31 Kommentare, und der eingebettete iframe war 9757px hoch (ich hatte embedMaxHeight auf 15000px eingestellt).

Update: Ich habe tatsächlich festgestellt, dass das Kommentarformular die Höhe des iframes auf das Maximum ausdehnt, sodass beim Klicken auf „Verwerfen“ ein riesiger leerer Raum unter den Kommentaren übrig bleibt.

Screenshot 2026-04-16 at 16.03.37

5 „Gefällt mir“

Ich denke, du brauchst dort einen max-height-Wert mit einem vernünftigeren Wert, wie z. B. 1000 bis 1500px.

Damit wird dieses Feature dein anfängliches Problem lösen:

und es skaliert bis zu einem gewissen Punkt, aber angesichts des nativen Endlos-Scroll-Verhaltens von Discourse möchtest du nicht, dass die Höhe so stark zunimmt.

Dieses Feature wird das “Scrollen innerhalb von Scrollen” nicht in naher Zukunft beseitigen.

Was den mobilen Composer betrifft, so schaue ich mir an, was wir hier tun können.

6 „Gefällt mir“