تجربة تكنوبلوج مع تعليقات ديسكورش

مرحباً!

أنا متحمس جداً لهذه الميزة الجديدة. لقد كنت أنتظر حلاً مثل هذا منذ فترة طويلة، وكانت الاستجابات الأولية من قرائنا في Tecnoblog رائعة – فهم يحبون دمج المجتمع.

ومع ذلك، بعد بعض الاختبارات الواقعية، لاحظت بعض العقبات التقنية التي نحتاج إلى تجاوزها لجعل هذا يبدو كنظام تعليقات أصلي حقاً، والأهم من ذلك، لجعله مستداماً للمواقع ذات الزيارات العالية.

إليك ما وجدته حتى الآن:

1. الأداء وحمل الخادم

ارتفع حمل الخادم لدينا بشكل كبير بعد أن قمنا بتضمين التطبيق الكامل. عند النظر إلى Cloudflare، تضاعف حجم الطلبات لدينا 10 مرات. بعض الأفكار حول كيفية تحسين هذا:

  • التحميل الكسول (Lazy Loading): تنفيذ التحميل الكسول لملفات JavaScript يساعد كثيراً (أستخدم بالفعل حيلة لهذا الغرض).
            <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>

هنا يمكنك رؤية انخفاض عدد الطلبات بعد تنفيذ التحميل الكسول (وكانت بعض أجزاء الموقع لا تزال مخزنة مؤقتاً، لذا فهذه ليست النتيجة النهائية):

  • تقليل حجم الحمولة: هل يمكننا تقليل الموارد المحملة داخل التضمين؟ على سبيل المثال: لاحظت استعلامات لروابط الدردشة وفحوصات رصيد الذكاء الاصطناعي – هل هذه ضرورية لعرض التضمين؟

  • تكرار الطلبات: طلبات POST في الوقت الفعلي عدوانية بعض الشيء. ربما يمكننا تقليل تكرار الاستعلامات لنسخة التضمين؟

  • الذاكرة المؤقتة: إدارة محسنة للذاكرة المؤقتة للمواضيع المضمنة للتعامل مع ذروات حركة المرور.

2. فوضى التحليلات

حالياً، يقوم التضمين بتشغيل سكريبتات Google Analytics/GTM. هذا يضاعف عدد صفحاتنا (ضغطة واحدة للمنشور، وأخرى للإطار)، مما يفسد بياناتنا. سيكون مثالياً إذا كان النظام قادراً على اكتشاف أنه داخل إطار وإيقاف أي سكريبتات تتبع تلقائياً (تحليلات Discourse أيضاً).

3. مشكلة ارتفاع الإطار

هذا هو على الأرجح أكبر عائق لتجربة المستخدم. إذا كان المنشور لا يحتوي على تعليقات، فهناك فراغ غريب. إذا كان له سلسلة طويلة، يتم قطع الإطار داخل أول تعليقين أو ثلاثة، مما يجبر على “تمرير داخل تمرير” وهو أمر سيء جداً، خاصة على الهاتف المحمول.

للتنافس حقاً مع شيء مثل Disqus، نحتاج إلى أن يكون الارتفاع ديناميكياً (وفقاً لعدد التعليقات) وأن يكون لدينا زر “اقرأ المزيد” يوسع السلسلة بعد عدد معين من الردود.

4. تعارضات الإضافات

بما أن التضمين يحمل جميع الإضافات النشطة، فإننا نرى بعض السلوكيات الغريبة. على سبيل المثال، تظهر “Google One Tap” داخل منشور المدونة. عندما يسجل المستخدم دخوله، يتم تحديث الإطار وإسقاطه على الصفحة الرئيسية للمجتمع بدلاً من سلسلة التعليقات. القدرة على تعطيل إضافات معينة يدوياً لعرض التضمين ستكون منقذة للحياة.

5. صعوبة تسجيل الدخول

التدفق الحالي قاتل للتحويلات: ينقر المستخدم على تسجيل الدخول - تفتح علامة تبويب جديدة - يحدث تسجيل الدخول - يبقى المستخدم على الصفحة الرئيسية للمجتمع. عند العودة إلى منشور المدونة، لا يزال الإطار يبدو غير مسجل الدخول حتى يقوم المستخدم بتحديث الصفحة بالكامل يدوياً. إنه حلقة مربكة تجعل الناس يستسلمون ويغادرون قبل التعليق.

