سیستم BlockRenderer، ساخت استایل جدید و لود اتوماتیک
هسته اصلی پلتفرم Loomix، سیستم نگاشت داینامیک کامپوننتها یا BlockRenderer است. این کامپوننت ورودیهای حاصل از Strapi Dynamic Zone را دریافت کرده و بر اساس کلید __component و پارامتر style، کامپوننت React متناظر را رندر میکند.
مزیت معماری ماژولار و لود اتوماتیک
۱. راهنمای ساخت استایل جدید برای هر بلاک (New Style Variant)
برای اضافه کردن یک دیزاین یا استایل جدید به بلاک موجود (مثلاً افزودن style-3 به بلاک ProductShowcase):
- به پوشه استایلهای همان کامپوننت بروید (مثلاً
src/modules/home/components/ProductShowcase/styles/). - یک فایل جدید با نام
style-3.tsxبسازید و دیزاین اختصاصی جدید خود را کدنویسی کنید. - کامپوننت والد بر اساس فیلد
block.styleبهطور اتوماتیک استایل جدید را لود و رندر میکند! - در پنل Strapi، فیلدهای استایل از نوع متنی (Text) هستند و نیازی به تعریف یا افزودن دستی گزینهها نیست؛ ادمین به سادگی نام
style-3را مستقیماً در فیلد style وارد میکند. - دیزاین پویا و اختصاصی: کدهای رابط کاربری (UI) منحصربهفرد این استایل درون تگ
sectionقرار میگیرند.
import React from "react"import { ProductShowcaseProps } from "../types" export default function ProductShowcaseStyle3({ block, products }: ProductShowcaseProps) { return ( <section className="py-12 bg-gradient-to-r from-gray-900 to-black text-gray-900 dark:text-white"> <h2 className="text-xl font-bold mb-6">{block.title}</h2> </section> )}۲. افزودن و همگامسازی استایلها از داشبورد Strapi
تمامی فرایندهای افزودن، بهروزرسانی و حذف استایلها مستقیماً از طریق داشبورد Storefront Management در پنل ادمین Strapi انجام میشود و نیازی به هیچ اسکریپت دستی یا ترمینال نیست:
- ۱. در پنل ادمین Strapi، از منوی سمت چپ وارد Storefront Management شوید.
- ۲. گروه کامپوننت مورد نظر (مانند
FeaturesBlock) را از منوی کشویی انتخاب کنید. - ۳. در بخش Styles Inspector، پیشنمایش تصویری استایلهای نصبشده و استایلهای موجود در رجیستری را مشاهده نمایید.
- ۴. برای افزودن استایل دلخواه روی + Add to Storefront (Queue) و برای حذف روی Remove Style (Queue) کلیک کنید تا تغییرات در صف قرار گیرند.
- ۵. روی دکمه Update Storefront کلیک کنید.
- ۶. استراپی به صورت خودکار جدیدترین تنظیمات صفحات و تم را در گیت ذخیره کرده، ورکفلو GitHub Actions را فراخوانی میکند و کانتینر استورفرانت را روی سرور دیپلوی مینماید!
⭐ همگامسازی خودکار تنظیمات ظاهری (Settings Preset)
با کلیک روی دکمه Update Storefront، استراپی به صورت کاملاً خودکار تمام تنظیمات فعال (چیدمان صفحات، هدر، فوتر، کارتهای محصولات، پالت رنگ تم و استایل دکمهها) را در فایل store/src/lib/config/storefront-settings.json ذخیره و در گیت کامیت میزند. سپس بیلد را آغاز میکند؛ بنابراین در لود اول صفحه بلافاصله پس از دیپلوی، تنظیمات دقیقاً با استراپی مطابقت داشته و بدون هیچگونه پرش لایهبندی لود میشوند.
داشبورد Strapi وضعیت بیلد را با یک ویجت زنده (🟡 در حال بیلد... -> 🟢 آنلاین و مستقر) پیگیری میکند. پس از اتمام (حدود ۱ الی ۲ دقیقه)، اعلان موفقیت در پنل استراپی نمایش داده شده و با نوشتن نام استایل جدید در فیلد متنی Style، بلافاصله روی سایت اعمال میشود.
۳. پیادهسازی کد BlockRenderer
فایل BlockRenderer/index.tsx قلب اصلی سیستم است. این تابع یک شیء block از Strapi دریافت میکند که فیلد __component آن مشخص میکند دقیقاً کدام کامپوننت React باید رندر شود.
block.__component: کلید یکتایی که Strapi برمیگرداند، مثلاً"ui.features-block"یا"ui.product-showcase-block".- هر
caseدر switch: یک بلاک Strapi را به یک کامپوننت React مشخص نگاشت میکند. default: return null: اگر بلاکی ناشناخته باشد، بهآرامی نادیده گرفته میشود و خطایی در UI نمایش نمیدهد.BlockAnimateWrapper: یک wrapper انیمیشن ورود به صفحه را برای تمام بلاکها بهصورت یکسان اعمال میکند.
import React from "react"import ProductShowcaseBlock from "./ProductShowcaseBlock"import FeaturesBlock from "./FeaturesBlock"import BlockAnimateWrapper from "./BlockAnimateWrapper" export default async function BlockRenderer({ block, region, countryCode, index }) { let BlockContent: React.ReactNode = null switch (block.__component) { case "ui.product-showcase-block": BlockContent = <ProductShowcaseBlock block={block} region={region} countryCode={countryCode} /> break case "ui.features-block": BlockContent = <FeaturesBlock block={block} /> break default: return null } return <BlockAnimateWrapper index={index}>{BlockContent}</BlockAnimateWrapper>}افزودن بلاک جدید = فقط یک case
case جدید به این switch اضافه کنید. هیچ تغییری در سایر فایلهای سیستم لازم نیست.