این هفته، اولین نسخه بتا از Astro 5 را منتشر کردیم که یک روش کاملاً جدید برای مدیریت محتوا ارائه میدهد. این مقاله به بررسی عمیق Content Layer API میپردازد و نشان میدهد چگونه میتوانید از آن برای ساخت وبسایتهای خود استفاده کنید.
Astro همواره با هدف ایجاد وبسایتهای مبتنی بر محتوا متولد شده است. در حالی که اکنون میتواند برای ساخت انواع برنامههای پویا نیز مورد استفاده قرار گیرد، همچنان بهترین گزینه برای وبسایتهایی است که حول محور محتوا ساخته میشوند. از سایتهای مستندسازی کامل مانند Cloudflare و StackBlitz گرفته تا برندهای معتبری مثل Porsche و Netlify، میلیونها کاربر روزانه به سرعت و دسترسی بالای وبسایتهایی که با Astro ساخته شدهاند، پی میبرند.
در Astro 2، ما Collections محتوا را معرفی کردیم – یک روش قدرتمند برای سازماندهی محتوای محلی شما با امنیت تایپ و مقیاسپذیری تا هزاران صفحه. Collections محتوا تجربه توسعهدهنده درجه یک را برای فایلهای محلی مانند Markdown و MDX فراهم میکند، اما دریافتهایی وجود داشت مبنی بر اینکه کاربران میخواهند این مزایا برای تمام منابع دادهی آنها نیز اعمال شود. همچنین مشخص شد که در حالی که بسیاری از افراد وبسایتها با هزاران صفحه ایجاد میکنند، API Collections محتوا ما در مقیاس ده هزار صفحه دچار مشکلاتی مانند کندی و مصرف بیش از حد حافظه میشود.
در ماه ژوئن، ما یک پیشنمونه اولیه را برای برنامههای خود برای حل این مشکلات و بیشتر با استفاده از یک نوع جدید از Collections محتوا پشتیبانی شده توسط Content Layer API به اشتراک گذاشتیم که انعطافپذیری مورد نیاز شما را فراهم میکند. تصور ما این بود که Collections را فراتر از src/content ببریم و به شما امکان بارگیری محتوای خود از هر منبعی را بدهیم. ما در حال آزمایش با مجموعههایی هستیم که مقیاس بیسابقهای دارند.
Content Layer API آیندهی Collections محتوا است. این API به شما اجازه میدهد دادهها را از هر منبعی هنگام ساخت وبسایت خود بارگیری کنید و سپس با استفاده از یک API ساده و ایمن در صفحات خود به آن دسترسی پیدا کنید.
Content Layer API اهمیتی نمیدهد که اطلاعات شما کجا ذخیره شده است. یک Collection هنوز میتواند فایلهای Markdown محلی باشد، دیگری میتواند یک API را فراخوانی کند، و دیگری نیز ممکن است در جای دیگری از سیستمفایل شما وجود داشته باشد. با استفاده از توابع آشنا getEntry() و getCollection() میتوانید دادهها را از منابع مختلف در همان صفحه بارگیری کنید. هیچ هزینه عملکردی نیز وجود ندارد: Astro به صورت محلی بین ساختها دادهها را کش میکند، به این معنی که بهروزرسانیها میتوانند سریع باشند و تعداد تماسهایی که باید با API انجام شود را کاهش دهند. و البته، همه چیز همچنان دارای نوعبندی است، با تولید خودکار انواع TypeScript از schema شما.
اگر قبلاً از Collections محتوا استفاده کرده باشید، بسیاری از مفاهیم و اصطلاحات زیر را به خوبی میشناسید! در واقع ما تغییر چندانی در نحوه کار با collections در پروژه شما ایجاد نکردهایم!
یک collection هنوز هم نامی است که برای مجموعه ای از entries که یک schema مشترک دارند، استفاده میشود. هر entry دارای شناسه منحصربهفرد است. این مفهوم شبیه به جدولی در یک پایگاه داده رابطهای است.
اما اکنون، هر collection از یک loader استفاده میکند که نحوه بارگیری entries را برای پر کردن آن مجموعه تعریف میکند. Loader میتواند یک تابع درونخطی ساده باشد که آرایهای از entries را برمیگرداند یا میتواند یک شیء پیشرفتهتر باشد که مدیریت حافظه پنهان و ذخیره دادههای خود را انجام میدهد. اولین loaderها در حال حاضر به عنوان ماژولهایی روی npm توزیع شدهاند.
هر زمان که وبسایت شما ساخته میشود، loader مربوط به هر collection فراخوانی میشود و سپس data store محلی را بهروزرسانی میکند. این data store بین ساختها حفظ میشود.
قطعات (components) و صفحات Astro میتوانند از getCollection یا getEntry برای پرسوجو داده استفاده کنند. در آن لحظه، دادهها immutable هستند؛ بنابراین صفحهها همگی یک snapshot را که در زمان ساخت کامپایل شده است، query میکنند. این موضوع چه هنگام prerender کردن صفحه در زمان ساخت یا server rendering on-demand اعمال میشود.
نکته مهم این است که data store فقط در زمان ساخت بهروزرسانی میشود: وبسایت مستقر نمیتواند data store را تغییر دهد. اگر یک منبع داده نیاز به بهروزرسانی collection داشته باشد، باید با ایجاد build جدید انجام شود.
اولین نمونه نشان داد چگونه میتوانید یک loader درونخطی ساده بسازید، اما این تنها محدودیت شما نیست. با استفاده از API Loader شیء محور، میتوانید Loaderهای قدرتمندتری با قابلیتهای پیشرفتهتر ساختید. Loader شیء محور با Data Store object در تعامل است که یک Key-Value store با محدوده collection خاص است.
📌 توجه: این مطلب از منابع بینالمللی ترجمه و بازنویسی شده است.