ابـراهــیم
ابـراهــیم
خواندن ۳ دقیقه·۲ سال پیش

12) نحوه استفاده از SSG در Nextjs

نحوه استفاده از SSG در Nextjs
نحوه استفاده از SSG در Nextjs


در این قسمت قراره در مورد نحوه استفاده از SSG صحبت کنیم و به صورت عملی در پروژه مون اجراش کنیم. ما می تونیم از SSG به دو صورت به همراه داده یا بدون داده استفاده کنیم:

بدون داده

به صورت پیش فرض Nextjs با استفاده از SSG بدون داده صفحات رو رندر میکنه. تا الان تمام صفحاتی که ایجاد کردیم، نیاز به واکشی داده نداشتن. مثلا posts.js نیاز به هیچ گونه واکشی داده (فعلا) نداره:

برای موارد شبیه به این، Nextjs فقط یک صفحه html تولید میکنه


به همراه داده

بعضی صفحات ممکنه نیاز به دسترسی به فایل های سیستم یا گرفتن داده ها از back-end در زمان build time داشته باشن. در این مواقع، دو حالت پیش میاد:

1. محتوای صفحه شما از داده های خارجی تامین میشه: از ()getStaticProps استفاده کنید

2. مسیر (لینک) های صفحه شما به داده های خارجی بستگی داره: از ()getStaticPaths استفاده کنید. معمولا نیازه که از ()getStaticProps هم به همراهش استفاده بشه (این حالت رو در قسمت Dynamic Routes توضیح میدم)


تابع ()getStaticProps

این تابع در build time فراخوانی میشه و این امکان رو میده که داده‌های واکشی شده رو موقع pre-render درون صفحه استفاده کنید. وقتی این تابع رو درون صفحه ای فراخوانی می کنید، اساسا به Nextjs گفتید: " این صفحه وابستگی‌ به داده های خارجی داره. وقتی این صفحه رو Pre-render میکنی، قبلش مطمئن شو که داده های خارجی رو دریافت کردی..."


از اونجایی که این تابع فقط در زمان build time اجرا میشه، نمی توانید از query param ها و درخواست های http درون این تابع استفاده کنید. در ضمن، مواظب باشید که اطلاعات حساس رو به props پاس ندید.


بیاید حالت اول رو با استفاده از این تابع انجام بدیم. images.js رو به این صورت ویرایش کنید:

اسم تابع رو برای قابل فهم تر شدن به ImagesPage تغییر دادم (شما می تونید تغییرش ندید)
اسم تابع رو برای قابل فهم تر شدن به ImagesPage تغییر دادم (شما می تونید تغییرش ندید)


ما تمام تصاویر موجود در مسیر public/images رو درون صفحه images نمایش دادیم.


در اینجا برای اینکه تصاویر رو نمایش بدیم، چهار بار از </ Images > استفاده کردیم که باعث ایجاد hard code شدیم. فعلا مشکلی وجود نداره اما اگه تعداد تصاویر دو رقمی بشه این کار اصلا بهینه نیست. می تونیم این کار رو با استفاده از ()getStaticProps به صورت ساده تر انجام بدیم. برای استفاده از این تابع images.js رو به این صورت ویرایش کنید:


در اینجا ما با استفاده از ماژول های fs و path درون ()getStaticProps نام تصاویر رو درون متغیر images به صورت آرایه ذخیره کردیم و اون درون خصوصیت props پاس دادیم. بعد با استفاده از destructuring این آرایه رو به صورت props درون کامپوننت ImagesPage دریافت کردیم. درنهایت با استفاده از حلقه map تصاویر رو درون صفحه نمایش دادیم. خروجی باید به این صورت باشه:


برای بهتر شدن ظاهر خروجی، از css modules استفاده کردیم.
برای بهتر شدن ظاهر خروجی، از css modules استفاده کردیم.


حالا فرقی نمی کنه که تعداد تصاویر در مسیر public/images چقدر باشه (همشون نمایش داده میشه).


نکته مهم

درون ()getStaticProps متغیر images رو log بگیرید:


اگه به کنسول مرورگر نگاه کنید، آرایه images نمایش داده نشده. در عوض درون ترمینال نمایش داده شده:


دلیلش اینه که توابع و دستورات Nextjs در backend اجرا میشه.


اگه متغیر images رو در تابع ImagesPage لاگ بگیرید، خروجی درون مرورگر نمایش داده میشه:


منابع

pages

Static Generation with and without Data

nextjsssg
ساده بگیر ولی دستِ کم نگیر
شاید از این پست‌ها خوشتان بیاید