بما أننا فعلنا التضمين الجديد، فإن التسجيلات اليومية لدينا تضاعفت أكثر من مرة، وهو أمر رائع. ومع ذلك، لم تتحرك مقاييس التفاعل لدينا على الإطلاق. في الواقع، انخفضت نسبة DAU/MAU لدينا – لدينا المزيد من المستخدمين المسجلين، لكنهم لا يتفاعلون. لم تشهد مقاييس مثل “المستخدمين النشطين يومياً” و"المساهمين الجدد" و"المنشورات" أي زيادة.

هذا يثبت أن الناس يرغبون في الانضمام إلى المحادثة، لكنهم يضيعون في حلقة تسجيل الدخول ويهملون المنشور قبل أن يتمكنوا من التعليق فعلياً.

6. واجهة الهاتف المحمول

على الهاتف المحمول، تشغل نافذة الرد الشاشة بأكملها، لذلك تفقد كل سياق المحادثة التي ترد عليها. يبدو الأمر محبباً بعض الشيء – أي شيء يمكننا القيام به لإبقائه أكثر إحكاماً سيكون فوزاً كبيراً.


أريد حقاً جعل هذا النظام الافتراضي في Tecnoblog (وأيضاً في موقع آخر نملكه). أخبرني إذا كنت تريد التعمق أكثر في أي من هذه النقاط!

14 إعجابًا

سيتم إصلاح ذلك بواسطة

11 إعجابًا

شكراً لك على الملاحظات المفصلة @Thiago_Mobilon !

سأعمل على القائمة وأحاول تغطية كل شيء في النهاية.

لقد قمت للتو بفحص هنا، ويبدو أن ملفات CSS الخاصة بك غير مُهيأة بشكل صحيح على موقع Discourse الخاص بك. لديك رؤوس cache-control مكررة، وواحد منها هو 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 إعجابات

هل تستخدم تكامل Google Analytics المدمج في Discourse؟

8 إعجابات

يتم التعامل مع هذه الأمور في

9 إعجابات

[quote=“Thiago_Mobilon, post:1, topic:400721”]
للتنافس فعليًا مع شيء مثل Disqus، نحتاج إلى أن يكون الارتفاع ديناميكيًا (حسب عدد التعليقات)

[/quote]\n
تم التعامل مع ذلك في

11 إعجابًا

أعتقد أن Cloudflare يجب أن يكون قد أضاف هذا الرأس لأنني تجاوزت ذاكرة التخزين المؤقت لمجلد /comunidade/. إذا لم أقم بإزالته، فسيطبق قواعد التخزين المؤقت الخاصة به على ملفات CSS و JS الخاصة بـ Discourse، مما قد يسبب تعارضات في المستقبل.

على أي حال، عندما أثارته مشكلة التخزين المؤقت، كان الهدف الأساسي هو تقليل الحمل على الخادم. ملفات CSS ثابتة، أليس كذلك؟ إذا كان الأمر كذلك، فإن حقيقة أنها غير مخزنة مؤقتًا، رغم أنها غير مرغوب فيها، لن تؤثر بشكل مباشر على حمل الخادم.

5 إعجابات

أستخدم تكامل Discourse مع Google Tag Manager.

4 إعجابات

لكنها تؤثر على أداء المستخدم النهائي، حيث تتضمن 59 طلبًا لتحميل 1.43 ميجابايت من ملفات CSS (مضغوطة إلى 340 كيلوبايت) مع كل مقال.

كما يتم تقديمها من خلال خادم Ruby، لأننا نتوقع أن المواقع لا تكسر التخزين المؤقت، مما يعني أن هذا المسار يُستخدم نادرًا في الظروف العادية.

إذا لم أكن مخطئًا، فإن تقديم هذه الملفات مع كسر التخزين المؤقت يعني أنها تصل حتى إلى قاعدة البيانات.

4 إعجابات

