الفرق بين المراجعتين ل"Next.js/pages"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
سطر 61: سطر 61:
 
export default Blog
 
export default Blog
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
تسمح لك Next.js أن تصدّر دالة غير متزامنة تُدعى <code>getStaticProps</code> من الملف ذاته إن أردت إحضار تلك البيانات في مرحلة التصيير الأولي. تُستدعى هذ الدالة أثناء بناء التطبيق وتسمح لك بتمرير البيانات المُحضرة إل خاصيات الصفحة <code>props</code> في مرحلة التصيير الأولي.<syntaxhighlight>
 +
function Blog({ posts }) {
 +
  //posts يُصيّر ...
 +
}
 +
 +
// تُستدعى هذه الدالة أثناء بناء التطبيق
 +
export async function getStaticProps() {
 +
  //خارجية API تستدعى وصلة
 +
  const res = await fetch('https://.../posts')
 +
  const posts = await res.json()
 +
  // المنشورات كخاصيات أثناء بناء التطبيقBlog يتلقى المكوّن
 +
  //{ props: { posts } }بإعادة
 +
  return {
 +
    props: {
 +
      posts,
 +
    },
 +
  }
 +
}
 +
 +
export default Blog
 +
</syntaxhighlight>راجع  [[Next.js/data fetching|توثيق إحضار البيانات]] لتطلع أكثر على عمل الدالة <code>getStaticProps</code>.
 +
 +
==== السناريو الثاني: اعتماد مسارات الصفحة على بيانات خارجية ====
 +
تتيح لك Next.js أن تنشئ صفحات تعتمد المسارت الديناميكية. إذ تستطيع مثلًا إنشاء ملف يُدعى  <code>pages/posts/[id].js</code> لاستعراض منشور مفرد من مدونة وفقًا للمعرِّف الفريد الخاص به <code>id</code>، وسيعرض لك المسار <code>posts/1</code> مثلًا المنشور ذو المعرّف <code>id: 1</code>.
 +
 
[[تصنيف:Next.js]]
 
[[تصنيف:Next.js]]

مراجعة 05:00، 6 مايو 2022

الصفحات في Next.js

الصفحة هي مكوّن رياكت مصدر عن ملفات موجودة في المجلد pages وتمتلك إحدى الامتدادات التالية: js. أو jsx. أو ts. أو tsx.. تقترن كل صفحة بمسار يتعلق باسم الملف، فلو أنشأت على سبيل المثال الملف pages/about.js الذي يصّدر مكوّن رياكت التالي، ستتمكن من الوصول إليه من خلال العنوان /about.

function About() {
  return <div>About</div>
}

export default About

صفحات بمسارات ديناميكية: تدعم المسارات الديناميكية للصفحات. فإن انشأت الملف pages/posts/[id].js مثلًا ، أمكنك الوصول إليه بكتابة العنوان posts/1 أو posts/2 وهكذا.

التصيير الأولي للصفحات

تصيّر Next.js الصفحات بشكل أولّي pre-render، ويعني ذلك توليد شيفرة HTML لكل صفحة مسبقًا بدلًا من إلقاء الحمل كاملًا على محّرك جافا سكربت الذي يعمل من طرف العميل. وقد يُحسّن هذا الأمر الأداء، كما يُحسن ترتيب ظهور الصفحة في محرّكات البحث SEO (سيو أفضل).

تُزوَّد شيفرة HTML المولَّدة لكل صفحة بحد أدنى من شيفرة جافا سكربت الضرورية لعملها. وعندما يُحمّل المتصفح الصفحة، ستُنفَّذ شيفرة جافا سكربت لتمنح الصفحة تفاعلية أكبر (تُدعى هذه العملية بالترطيب hydration).

نمطي التصيير الأولي

للتصيير الأولي في Next.js نمطين هما: التوليد الساكن Static Generation والتصيير من جانب الخادم Server-side Rendering ويقتصر الفارق بينهما على اللحظة التي توّّلد فيها شيفرة HTML.

  • التوليد الساكن (مُستحسن): توّلد شيفرة HTML وفق هذا النمط أثناء بناء الصفحة ويُعاد استخدامها عند كل طلب.
  • التصيير من جانب الخادم: توّلد شيفرة HTML عند كل طلب.

