الفرق بين المراجعتين لصفحة: «Next.js/api data fetching»
أنشأ صفحة فارغة |
لا ملخص تعديل |
||
سطر 1: | سطر 1: | ||
= الواجهة البرمجية لإحضار البيانات في Next.js = | |||
نستعرض في هذه الصفحة من التوثيق الدوال التي تستخدمها Next.js في إحضار البيانات. | |||
== الدالة غير المتزامنة <code>getInitialProps</code> == | |||
'''نصيحة هامة''': يتيح لك استخدام إحدى الدالتين [[Next.js/data fetching#.D8.A7.D9.84.D8.AA.D9.88.D9.84.D9.8A.D8.AF%20.D8.A7.D9.84.D8.B3.D8.A7.D9.83.D9.86%20.D9.84.D9.84.D8.B5.D9.81.D8.AD.D8.A7.D8.AA%20.D9.81.D9.8A%20Next.js%20.D8.A8.D8.A7.D8.B3.D8.AA.D8.AE.D8.AF.D8.A7.D9.85%20.D8.A7.D9.84.D8.AF.D8.A7.D9.84.D8.A9%20getStaticProps|<code>getStaticProps</code>]] أو [[Next.js/data fetching#.D8.A7.D8.B3.D8.AA.D8.AE.D8.AF.D8.A7.D9.85%20.D8.A7.D9.84.D8.AF.D8.A7.D9.84.D8.A9%20getServerSideProps%20.D9.84.D8.A5.D8.AD.D8.B6.D8.A7.D8.B1%20.D8.A7.D9.84.D8.A8.D9.8A.D8.A7.D9.86.D8.A7.D8.AA%20.D8.B9.D9.86.D8.AF%20.D8.A7.D9.84.D8.B7.D9.84.D8.A8%20.D9.81.D9.8A%20Next.js|<code>getServerSideProps</code>]] بدلًا من <code>getInitialProps</code> في إحضار البيانات أسلوبًا يجمع بين التوليد الساكن والتصيير من جانب الخادم. | |||
تُمكّنك الدالة <code>getInitialProps</code> من تصيير المحتوى من جانب الخادم في [[Next.js/pages|الصفحة]]، وتسمح لك بنقل البيانات بشكل أولي، أي إرسال الصفحة بالبيانات التي أنتجها الخادم، وهذا مفيد خصوصًا في تحسين محركات البحث SEO. | |||
'''ملاحظة''': يُعطل استخدام الدالة <code>getInitialProps</code> [[Next.js/automatic static optimization|التحسين التلقائي الساكن]] | |||
تُعد الدالة <code>getInitialProps</code> دالة غير متزامنة <code>async</code> يمكن إضافتها إلى أي صفحة كتابع ساكن <code>[https://javascript.info/static-properties-methods static method]</code>. إليك مثالًا:<syntaxhighlight lang="javascript"> | |||
function Page({ stars }) { | |||
return <div>Next stars: {stars}</div> | |||
} | |||
Page.getInitialProps = async (ctx) => { | |||
const res = await fetch('https://api.github.com/repos/vercel/next.js') | |||
const json = await res.json() | |||
return { stars: json.stargazers_count } | |||
} | |||
export default Page | |||
</syntaxhighlight>أو باستخدام مكوّن صنف:<syntaxhighlight lang="javascript"> | |||
import React from 'react' | |||
class Page extends React.Component { | |||
static async getInitialProps(ctx) { | |||
const res = await fetch('https://api.github.com/repos/vercel/next.js') | |||
const json = await res.json() | |||
return { stars: json.stargazers_count } | |||
} | |||
render() { | |||
return <div>Next stars: {this.props.stars}</div> | |||
} | |||
} | |||
export default Page | |||
</syntaxhighlight>تُستخدم الدالة <code>getInitialProps</code> لإحضار بعض البيانات بشكل غير متزامن لتحلل بعدها البيانات الجاهزة المعادة <code>props</code> من الدالة أثناء التصيير في الواجهة الخلفية بشكل مشابه لما يفعله التابع <code>[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify JSON.stringify]</code>. تأكد أن الكائن الذي تعيده الدالة <code>getInitialProps</code> هو كائن بسيط لا يحتوي على الخاصيات <code>Date</code> أو <code>Map</code> أو <code>Set</code>. | |||
تنفذ الدالة <code>getInitialProps</code> على الخادم فقط لتحميل الصفحة مبدئيًا، ثم تنفذ في الواجهة الأمامية عند الانتقال إلى وجهة أخرى باستخدام المكون [[Next.js/next link|<code>next/link</code>]] أو المكون [[Next.js/next router|<code>next/router</code>]]. لكن إن استخدمت الدالة <code>getInitialProps</code> تطبيقًا مخصصًا <code>app.js_</code> وتضمنت الصفحة التي سننتقل إليها الدالة <code>getServerSideProps</code> عندها لن تعمل الدالة <code>getInitialProps</code> على الخادم. | |||
=== الكائن <code>context</code> === | |||
تتلقى الدالة <code>getInitialProps</code> وسيطًا واحدًا يدعى <code>context</code>، وهو كائن يمتلك الخاصيات التالية: | |||
* <code>pathname</code>: الوجهة الحالية، وهي مسار الصفحة ضمن المجلد <code>pages/</code>. | |||
* <code>query</code>: قسم الاستعلام النصي من عنوان URL والمُحلَّل ككائن. | |||
* <code>asPath</code>: من النوع <code>String</code>، يمثل المسار الفعلي (بما في ذلك الاستعلام) الظاهر في شريط عنوان المتصفح. | |||
* <code>req</code>: [[Node.js/http|كائن طلب HTTP]] (خادم فقط). | |||
* <code>res</code>: [[Node.js/http|كائن طلب استجابة HTTP]] (خادم فقط). | |||
* <code>err</code>: كائن خطأ وينتج عن أي خطا يحدث أثناء التصيير. | |||
=== التحفظات على استخدام الدالة في === | |||
* لا يمكن استخدام الدالة <code>getInitialProps</code> داخل المكوّنات الأبناء، بل فقط عند التصدير الافتراضي لكل صفحة. | |||
* إن كنت تستخدم وحدات الواجهة الخلفية فقط داخل الدالة <code>getInitialProps</code>، فتأكد من إدراجها بشكل صحيح وإلا ستبطئ تطبيقك. | |||
<blockquote>ملاحظة: بغض النظر عن نوع التصيير ستُمرر أية خاصية <code>props</code> إلى مكون الصفحة وتُستعرض في الواجهة الأمامية كجزء من صفحة HTML المبدئية. إن الغاية من ذلك هو السماح [[React/react dom#hydrate.28.29|بترطيب الصفحة]] hydrate بالشكل الصحيح. تأكد من عدم تمرير أية معلومات حساسة لا ينبغي عرضها في الواجهة الأمامية من خلال الخاصيات <code>props</code>.</blockquote> | |||
=== استخدام الدالة مع TypeScript === | |||
إن كنت تستخدم TypeScript، بإمكانك استخدام النوع <code>NextPage</code> من أجل مكونات الدوال: <syntaxhighlight lang="javascript"> | |||
import { NextPage } from 'next' | |||
interface Props { | |||
userAgent?: string; | |||
} | |||
const Page: NextPage<Props> = ({ userAgent }) => ( | |||
<main>Your user agent: {userAgent}</main> | |||
) | |||
Page.getInitialProps = async ({ req }) => { | |||
const userAgent = req ? req.headers['user-agent'] : navigator.userAgent | |||
return { userAgent } | |||
} | |||
export default Page | |||
</syntaxhighlight>ويمكنك استخدام <code>NextPageContext</code> من أجل <code>React.Component</code> :<syntaxhighlight lang="javascript"> | |||
import React from 'react' | |||
import { NextPageContext } from 'next' | |||
interface Props { | |||
userAgent?: string; | |||
} | |||
export default class Page extends React.Component<Props> { | |||
static async getInitialProps({ req }: NextPageContext) { | |||
const userAgent = req ? req.headers['user-agent'] : navigator.userAgent | |||
return { userAgent } | |||
} | |||
render() { | |||
const { userAgent } = this.props | |||
return <main>Your user agent: {userAgent}</main> | |||
} | |||
} | |||
</syntaxhighlight> | |||
== المصادر == | |||
* الصفحات [https://nextjs.org/docs/api-reference/data-fetching/get-initial-props Data fetching] من توثيق Next.js الرسمي. |
مراجعة 16:09، 10 يوليو 2022
الواجهة البرمجية لإحضار البيانات في Next.js
نستعرض في هذه الصفحة من التوثيق الدوال التي تستخدمها Next.js في إحضار البيانات.
الدالة غير المتزامنة getInitialProps
نصيحة هامة: يتيح لك استخدام إحدى الدالتين getStaticProps
أو getServerSideProps
بدلًا من getInitialProps
في إحضار البيانات أسلوبًا يجمع بين التوليد الساكن والتصيير من جانب الخادم.
تُمكّنك الدالة getInitialProps
من تصيير المحتوى من جانب الخادم في الصفحة، وتسمح لك بنقل البيانات بشكل أولي، أي إرسال الصفحة بالبيانات التي أنتجها الخادم، وهذا مفيد خصوصًا في تحسين محركات البحث SEO.
ملاحظة: يُعطل استخدام الدالة getInitialProps
التحسين التلقائي الساكن
تُعد الدالة getInitialProps
دالة غير متزامنة async
يمكن إضافتها إلى أي صفحة كتابع ساكن static method
. إليك مثالًا:
function Page({ stars }) {
return <div>Next stars: {stars}</div>
}
Page.getInitialProps = async (ctx) => {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const json = await res.json()
return { stars: json.stargazers_count }
}
export default Page
أو باستخدام مكوّن صنف:
import React from 'react'
class Page extends React.Component {
static async getInitialProps(ctx) {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const json = await res.json()
return { stars: json.stargazers_count }
}
render() {
return <div>Next stars: {this.props.stars}</div>
}
}
export default Page
تُستخدم الدالة getInitialProps
لإحضار بعض البيانات بشكل غير متزامن لتحلل بعدها البيانات الجاهزة المعادة props
من الدالة أثناء التصيير في الواجهة الخلفية بشكل مشابه لما يفعله التابع JSON.stringify
. تأكد أن الكائن الذي تعيده الدالة getInitialProps
هو كائن بسيط لا يحتوي على الخاصيات Date
أو Map
أو Set
.
تنفذ الدالة getInitialProps
على الخادم فقط لتحميل الصفحة مبدئيًا، ثم تنفذ في الواجهة الأمامية عند الانتقال إلى وجهة أخرى باستخدام المكون next/link
أو المكون next/router
. لكن إن استخدمت الدالة getInitialProps
تطبيقًا مخصصًا app.js_
وتضمنت الصفحة التي سننتقل إليها الدالة getServerSideProps
عندها لن تعمل الدالة getInitialProps
على الخادم.
الكائن context
تتلقى الدالة getInitialProps
وسيطًا واحدًا يدعى context
، وهو كائن يمتلك الخاصيات التالية:
pathname
: الوجهة الحالية، وهي مسار الصفحة ضمن المجلدpages/
.query
: قسم الاستعلام النصي من عنوان URL والمُحلَّل ككائن.asPath
: من النوعString
، يمثل المسار الفعلي (بما في ذلك الاستعلام) الظاهر في شريط عنوان المتصفح.req
: كائن طلب HTTP (خادم فقط).res
: كائن طلب استجابة HTTP (خادم فقط).err
: كائن خطأ وينتج عن أي خطا يحدث أثناء التصيير.
التحفظات على استخدام الدالة في
- لا يمكن استخدام الدالة
getInitialProps
داخل المكوّنات الأبناء، بل فقط عند التصدير الافتراضي لكل صفحة. - إن كنت تستخدم وحدات الواجهة الخلفية فقط داخل الدالة
getInitialProps
، فتأكد من إدراجها بشكل صحيح وإلا ستبطئ تطبيقك.
ملاحظة: بغض النظر عن نوع التصيير ستُمرر أية خاصية
props
إلى مكون الصفحة وتُستعرض في الواجهة الأمامية كجزء من صفحة HTML المبدئية. إن الغاية من ذلك هو السماح بترطيب الصفحة hydrate بالشكل الصحيح. تأكد من عدم تمرير أية معلومات حساسة لا ينبغي عرضها في الواجهة الأمامية من خلال الخاصياتprops
.
استخدام الدالة مع TypeScript
إن كنت تستخدم TypeScript، بإمكانك استخدام النوع NextPage
من أجل مكونات الدوال:
import { NextPage } from 'next'
interface Props {
userAgent?: string;
}
const Page: NextPage<Props> = ({ userAgent }) => (
<main>Your user agent: {userAgent}</main>
)
Page.getInitialProps = async ({ req }) => {
const userAgent = req ? req.headers['user-agent'] : navigator.userAgent
return { userAgent }
}
export default Page
ويمكنك استخدام NextPageContext
من أجل React.Component
:
import React from 'react'
import { NextPageContext } from 'next'
interface Props {
userAgent?: string;
}
export default class Page extends React.Component<Props> {
static async getInitialProps({ req }: NextPageContext) {
const userAgent = req ? req.headers['user-agent'] : navigator.userAgent
return { userAgent }
}
render() {
const { userAgent } = this.props
return <main>Your user agent: {userAgent}</main>
}
}
المصادر
- الصفحات Data fetching من توثيق Next.js الرسمي.