نشر موقع Next.js ثابت على Cloudflare Workers
لماذا هذا الموقع تصدير ثابت بالكامل من Next.js يقدّمه Worker صغير: صفحات سريعة، وتكلفة شبه معدومة، وحماية الإدارة من جهة الخادم، وترويسات أمان.
قراءة 3 دقيقةGryffin Forge
هذا الموقع مبني بـNext.js وReact، لكن لا يوجد خادم Node.js يعمل في أي مكان. كل صفحة عامة تُعرض مسبقًا كـHTML ثابت وقت البناء وتُقدَّم من حافة شبكة Cloudflare. ويتولى Worker صغير الأمور القليلة التي تحتاج خادمًا فعلًا. إليك السبب وكيف تتكامل القطع.
الثبات أولًا
تقريبًا كل ما في موقع أعمال وعروض محتوى مستقر: أوصاف العروض، والمقالات، ودراسات الحالة، وصفحات الأدوات. لا شيء منه يتغير لكل زائر، فعرضه مع كل طلب يضيف تأخيرًا وتكلفة بلا فائدة.
مع output: "export"، يعرض Next.js كل مسار — بما فيها المسارات الديناميكية مثل /demos/[slug] التي تُعدّد بـgenerateStaticParams — كملفات HTML عادية. والنتيجة:
- عرض أول سريع — يصل HTML مكتملًا، دون وقت عرض على الخادم.
- أقل قدر من JavaScript — مكونات الخادم لا ترسل كودًا للعميل؛ ولا يُفعَّل إلا ما هو تفاعلي (المرشحات والحاسبات وعارض العروض).
- تكلفة تشغيل شبه معدومة — الملفات الثابتة على Cloudflare تُقدَّم من الذاكرة المؤقتة.
- أنماط فشل بسيطة — لا خادم تطبيق يمكن أن يتعطل.
حيث يبقى الخادم ضروريًا
ثلاثة أشياء لا يمكن أن تكون ثابتة:
- منطقة الإدارة يجب حمايتها قبل إرسال أي محتوى.
- الإحصاءات وتقارير الأخطاء تحتاج نقطة نهاية لاستقبالها.
- القدرات التجارية يجب رفضها من جهة الخادم، لا مجرد إخفائها.
يقف Worker أمام الملفات الثابتة لـ/admin و/api/* فقط. يتحقق من ملف تعريف ارتباط جلسة موقّع لمسارات الإدارة، ويحدّ محاولات الدخول، ويسجل عدد مشاهدات الصفحات في Durable Object دون ملفات تعريف ارتباط أو عناوين IP، ويعيد 403 لأي نقطة نهاية تجارية ما لم تُفعَّل علامة صريحة من جهة الخادم. وكل طلب آخر يذهب مباشرة إلى الملفات الثابتة.
المسودات لا تُنشر أبدًا
لكل عنصر محتوى حالة: مسودة، أو معاينة، أو منشور، أو مؤرشف. لا يولّد البناء صفحات إلا للمنشور والمعاينة؛ وتحمل صفحات المعاينة noindex وتُستبعد من القوائم وخريطة الموقع. أما المسودات فلا تصبح ملفات أصلًا، فلا شيء يمكن أن يتسرب.
ترويسات الأمان من ملف
تدعم الملفات الثابتة على Workers ملف _headers، فتُعلَن ترويسات الأمان مرة واحدة: سياسة أمان محتوى صارمة لا تسمح في الإطارات إلا بمصدر عارض العروض، وX-Content-Type-Options، وسياسة مُحيل متحفظة، وسياسة أذونات تعطّل المستشعرات التي لا يستخدمها الموقع أبدًا.
صفحات 404 صحيحة
تقدّم إعدادات الملفات الثابتة 404.html المولّدة مع رمز حالة 404 حقيقي للمسارات المجهولة، فلا تفهرس محركات البحث صفحات soft-404 أبدًا.
المقايضات
- لا تخصيص لكل طلب. كل ما هو ديناميكي يجب أن يعمل في المتصفح أو في Worker.
- إعادة البناء للنشر. تغيير المحتوى يتطلب بناءً ونشرًا. لموقع يتغير بضع مرات أسبوعيًا هذه ميزة: كل تغيير يُراجع ويُؤرشف بإصدار.
- لا تحسين مدمج للصور. تُحوَّل لقطات الشاشة إلى WebP وقت الالتقاط وتُقدَّم بأحجام ثابتة.
لموقع عرض، تستحق هذه المقايضات بسهولة: النتيجة سريعة ورخيصة وآمنة افتراضيًا وسهلة الفهم.