تمنحك Next.js القدرة على اختيار نمط التصيير الأولي لكل صفحة ،و بالتالي ستتمكن من بناء تطبيقات هجينة عندما تستخدم التوليد الساكن لمعظم صفحاته وتجعل تصيير بعضها الآخر من جانب الخادم.

ننصح باستخدام التوليد الساكن للشيفرة مقابل التصيير من جانب الخادم لأسباب تتعلق بالأداء. إذ يمكن أن تخزّن الصفحات الموّلدة بالنمط الساكن في شبكات توزيع المحتوى CDN دون أي إعدادات إضافية مما يعزز الأداء. لكن قد تجد أن التصيير من جانب الخادم هو الخيار الوحيد في بعض الحالات.

بالإمكان أيضًا استخدام التصيير من جانب العميل Client-side Rendering جتبًا إلى جنب مع التوليد الساكن أو التصيير من جانب الخادم، أي أنه بالإمكان تصيير جزء من الصفحة كليًا بواسطة جافا سكربت منفَّذة من ناحية العميل. لمزيد من المعلومات راجع توثيق إحضار البيانات.

التوليد الساكن للشيفرة في Next.js

توّلد شيفرة HTML عند استخدام نمط التوليد الساكن أثناء بناء التطبيق. ويعني ذلك من منظور مرحلة الإنتاج أن توليد HTML يجري عند تنفيذ الأمر next build. تُستخدم بعد ذلك هذه الشيفرة مع كل طلب، ويمكن تخزينها مؤقتًا ضمن شبكة توصيل المحتوى.

بالإمكان توليد صفحات تحوي بيانات في Next.js أو لا تحتوي بيانات، لنلق نظرة على ذلك.

التوليد الساكن لصفحات بلا بيانات في Next.js

تصيّر Next.js الصفحات بشكل أولي وفق نمط التوليد الساكن افتراضيًا، وإليك مثالًا:

function About() {
  return <div>About</div>
}

export default About

التوليد الساكن لصفحات تحتوي بيانات في Next.js

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

  1. getStaticProps: وتُسخدم عندما يعتمد محتوى صفحتك على بيانات خارجية.
  2. getStaticPaths: وتُستخدم عندما تعتمد المسارات في الصفحة على بيانات خارجية، وعادة ما تُستخدم إلى جانب الدالة getStaticProps.

السيناريو الأول: اعتماد الصفحة على بيانات خارجية

وكمثال على ذلك مدوّنة قد تحتاج إلى إحضار قائمة بالمنشورات من نظام إدارة المحتوى content management system:

// TODO: Need to fetch `posts` (by calling some API endpoint)
//       before this page can be pre-rendered.
function Blog({ posts }) {
  return (
    <ul>
      {posts.map((post) => (
        <li>{post.title}</li>
      ))}
    </ul>
  )
}

export default Blog

تسمح لك Next.js أن تصدّر دالة غير متزامنة تُدعى getStaticProps من الملف ذاته إن أردت إحضار تلك البيانات في مرحلة التصيير الأولي. تُستدعى هذ الدالة أثناء بناء التطبيق وتسمح لك بتمرير البيانات المُحضرة إل خاصيات الصفحة props في مرحلة التصيير الأولي.

function Blog({ posts }) {
  //posts يُصيّر ...
}

// تُستدعى هذه الدالة أثناء بناء التطبيق
export async function getStaticProps() {
  //خارجية API تستدعى وصلة 
  const res = await fetch('https://.../posts')
  const posts = await res.json()
  // المنشورات كخاصيات أثناء بناء التطبيقBlog يتلقى المكوّن 
  //{ props: { posts } }بإعادة
  return {
    props: {
      posts,
    },
  }
}

export default Blog

راجع توثيق إحضار البيانات لتطلع أكثر على عمل الدالة getStaticProps.

السناريو الثاني: اعتماد مسارات الصفحة على بيانات خارجية

تتيح لك Next.js أن تنشئ صفحات تعتمد المسارت الديناميكية. إذ تستطيع مثلًا إنشاء ملف يُدعى pages/posts/[id].js لاستعراض منشور مفرد من مدونة وفقًا للمعرِّف الفريد الخاص به id، وسيعرض لك المسار posts/1 مثلًا المنشور ذو المعرّف id: 1.