هذه فكرة رائعة، سأضيف دعمًا أصليًا لها

11 إعجابًا

هذه مشكلة أكثر عمومية تتعلق بالتأليف أثناء التنقل، وستستفيد من التحسينات من Creating/Editing a post on mobile: let's discuss the 2026 Discourse experience.

8 إعجابات

لدينا ذاكرة مؤقتة رائعة للمستخدمين المجهولين الذين يزورون صفحات المواضيع، وهي تغطي أيضًا هذا الوضع الجديد، لذا يجب أن تكون قادرًا على التوسع بشكل جيد للتعامل مع الذروات طالما يوجد عدد كافٍ من عمال Pitchfork وعمال I/O في Redis.

5 إعجابات

يتم تخفيض الاستعلامات تلقائيًا في علامات التبويب الخلفية أو أثناء أحداث الحمل العالي، وينطبق الأمر نفسه هنا.

5 إعجابات

تمت الموافقة على وضع علامات على هؤلاء في

8 إعجابات

أواجه صعوبات في جعل الارتفاع الديناميكي يعمل بشكل صحيح. على الرغم من تحديث Discourse وتحديث مقتطف الكود الخاص بي بأحدث الإعدادات، إلا أن المشكلة لا تزال قائمة.

        <h4 class="comments-main-title component-title">التعليقات</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): ?>
                    // وضع المعرف: الموضوع محفوظ في قاعدة البيانات، وغير متأثر بتغييرات الرابط
                    topicId: <?php echo intval($topic_id); ?>,
                <?php else: ?>
                    // وضع الرابط: حل بديل عند فشل الإنشاء عبر واجهة برمجة التطبيقات (API)
                    discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                <?php endif; ?>
                fullApp: true,
                lazyLoad: true, // تعطيل التحميل الكسول للإطار (iframe)
                lazyLoadMargin: '1500', // البكسلات قبل منطقة العرض لبدء التحميل
                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 إعجابات

هل يمكننا استخدام <iframe loading="lazy"> هنا؟ بهذه الطريقة، لن نحتاج إلى JavaScript مخصص أو مراقبي التقاطع (Intersection Observers).

4 إعجابات

أوه، إذن هذه الميزة مدعومة الآن على نطاق واسع عبر المتصفحات؟ تعلمت شيئاً جديداً اليوم! سأقوم بتغييرها في أقرب وقت ممكن.

8 إعجابات

شكراً لك على الاختبار، تم العثور على المشكلة

5 إعجابات

ممتاز! الآن يعمل الارتفاع الديناميكي كما هو متوقع. ومع ذلك، فقد أدى ذلك إلى ظهور مشكلة بسيطة: عندما أضغط للرد، يحاول حقل إدخال الرد ضبط ارتفاعه وفقًا لارتفاع الإطار المضمن (iframe). في هذه الحالة، أصبح ارتفاعه بشكل خاطئ 7385 بكسل.

احتوى المنشور على 31 تعليقًا، وكان ارتفاع الإطار المضمن 9757 بكسل (كانت قد قمت بتعيين الحد الأقصى للارتفاع المضمن embedMaxHeight على 15000 بكسل).

تحديث: لاحظت في الواقع أن نموذج التعليقات يوسع ارتفاع الإطار المضمن إلى الحد الأقصى، لذا عندما أضغط على «إلغاء»، ينتهي بنا المطاف بمساحة فارغة كبيرة أسفل التعليقات.

Screenshot 2026-04-16 at 16.03.37

5 إعجابات

أعتقد أنك ستحتاج إلى تعيين قيمة max-height أكثر معقولية هناك، مثل 1000 إلى 1500px.

لذا، سيعالج هذا الميزة مشكلتك الأولية المتمثلة في

وسيتوسع حتى نقطة معينة، ولكن نظرًا لسلوك التمرير اللانهائي الأصلي في Discourse، لا تريد أن تزداد الارتفاع كثيرًا.

لن تزيل هذه الميزة مشكلة “التمرير داخل التمرير” في أي وقت قريب.

أما بالنسبة لمحرر الهاتف المحمول، فأنا أبحث في ما يمكننا فعله هنا.

6 إعجابات