هنگامی که در حال ساخت یک برنامه کاربردی که توسط Next.js پشتیبانی میشود هستیم احتمالاً باید دادهها را از یک فایل، یک مسیر API داخلی یا یک API خارجی fetch کنیم.علاوه بر این، تعیین بهترین روش برای data fetching در برنامه Next.js خود میتواند کمی گیج کننده باشد. مخصوصا که ایجاد درخواست API در داخل تابع رندر کامپوننتهای ما انجام نمیشود.
در این مقاله قصد داریم تا متدهای fetch کردن دادههای سمت سرور را باهم بررسی کنیم تا بتوانیم مناسبترین متد برای برنامه خود را انتخاب کنیم. برای هر متد یک مثال، مزایای آن متد و کاربردی که دارند را مورد بررسی قرار دادهایم. این امکان وجود دارد که در یک برنامه از چندین متد استفاده کنیم.
متدهای زیر دادهها را در زمان ساخت یا در هر درخواست قبل از ارسال داده به کلاینت fetch میکنند.
Fetch کردن دادهها در زمان ساخت.
متد getStaticProps
را میتوانیم در داخل یک صفحه برای fetch کردن دادهها در زمان ساخت استفاده کنیم، مثلا زمانی که دستورnext build
را اجرا میکنیم. این متد دادهها را از زمانی که برنامه ساخته میشود، تا زمانی که درخواست دیگری اجرا نشود بهروزرسانی نمیکند. به عنوان مثال:
export async function getStaticProps(context) { const res = await fetch(`https://.../data`) const data = await res.json() if (!data) { return { notFound: true, } } return { props: {}, // will be passed to the page component as props } }
getStaticProps
(یا سایر متدهای data fetching در سمت سرور) استفاده نکند، Next.js میتواند آن را با استفاده از next export به HTML ایستا export کند. اگر بخواهیم یک سایت استاتیک ایجاد کنیم که بتواند در مکانهایی مانند صفحات GitHub میزبانی شود، این کار بسیار سودمند است.تصور کنید یک وبلاگ شخصی داریم که صفحات را از فایلهای MD(Markdown) در زمان ساخت رندر میکند. getStaticProps
میتواند فایلها را بخواند و دادهها را در زمان ساخت به کامپوننت صفحه منتقل کند. وقتی در یک قسمت وبلاگ تغییر ایجاد میکنیم، سایت را rebuild میکنیم تا بتوانیم تغییرات را ببینیم.
Fetch کردن دادهها در هر درخواست.
متد getServerSideProps
هر بار که کاربر صفحه را درخواست میکند، دادهها را fetch میکند. این متد برخلاف لود صفحه و fetch دادهها در سمت کلاینت، دادهها را قبل از ارسال صفحه به کلاینت fetch میکند. اگر کلاینت درخواست بعدی را ارائه دهد، دادهها دوباره fetch میشوند.
به عنوان مثال:
export async function getServerSideProps(context) { const res = await fetch(`https://...`) const data = await res.json() if (!data) { return { notFound: true, } } return { props: {}, // will be passed to the page component as props } }
getServerSideProps
برای ساختن برنامهای مناسب است که کلاینت را ملزم میکند تا بهروزترین اطلاعات را ببیند، اما زمانی که کلاینت در صفحه است، بهروزرسانی انجام نمیشود. برای مثال، اگر صفحهای در سایت شخصی خود داریم که آخرین اطلاعات مربوط ما در GitHub commit را نشان میدهد. در این صورت میخواهیم هر بار که صفحه مشاهده میشود این دادهها fetch شوند.
Fetch کردن دادهها در هر درخواست.
متد getInitialProps
در گذشته راه اصلی برای data fetching در برنامه Next.js در سمت سرور بود. اما از نسخه Next.js 9.3 به بعد روشهایی که در قسمتهای قبلی درمورد آنها صحبت کردیم جایگزین این متد شدند. اما ما آن را در این مقاله بررسی کردهایم زیرا:
getStaticProps
و getServerSideProps
را بهکار بگیریم. زیرا این دو متد به ما این امکان را میدهند تا از بین fetch دادههای ایستا یا سمت سرور یکی را انتخاب کنیم.getInitialProps
میتواند مفید باشد. مثلا زمانی که برای حل یک مشکل در اینترنت سرچ میکنیم و ممکن است با راهحلی روبهرو شویم که از این متد استفاده کرده است. در این صورت درک آن راهحل سادهتر خواهد بود.به عنوان مثال:
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
getServerSideProps
برای ساختن برنامهای مناسب است که کلاینت را ملزم میکند تا بهروزترین اطلاعات را ببیند، اما زمانی که کلاینت در صفحه است، بهروزرسانی انجام نمیشود.
وقتی از Next.js استفاده میکنیم هدف ما همیشه این است که هر صفحه را استاتیک کنیم. این بدان معنی است که ما سعی میکنیم تا از استفاده از getServerSideProps
اجتناب کرده و بیشتر getStaticProps
را به کار بگیریم. با این حال، اگر دادههایی که fetch میکنیم اغلب در حال تغییر و بهروزرسانی هستند، مطمئناً از getServerSideProps
استفاده خواهیم کرد. اما بهتر است هرگز سمت متدgetInitialProps
نرویم.
بنابراین ما به طور معمول از متد getStaticProps
استفاده میکنیم و اگر این متد باعث قدیمی شدن دادهها میشود، متدgetServerSideProps
را جایگزین میکنیم.
در این مقاله سه متد Next.js برای data fetching در زمان ایجاد درخواست یا قبل از درخواست کلاینت را باهم بررسی کردیم.
۵۰ درصد تخفیف ویژه زمستان فرانت کست تا ۱۴ دی
کد تخفیف: wnt