سایت شخصی مدرن را با فهرست تکنولوژی معرفی کردن آسان است و تقریباً هیچ چیز را توضیح نمیدهد. Next.js، یک CMS هدلس، Postgres، Tailwind، چند کامپوننت آماده، و یک محل استقرار. این فهرست میتواند مال یک نمونهکار تمیز باشد یا مال سیستمی که عصر جمعه جرئت نمیکنی دست بزنی. تفاوت در مدل محتوا و در مرز بین مسیر عمومی و مسیر تحریریه است، نه در جدید بودن شماره نسخه.
mehd.ir را روی همین جنس تقسیم ساختم، ولی این متن تور ریپو نیست. تصمیمی است که تکرار میکنم. هر لایه باید یک سوال را جواب بدهد. اگر فقط چون ابزار رایج است نصب شده، معماری نیست. تزئین است.
سه لایه، نه یک استک واحد
لایه اول مسیری است که بازدیدکننده میبیند. Next.js با App Router و React Server Component این کار را برای من ساده کرد: صفحه را روی سرور بساز، داده را همانجا بخوان، و به مرورگر کمتر از چیزی بده که برای کشیدن کل سایت لازم دارد. عدد دقیق Next یا React را قول معماری نمیدانم. اگر نسخه را عوض کردی و هنوز میتوانی بگویی درخواست عمومی از کجا میآید و چه چیزی کش میشود، معماری سر جایش است.
لایه دوم تحریریه است. Payload بهدرد میخورد چون مدل محتوا کد TypeScript است، نه یک تنظیم گم در پنل یک سرویس دیگر. کالکشن، دسترسی، و پیشنویس کنار همان ریپویی میمانند که صفحه را رندر میکند. قفل فروشنده کمتر از این مهم است که با عوض شدن فیلد، هر دو طرف غر بزنند.
لایه سوم داده است. Postgres چون رابطه، وضعیت پیشنویس، و رسانه به یک دیتابیس واقعی نیاز دارند نه به فایلی که امیدواری کسی همزمان ننویسد. اینکه این Postgres را کجا میزبانی کنی تصمیم عملیات است. معماری این است که سایت و CMS همان دیتابیس را شریک باشند و راز اتصال فقط سمت سرور بماند. «مقیاس خودکار» را از بروشور میزبان به ارث نبر. تا وقتی کوئری فهرست باریک است، مقیاس مسئله تو نیست.
چه چیزی را معماری صدا نزن
تحلیل بازدید، حالت تاریک، و فایل Docker هر کدام میتوانند مفید باشند. هیچکدام بهتنهایی دلیل انتخاب استک نیستند. اسنیپت تحلیل اگر رویداد محصول را تعریف نکرده باشی فقط صفحه را سنگین میکند. حالت تاریک یک متغیر CSS است، نه یک لایه. Docker وقتی معماری است که تصویر پروداکشن را قابل بازتولید کند. اگر فقط کنار ریپو نشسته و استقرار واقعی جای دیگری است، سند عملیات است نه قلب سیستم.
سازنده چیدمان هم همینطور. برای صفحهای که پست نیست و واقعاً چند بلاک قابل جابهجایی میخواهد، بلاک ساختیافته درست است. برای مقاله، یک بدنه و چند فیلد صریح کافی است. اگر هر صفحه را به سازنده چیدمان بسپاری، انعطاف را خریدهای و حافظه را از دست دادهای. شش ماه بعد یادت نیست هیرو از کدام بلاک میآید.
فروشگاه کامپوننت هم لایه نیست. Radix و shadcn/ui برای من یعنی مالکیت کد و مبنای دسترسپذیری، نه نصب یک تم. اگر کامپوننت را کپی کردی و بعد نتوانستی بدون ترس رنگ و رفتار را عوض کنی، سیستم طراحی نداری. یک وابستگی خوشظاهر داری. Tailwind در همین مرز مینشیند. سرعت ساختن UI است، به شرطی که فاصله و تایپ و رنگ از چند توکن بیایند نه از سلیقه هر فایل.
انتشار را از دکمه ذخیره جدا کن
معماری سایت شخصی در لحظه انتشار معلوم میشود، نه در نمودار. پیشنویس نباید در فهرست عمومی دیده شود. ذخیره در ادمین بهتنهایی یعنی URL زنده عوض شده نیست. باطلسازی کش باید به اسلاگ بند باشد. تصویر هیرو باید اندازه داشته باشد تا صفحه نپرد. عنوان متا جایی که لازم است از عنوان مقاله جدا بماند، چون کلیک در نتایج جستجو همیشه همان H1 نیست.
اینها را پلاگین سئو حلشده فرض نکن. پلاگین فیلد را نزدیک محتوا میگذارد. تصمیم هنوز مال توست: کدام صفحه اصلاً باید ایندکس شود، کدام تصویر مسیر OG است، و اسلاگ بعد از دیده شدن عوض میشود یا نه. رتبهای که ساخته شده به آدرس چسبیده. سلیقه امروز تو دلیل ریدایرکت حسابنشده نیست.
رسانه را هم جزو مدل بدان نه جزو پوشه آپلود. فایل بدون متن جایگزین، یا بدون نسبتی که چیدمان لازم دارد، باگ محتواست. چون سایت شخصی معمولاً یک ویراستار دارد، فرم ادمین باید این را اجباری کند. بازبین دومی در کار نیست.
مسیر خواندن را باریک نگه دار
فهرست و مقاله دو کوئریاند حتی اگر هر دو «پست» باشند. فهرست عنوان، اسلاگ، تاریخ، توضیح، و هیرو میخواهد. سند کامل بدنه را برای صفحه مقاله بگذار. این تقسیم با رشد بایگانی، هم دیتابیس و هم زمان پاسخ را راستگو نگه میدارد. fetch کل بایگانی از کامپوننت کلاینت، حتی برای سایت کوچک، عادت بدی است چون همان کد بعداً با سند بیشتر تکرار میشود.
Local API یا هر خواندن مستقیم CMS باید در تابع سرور بماند. کامپوننت کلاینت شکل کوئری و گاهی راز را به مرورگر میبرد. برای نمونهکار یکنفره هم این مرز ارزش دارد، چون بعدها کسی جز تو همان کد را ادامه میدهد و زمینه شفاهی را ندارد.
TypeScript اینجا تزئین رزومه نیست. قرارداد بین کالکشن و صفحه است. اگر فیلد را حذف کردی و صفحه هنوز بیصدا خالی رندر شد، نوع را جدی نگرفتهای. سختگیری را جایی بگذار که محتوا منتشر میشود، نه اینکه فقط در ادیتور خطاهای نامرتبط را قرمز کند.
چه چیزی را تکرار میکنم
اول مدل، بعد صفحه. کوئری کارت جدا از کوئری مقاله. پیشنمایش پیشنویس قبل از هر حرفی درباره انیمیشن. راز فقط سمت سرور. اسلاگ پایدار. کامپوننت را مالک باش یا نصب نکن.
چه چیزی را دورش خط میکشم. یک فیلد بدنه برای کل سایت. معرفی معماری با فهرست لوگوی ابزار. وعده عملکرد که بهینهسازی تصویر و شکستن باندل را بدون اندازهگیری روی ترافیک خودت «حلشده» اعلام کند. سایت شخصی وقتی معماری دارد که عصر جمعه بشود یک اصلاح کوچک را بیخطر منتشر کرد و بدانی فهرست، کش، و پیشنویس هر کدام کدام حقیقت را میگویند. بقیه ابزارند. ابزار را عوض میکنی. این قرارداد را اگر عوض کنی، سایت دیگری ساختهای.