الفرق بين المراجعتين لصفحة: «Next.js/preview mode»
لا ملخص تعديل |
لا ملخص تعديل |
||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:نمط استعراض الصفحات في Next.js}}</noinclude> | <noinclude>{{DISPLAYTITLE:نمط استعراض الصفحات في Next.js}}</noinclude> | ||
<blockquote>'''تنبيه''': تُخصص صفحة التوثيق هذه للنسخة 9.3 من Next.js والنسخ الأعلى.</blockquote>تحدثنا في توثيق [[Next.js/pages|صفحات Next.js]] وتوثيق [[Next.js/data fetching|إحضار البيانات]] عن كيفية تصيير الصفحات | <blockquote>'''تنبيه''': تُخصص صفحة التوثيق هذه للنسخة 9.3 من Next.js والنسخ الأعلى.</blockquote>تحدثنا في توثيق [[Next.js/pages|صفحات Next.js]] وتوثيق [[Next.js/data fetching|إحضار البيانات]] عن كيفية تصيير الصفحات مسبقًا أثناء بناء التطبيق (التوليد الساكن Static Generation) باستخدام <code>getStaticProps</code> و <code>getStaticPaths</code>. | ||
تظهر فائدة التوليد الساكن في إحضار البيانات من منظومة إدارة محتوى دون ترويسات | تظهر فائدة التوليد الساكن في إحضار البيانات من منظومة إدارة محتوى دون ترويسات headless CMS، لكنه ليس مثاليًا عندما تحاول استعراض مسوّدة عملك مباشرة على الصفحة. فقد ترغب في هذه الحالة في تصيير صفحتك عند الطلب بدل تصييرها أثناء بناء التطبيق، وإحضار المحتوى التجريبي بدلًا من المحتوى الذي سيُنشر. أي قد ترغب بتجاوز التوليد الساكن في هذه الحالة بالتحديد. | ||
تمتلك Next.js ميزة تُدعى نمط الاستعراض لحل هذا الأمر. وإليك طريقة استخدامه. | تمتلك Next.js ميزة تُدعى نمط الاستعراض لحل هذا الأمر. وإليك طريقة استخدامه. | ||
== الخطوة الأولى: أنشئ مسار API للاستعراض ولج إليه == | == الخطوة الأولى: أنشئ مسار API للاستعراض ولج إليه == | ||
<blockquote>'''تلميح''': الق نظرة أولًا على توثيق [[Next.js/api routes|مسارات API]] إن لم تكن على دراية بها.</blockquote>أنشئ أولًا مسار API لاستعراض الصفحةوسمِّه ما تشاء مثل <code>pages/api/preview.js</code> أو (استخدم الامتداد | <blockquote>'''تلميح''': الق نظرة أولًا على توثيق [[Next.js/api routes|مسارات API]] إن لم تكن على دراية بها.</blockquote>أنشئ أولًا مسار API لاستعراض الصفحةوسمِّه ما تشاء مثل <code>pages/api/preview.js</code> أو (استخدم الامتداد <code>ts.</code> إن كنت تستخدم TypeScript). | ||
عليك أن تستدعي ضمن هذا المسار الدالة <code>setPreviewData</code> من خلال كائن الاستجابة <code>res</code>، وينبغي أن يكون وسيطها كائنًا قد يُستخدم لاحقًا مع الدالة <code>getStaticProps</code>. أما الآن فسنستخدم القوسين الفارغين <code>{}</code>.<syntaxhighlight lang="javascript"> | عليك أن تستدعي ضمن هذا المسار الدالة <code>setPreviewData</code> من خلال كائن الاستجابة <code>res</code>، وينبغي أن يكون وسيطها كائنًا قد يُستخدم لاحقًا مع الدالة <code>getStaticProps</code>. أما الآن فسنستخدم القوسين الفارغين <code>{}</code>.<syntaxhighlight lang="javascript"> | ||
سطر 17: | سطر 17: | ||
</syntaxhighlight>تهيئ الدالة <code>res.setPreviewData</code> بعض ملفات تعريف الارتباط cookies في المتصفح والتي تفعّل نمط الاستعراض. تُعد أية طلبات تتضمن ملفات تعريف الارتباط تلك ضمن نمط الاستعراض، ويتغير سلوك التوليد الساكن للصفحات. | </syntaxhighlight>تهيئ الدالة <code>res.setPreviewData</code> بعض ملفات تعريف الارتباط cookies في المتصفح والتي تفعّل نمط الاستعراض. تُعد أية طلبات تتضمن ملفات تعريف الارتباط تلك ضمن نمط الاستعراض، ويتغير سلوك التوليد الساكن للصفحات. | ||
بإمكانك اختبار الأمر يدويًا، بإنشاء مسار API كما في المثال التالي | بإمكانك اختبار الأمر يدويًا، بإنشاء مسار API كما في المثال التالي والولوج إليه من خلال المتصفح:<syntaxhighlight lang="javascript"> | ||
// مثال بسيط للاختبار اليدوي | // مثال بسيط للاختبار اليدوي | ||
//موجودًا pages/api/preview.js إن كان المسار | //موجودًا pages/api/preview.js إن كان المسار | ||
سطر 28: | سطر 28: | ||
=== الولوج الآمن إلى الصفحة من منظومة إدارة محتوى دون ترويسة === | === الولوج الآمن إلى الصفحة من منظومة إدارة محتوى دون ترويسة === | ||
قد ترغب عمليًا باستدعاء مسار | قد ترغب عمليًا باستدعاء مسار API بشكل آمن من منظومة إدارة محتوى CMS، وستختلف خطوات إنجاز الأمر وفقًا للمنظومة التي تستخدمها. لهذا سنستعرض بعض الخطوات الشائعة التي يمكنك اتخاذها. تفترض هذه الخطوات أن المنظومة التي تستخدمها تدعم ضبط عناوين URL مخصصة للاستعراض، فإن لم تكن كذلك، ستبقى قادرًا على استخدام هذه الطريقة لتأمين عناوين الاستعراض، لكن عليك أن تبني وتلج إلى هذه العناوين يدويًا. | ||
* أولًا، عليك إنشاء مفتاح استيثاق نصي سري مستخدمًا موّلد مفاتيح استيثاق token تختاره، وسيعرفه فقط تطبيق Next.js والمنظومة. وهكذا لن يتمكن الأشخاص الذين لا يُسمح لهم بدخول المنظومة من الوصول إلى عناوين URL. | * أولًا، عليك إنشاء مفتاح استيثاق نصي سري مستخدمًا موّلد مفاتيح استيثاق token تختاره، وسيعرفه فقط تطبيق Next.js والمنظومة. وهكذا لن يتمكن الأشخاص الذين لا يُسمح لهم بدخول المنظومة من الوصول إلى عناوين URL. | ||
سطر 36: | سطر 36: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
# <code><your-site></code> : اسم نطاق التطوير الخاص بك. | # <code><your-site></code>: اسم نطاق التطوير الخاص بك. | ||
# <code><token></code> : يُستبدل بمفتاح الاستيثاق الذي ولّدته. | # <code><token></code>: يُستبدل بمفتاح الاستيثاق الذي ولّدته. | ||
# <code><path></code> : مسار الصفحة التي تريد استعراضها. فإن أردت استعراض الصفحة <code>posts/foo/</code> مثلًا، عليك أن تستخدم <code>slug=/posts/foo&</code>. وقد تسمح لك المنظومة | # <code><path></code>: مسار الصفحة التي تريد استعراضها. فإن أردت استعراض الصفحة <code>posts/foo/</code> مثلًا، عليك أن تستخدم <code>slug=/posts/foo&</code>. وقد تسمح لك المنظومة بأن تضع متغيرًا في عنوان الاستعراض، وبالتالي يمكن أن يُضبط المسار <code><path></code> ديناميكيًا وفقًا لبيانات المنظومة كالتالي: <code>slug=/posts/{entry.fields.slug}&</code>. | ||
* أخيرًا، نفّذ ما يلي في مسار API الخاص بالاستعراض: | * أخيرًا، نفّذ ما يلي في مسار API الخاص بالاستعراض: | ||
** تأكد من تطابق مفتاح | ** تأكد من تطابق مفتاح الاستيثاق، وأن معاملات <code>slug</code> موجودة (ينبغي أن يخفق الطلب إن لم تكن موجودة). | ||
** استدع الدالة | ** استدع الدالة <code>res.setPreviewData</code>. | ||
** وجّه المتصفح إلى المسار المحدد في (يستخدم المثال التالي التوجيه 307 (إعادة توجيه مؤقت)). | ** وجّه المتصفح إلى المسار المحدد في <code><path></code> (يستخدم المثال التالي التوجيه 307 (إعادة توجيه مؤقت)). | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
export default async (req, res) => { | export default async (req, res) => { | ||
// تأكد من تطابق مفتاح الاستيثاق والمعاملات | // تأكد من تطابق مفتاح الاستيثاق والمعاملات | ||
//يجب أن | //يجب أن يُعرف فقط من قبل التطبيق ومنظومة إدارة المحتوى | ||
if (req.query.secret !== 'MY_SECRET_TOKEN' || !req.query.slug) { | if (req.query.secret !== 'MY_SECRET_TOKEN' || !req.query.slug) { | ||
return res.status(401).json({ message: 'Invalid token' }) | return res.status(401).json({ message: 'Invalid token' }) | ||
سطر 73: | سطر 73: | ||
تقتضي الخطوة التالية تحديث <code>getStaticProps</code> لدعم نمط الاستعراض. فإن طلبت صفحة تحتوي <code>getStaticProps</code> وقد ضُبطت ملفات تعريف الارتباط فيها على وضع الاستعراض (من خلال <code>res.setPreviewData</code>)، عندها تُستدعى الدالة <code>getStaticProps</code> عند الطلب بدلًا من وقت البناء. | تقتضي الخطوة التالية تحديث <code>getStaticProps</code> لدعم نمط الاستعراض. فإن طلبت صفحة تحتوي <code>getStaticProps</code> وقد ضُبطت ملفات تعريف الارتباط فيها على وضع الاستعراض (من خلال <code>res.setPreviewData</code>)، عندها تُستدعى الدالة <code>getStaticProps</code> عند الطلب بدلًا من وقت البناء. | ||
إضافة إلى ذلك، تُستدعى الدالة مع الكائن <code>context</code> | إضافة إلى ذلك، تُستدعى الدالة مع الكائن <code>context</code> إذ: | ||
* يحمل <code>context.preview</code> القيمة <code>true</code>. | * يحمل <code>context.preview</code> القيمة <code>true</code>. | ||
* <code>context.previewData</code> هو نفسه الوسيط المستخدم في | * <code>context.previewData</code> هو نفسه الوسيط المستخدم في <code>setPreviewData</code>. | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
export async function getStaticProps(context) { | export async function getStaticProps(context) { | ||
سطر 85: | سطر 85: | ||
// `setPreviewData` | // `setPreviewData` | ||
} | } | ||
</syntaxhighlight>لقد استخدمنا الدالة <code>({})res.setPreviewData</code> في مسار API الخاص بالاستعراض، لذا ستكون قيمة <code>context.previewData</code> هي <code>{}</code>. يمكن الاستفادة من ذلك في تمرير معلومات جلسة العمل من مسار API الخاص بالاستعراض إلى <code>getStaticProps</code> عند الحاجة. | </syntaxhighlight>لقد استخدمنا الدالة <code>({})res.setPreviewData</code> في مسار API الخاص بالاستعراض، لذا ستكون قيمة <code>context.previewData</code> هي <code>{}</code>. يمكن الاستفادة من ذلك في تمرير معلومات جلسة العمل من مسار API الخاص بالاستعراض إلى <code>getStaticProps</code> عند الحاجة. وسيكون <code>context.params</code> متاحًا إيضًا إن كنت تستخدم <code>getStaticPaths</code>. | ||
=== إحضار بيانات الاستعراض === | === إحضار بيانات الاستعراض === | ||
سطر 96: | سطر 96: | ||
// ... | // ... | ||
} | } | ||
</syntaxhighlight>فإن ولجت الآن إلى مسار API باستخدام <code>secret</code> و <code>slug</code> من خلال منظومة إدارة محتوى دون ترويسات أو يدويًا، من المفترض أن ترى المحتوى الذي تنوي استعراضه. وإن | </syntaxhighlight>فإن ولجت الآن إلى مسار API باستخدام <code>secret</code> و <code>slug</code> من خلال منظومة إدارة محتوى دون ترويسات أو يدويًا، من المفترض أن ترى المحتوى الذي تنوي استعراضه. وإن حدَّثت مسودتك دون أن تنشرها، من المفترض أن تكون قادرًا على استعراضها أيضًا:<syntaxhighlight lang="bash"> | ||
# للاستعراض URL يضبط ما يلي عنوان | # للاستعراض URL يضبط ما يلي عنوان | ||
# من خلال منظومة إدارة محتوى أو يدويًا وستكون قادرًا على استعراض المحتوى | # من خلال منظومة إدارة محتوى أو يدويًا وستكون قادرًا على استعراض المحتوى | ||
سطر 114: | سطر 114: | ||
res.clearPreviewData() | res.clearPreviewData() | ||
} | } | ||
</syntaxhighlight>أرسل بعد ذلك طلبًا إلى <code>api/clear-preview-mode-cookies/</code> | </syntaxhighlight>أرسل بعد ذلك طلبًا إلى <code>api/clear-preview-mode-cookies/</code> لتفعيل مسار API. وإن كنت تستدعي هذا المسار مستخدمًا المكوّن <code>next/link</code>، فلا بد من تمرير <code>prefetch={false}</code> لمنع استدعاء <code>clearPreviewData</code> خلال الإحضار المسبق للرابط. | ||
=== تحديد المدة الزمنية لنمط الاستعراض === | === تحديد المدة الزمنية لنمط الاستعراض === | ||
تأخذ الدالة <code>setPreviewData</code> معاملًا اختياريًا ثانيًا | تأخذ الدالة <code>setPreviewData</code> معاملًا اختياريًا ثانيًا يُفترض أن يكون كائن خيارات. يقبل هذا الكائن المفاتيح التالية: | ||
* <code>maxAge</code>: يحدد عدد الثواني التي ينبغي أن تدومها جلسة العمل. | * <code>maxAge</code>: يحدد عدد الثواني التي ينبغي أن تدومها جلسة العمل. | ||
سطر 130: | سطر 130: | ||
=== العمل مع الدالة <code>getServerSideProps</code> === | === العمل مع الدالة <code>getServerSideProps</code> === | ||
يعمل نمط الاستعراض مع الدالة <code>getServerSideProps</code> | يعمل نمط الاستعراض مع الدالة <code>getServerSideProps</code> أيضًا، وسيكون متاحًا مع الكائن الذي يضم <code>preview</code> و <code>previewData</code>. | ||
=== العمل مع مسارات API === | === العمل مع مسارات API === | ||
سطر 142: | سطر 142: | ||
=== مفاتيح وملفات ارتباط خاصة لكل عملية بناء <code>next build</code> === | === مفاتيح وملفات ارتباط خاصة لكل عملية بناء <code>next build</code> === | ||
تتغير قيم ملفات تعريف الارتباط التي تفرض حالة الاستعراض ومفتاح الاستيثاق لتشفير بيانات <code>previewData</code> مع اكتمال كل عملية بناء <code>next build</code>. يضمن ذلك عدم القدرة على تخمين قيم ملفات تعريف الارتباط.<blockquote>'''ملاحظة''': عليك أن تسمح باستخدام ملفات تعريف ارتباط مصدرها طرف آخر وإذنًا بالوصول إلى التخزين المحلي، لاختبار نمط الاستعراض محليًا ضمن متصفحك عبر طلبات HTTP.</blockquote> | |||
== اقرأ أيضًا == | == اقرأ أيضًا == |
مراجعة 05:27، 4 يونيو 2022
تنبيه: تُخصص صفحة التوثيق هذه للنسخة 9.3 من Next.js والنسخ الأعلى.
تحدثنا في توثيق صفحات Next.js وتوثيق إحضار البيانات عن كيفية تصيير الصفحات مسبقًا أثناء بناء التطبيق (التوليد الساكن Static Generation) باستخدام getStaticProps
و getStaticPaths
.
تظهر فائدة التوليد الساكن في إحضار البيانات من منظومة إدارة محتوى دون ترويسات headless CMS، لكنه ليس مثاليًا عندما تحاول استعراض مسوّدة عملك مباشرة على الصفحة. فقد ترغب في هذه الحالة في تصيير صفحتك عند الطلب بدل تصييرها أثناء بناء التطبيق، وإحضار المحتوى التجريبي بدلًا من المحتوى الذي سيُنشر. أي قد ترغب بتجاوز التوليد الساكن في هذه الحالة بالتحديد.
تمتلك Next.js ميزة تُدعى نمط الاستعراض لحل هذا الأمر. وإليك طريقة استخدامه.
الخطوة الأولى: أنشئ مسار API للاستعراض ولج إليه
تلميح: الق نظرة أولًا على توثيق مسارات API إن لم تكن على دراية بها.
أنشئ أولًا مسار API لاستعراض الصفحةوسمِّه ما تشاء مثل pages/api/preview.js
أو (استخدم الامتداد ts.
إن كنت تستخدم TypeScript).
عليك أن تستدعي ضمن هذا المسار الدالة setPreviewData
من خلال كائن الاستجابة res
، وينبغي أن يكون وسيطها كائنًا قد يُستخدم لاحقًا مع الدالة getStaticProps
. أما الآن فسنستخدم القوسين الفارغين {}
.
export default function handler(req, res) {
// ...
res.setPreviewData({})
// ...
}
تهيئ الدالة res.setPreviewData
بعض ملفات تعريف الارتباط cookies في المتصفح والتي تفعّل نمط الاستعراض. تُعد أية طلبات تتضمن ملفات تعريف الارتباط تلك ضمن نمط الاستعراض، ويتغير سلوك التوليد الساكن للصفحات.
بإمكانك اختبار الأمر يدويًا، بإنشاء مسار API كما في المثال التالي والولوج إليه من خلال المتصفح:
// مثال بسيط للاختبار اليدوي
//موجودًا pages/api/preview.js إن كان المسار
//ضمن المتصفح api/preview افتح الصفحة
export default function handler(req, res) {
res.setPreviewData({})
res.end('Preview mode enabled')
}
قد تلاحظ إن كنت تستخدم أدوات مطوري ويب أن ملفات تعريف ارتباط prerender_bypass__
و next_preview_data__
ستُهيئ عند إرسال هذا الطلب.
الولوج الآمن إلى الصفحة من منظومة إدارة محتوى دون ترويسة
قد ترغب عمليًا باستدعاء مسار API بشكل آمن من منظومة إدارة محتوى CMS، وستختلف خطوات إنجاز الأمر وفقًا للمنظومة التي تستخدمها. لهذا سنستعرض بعض الخطوات الشائعة التي يمكنك اتخاذها. تفترض هذه الخطوات أن المنظومة التي تستخدمها تدعم ضبط عناوين URL مخصصة للاستعراض، فإن لم تكن كذلك، ستبقى قادرًا على استخدام هذه الطريقة لتأمين عناوين الاستعراض، لكن عليك أن تبني وتلج إلى هذه العناوين يدويًا.
- أولًا، عليك إنشاء مفتاح استيثاق نصي سري مستخدمًا موّلد مفاتيح استيثاق token تختاره، وسيعرفه فقط تطبيق Next.js والمنظومة. وهكذا لن يتمكن الأشخاص الذين لا يُسمح لهم بدخول المنظومة من الوصول إلى عناوين URL.
- ثانيًا، إن كانت تدعم منظومة إدارة المحتوى التي لا تستخدم الترويسات ضبط عناوين استعراض مخصصة، حدد العنوان التالي كعنوان URL للاستعراض (على افتراض أن وجهة مسار API هي
pages/api/preview.js
).
https://<your-site>/api/preview?secret=<token>&slug=<path>
<your-site>
: اسم نطاق التطوير الخاص بك.<token>
: يُستبدل بمفتاح الاستيثاق الذي ولّدته.<path>
: مسار الصفحة التي تريد استعراضها. فإن أردت استعراض الصفحةposts/foo/
مثلًا، عليك أن تستخدمslug=/posts/foo&
. وقد تسمح لك المنظومة بأن تضع متغيرًا في عنوان الاستعراض، وبالتالي يمكن أن يُضبط المسار<path>
ديناميكيًا وفقًا لبيانات المنظومة كالتالي:slug=/posts/{entry.fields.slug}&
.
- أخيرًا، نفّذ ما يلي في مسار API الخاص بالاستعراض:
- تأكد من تطابق مفتاح الاستيثاق، وأن معاملات
slug
موجودة (ينبغي أن يخفق الطلب إن لم تكن موجودة). - استدع الدالة
res.setPreviewData
. - وجّه المتصفح إلى المسار المحدد في
<path>
(يستخدم المثال التالي التوجيه 307 (إعادة توجيه مؤقت)).
- تأكد من تطابق مفتاح الاستيثاق، وأن معاملات
export default async (req, res) => {
// تأكد من تطابق مفتاح الاستيثاق والمعاملات
//يجب أن يُعرف فقط من قبل التطبيق ومنظومة إدارة المحتوى
if (req.query.secret !== 'MY_SECRET_TOKEN' || !req.query.slug) {
return res.status(401).json({ message: 'Invalid token' })
}
//`slug` تأكد من وجود معاملات
//منطق إحضارات البيانات من المنظومة getPostBySlug ستنجز الدالة
const post = await getPostBySlug(req.query.slug)
//موجودة `slug` لا تمكّن نمط الاستعراض ما لم تكن
if (!post) {
return res.status(401).json({ message: 'Invalid slug' })
}
// مكّن نمط الاستعراض من خلال ضبط ملفات تعريف الارتباط
res.setPreviewData({})
// أعد التوجيه إلى المسار الذي أُحضر
//لأن ذلك قد يسبب ضعفًا req.query.slug لا نعيد التوجيه إلى
res.redirect(post.slug)
}
إن نجح الأمر، سينتقل بك المتصفح إلى الوجهة التي تريد استعراضها بعد ضبط ملفات تعريف الارتباط التي تفعّل نمط الاستعراض.
الخطوة الثانية: حدّث قيم الخاصيات باستخدام getStaticProps
تقتضي الخطوة التالية تحديث getStaticProps
لدعم نمط الاستعراض. فإن طلبت صفحة تحتوي getStaticProps
وقد ضُبطت ملفات تعريف الارتباط فيها على وضع الاستعراض (من خلال res.setPreviewData
)، عندها تُستدعى الدالة getStaticProps
عند الطلب بدلًا من وقت البناء.
إضافة إلى ذلك، تُستدعى الدالة مع الكائن context
إذ:
- يحمل
context.preview
القيمةtrue
. context.previewData
هو نفسه الوسيط المستخدم فيsetPreviewData
.
export async function getStaticProps(context) {
// إن استدعيت الصفحة وقد ضُبطت ملفات تعريف الارتباط على نمط الاستعراض
//
// سيكون محققًا context.preview
// هو نفسه الوسيط المستخدم في context.previewData
// `setPreviewData`
}
لقد استخدمنا الدالة ({})res.setPreviewData
في مسار API الخاص بالاستعراض، لذا ستكون قيمة context.previewData
هي {}
. يمكن الاستفادة من ذلك في تمرير معلومات جلسة العمل من مسار API الخاص بالاستعراض إلى getStaticProps
عند الحاجة. وسيكون context.params
متاحًا إيضًا إن كنت تستخدم getStaticPaths
.
إحضار بيانات الاستعراض
يمكنك تحديث getStaticProps
لإحضار البيانات المختلفة وفقًا للخاصية context.preview
أو/و context.previewData
. فقد تمتلك منظومة إدارة المحتوى لديك على سبيل المثال وصلات API مختلفة لمسودات المنشورات، وبالتالي ستتمكن حينها من استخدام context.preview
لتعديل عنوان URL لوصلة API كما يلي:
export async function getStaticProps(context) {
// API إلى وصلة "/preview" محققًا اربط context.preview إن كان
// سيختلف طلب البيانات التجريبية (المسودة)
// عن بيانات النشر وفقًا لمنظومة إدارة المحتوى التي لا تحمل ترويسات
const res = await fetch(`https://.../${context.preview ? 'preview' : ''}`)
// ...
}
فإن ولجت الآن إلى مسار API باستخدام secret
و slug
من خلال منظومة إدارة محتوى دون ترويسات أو يدويًا، من المفترض أن ترى المحتوى الذي تنوي استعراضه. وإن حدَّثت مسودتك دون أن تنشرها، من المفترض أن تكون قادرًا على استعراضها أيضًا:
# للاستعراض URL يضبط ما يلي عنوان
# من خلال منظومة إدارة محتوى أو يدويًا وستكون قادرًا على استعراض المحتوى
https://<your-site>/api/preview?secret=<token>&slug=<path>
تفاصيل أكثر عن نمط الاستعراض في Next.js
إليك بعض التفاصيل الهامة التي تتعلق بنمط الاستعراض.
حذف ملفات تعريف ارتباط نمط الاستعراض
لا توجد مدة إنتهاء صلاحية محددة افتراضيًا لملفات تعريف الارتباط، وبالتالي ستنتهي جلسة الاستعراض مع إغلاق المتصفح.
لإزالة ملفات تعريف الارتباط لنمط الاستعراض يدويًا، أنشئ مسار API يستدعي الدالة ()clearPreviewData
:
// pages/api/clear-preview-mode-cookies.js
export default function handler(req, res) {
res.clearPreviewData()
}
أرسل بعد ذلك طلبًا إلى api/clear-preview-mode-cookies/
لتفعيل مسار API. وإن كنت تستدعي هذا المسار مستخدمًا المكوّن next/link
، فلا بد من تمرير prefetch={false}
لمنع استدعاء clearPreviewData
خلال الإحضار المسبق للرابط.
تحديد المدة الزمنية لنمط الاستعراض
تأخذ الدالة setPreviewData
معاملًا اختياريًا ثانيًا يُفترض أن يكون كائن خيارات. يقبل هذا الكائن المفاتيح التالية:
maxAge
: يحدد عدد الثواني التي ينبغي أن تدومها جلسة العمل.
setPreviewData(data, {
maxAge: 60 * 60, //تبقى ملفات تعريف الارتباط الخاصة بالاستعراض ساعة
})
حدود حجم بيانات الاستعراض previewData
بإمكانك تمرير كائن إلى الدالة setPreviewData
ومن ثم جعله متاحًا للاستخدام من قبل الدالة getStaticProps
. لكن ونظرًا لتخزين البيانات في ملفات تعريف الارتباط، فهنالك محدودية في حجم الكائن، وتحدد حاليًا بحوالي 2 كيلوبايت.
العمل مع الدالة getServerSideProps
يعمل نمط الاستعراض مع الدالة getServerSideProps
أيضًا، وسيكون متاحًا مع الكائن الذي يضم preview
و previewData
.
العمل مع مسارات API
يمكن لمسارات API الوصول إلى قيم preview
و previewData
ضمن الكائن الذي يُطلب. إليك مثالًا:
export default function myApiRoute(req, res) {
const isPreview = req.preview
const previewData = req.previewData
// ...
}
مفاتيح وملفات ارتباط خاصة لكل عملية بناء next build
تتغير قيم ملفات تعريف الارتباط التي تفرض حالة الاستعراض ومفتاح الاستيثاق لتشفير بيانات previewData
مع اكتمال كل عملية بناء next build
. يضمن ذلك عدم القدرة على تخمين قيم ملفات تعريف الارتباط.
ملاحظة: عليك أن تسمح باستخدام ملفات تعريف ارتباط مصدرها طرف آخر وإذنًا بالوصول إلى التخزين المحلي، لاختبار نمط الاستعراض محليًا ضمن متصفحك عبر طلبات HTTP.
اقرأ أيضًا
- إحضار البيانات في Next.js.
- مسارات API في Next.js.
- متغيرات البيئة في Next.js.
- الإدراج الديناميكي للوحدات البرمجية في Next.js.
المصادر
- الصفحة Preview Mode من توثيق Next.js الرسمي.