يشرح كيف يحقق موقع الوثائق تحميلات صفحات ثابتة سريعة مع الحفاظ على وظيفة وضع التحرير في نظام إدارة المحتوى
يشرح هذا الدليل كيف يحقق موقع الوثائق تحميل صفحات ثابتة سريعة مع الحفاظ على وظيفة وضع التحرير في نظام إدارة المحتوى.
نستخدم مسارين للمحتوى نفسه:
app/
├── [...slug]/page.tsx # الإنتاج: force-static (سريع)
└── preview/[...slug]/page.tsx # وضع التحرير: force-dynamic (يقرأ searchParams)
تقوم وسيطة الوكيل بإعادة كتابة طلبات وضع التحرير بشكل شفاف:
طلبات المستخدم: /en/headless/quickstart?edit_mode=true
↓
يكتشف الوكيل ?edit_mode=true
↓
إعادة كتابة داخلية إلى: /preview/en/headless/quickstart?edit_mode=true
↓
يقوم المسار الديناميكي بالتصيير مع أغلفة التحرير
لا يرى المستخدم أبدًا /preview في عنوان URL الخاص به - إنها إعادة كتابة داخلية.
// app/[...slug]/page.tsx
export const dynamic = 'force-static';
export const revalidate = 60;
export default async function Page({ params }) {
// لا توجد searchParams - الصفحة ثابتة بالكامل
return
// app/preview/[...slug]/page.tsx
export const dynamic = 'force-dynamic';
export default async function PreviewPage({ params, searchParams }) {
// searchParams متاحة - يمكنها اكتشاف edit_mode
return <ParametricRoutePage params={params
?edit_mode=true من عنوان URL// src/proxy.ts
export const proxy = async (request: NextRequest) => {
const { pathname, searchParams } = request.nextUrl;
const editMode = searchParams.get('edit_mode');
| السيناريو | زمن الاستجابة | التصيير |
|---|---|---|
| صفحة الإنتاج (مخزنة مؤقتًا) | ~50-100ms | ثابتة من شبكة CDN |
| صفحة الإنتاج (قديمة) | ~50-100ms + تحديث في الخلفية | ثابتة، ثم ISR |
| وضع التحرير | ~500-1500ms | SSR ديناميكي |
إعداد revalidate = 60 يمكّن ISR. هذا لا يعني أن الصفحات يعاد احتسابها كل 60 ثانية.
يستخدم ISR نمط stale-while-revalidate:
وصول طلب:
→ هل الصفحة المخزنة مؤقتًا أحدث من 60 ثانية؟ → قدّم من الذاكرة المؤقتة (فوري)
→ هل الصفحة المخزنة مؤقتًا أقدم من 60 ثانية؟ → قدّم النسخة القديمة من الذاكرة المؤقتة (فوري)
+ إعادة التحقق في الخلفية للطلب التالي
لا توجد طلبات = لا إعادة احتساب. إطلاقًا.
مثال:
نافذة الستين ثانية عبارة عن شبكة أمان. من الناحية المثالية، سنستخدم إعادة التحقق عند الطلب عبر webhooks عند تغير محتوى نظام إدارة المحتوى.
| حالة الاستخدام | عنوان URL | المسار المستخدم |
|---|---|---|
| التصفح العادي | /en/headless/quickstart | ثابت |
| مُنشئ قوالب نظام إدارة المحتوى | /en/headless/quickstart?edit_mode=true | معاينة (عبر إعادة الكتابة) |
| معاينة كتلة الذكاء الاصطناعي | /en/headless/quickstart?ai_preview=1 | معاينة (عبر إعادة الكتابة) |
النهج البسيط (من دون force-static، ومن دون مسار معاينة) يعمل ولكنه بطيء:
// نهج بسيط - يعمل ولكن يستغرق حوالي 1-2 ثانية لكل طلب
export default async function Page({ params, searchParams }) {
return <ParametricRoutePage params={params} searchParams={searchParams} />;
}
هذا يصيّر المحتوى ديناميكيًا مع كل طلب. بالنسبة لموقع وثائق يضم العديد من الصفحات، يعني ذلك:
تمنحنا بنية المسارين المزدوجة أفضل ما في العالمين: سرعة ثابتة للقراء، ووظائف ديناميكية للمحررين.