پایگاه دانش
قالبها
متنی که یکبار نوشته میشود، نسخهبندی میشود و بارها فرستاده میشود: از نگارشگر، از کد خودتان، یا بهدست یک عامل.
جزئیات
- یک قالب به اتصال تعلق دارد، نه به کسی که آن را نوشته است، و دلیل کنار گذاشتن نسخهٔ نخست همین بود. آن نسخه بر پایهٔ کاربر کلید میخورد: قالب یک همتیمی برای کلید API فضای کاری دیده نمیشد، پس یک یکپارچهسازی نمیتوانست چیزی را بفرستد که تنظیمکنندهاش میدید، و حذف حساب نویسنده قالبهای فضای کاری را هم با خود میبرد. ردیفها منتقل شدند، نه حذف.
- دو راه برای نوشتن متن. یک درخت بلوکی روی مؤلفههای
@react-email/components(Section, Row, Column, Container, Text, Heading, Button, Link, Img, Hr, Markdown, CodeBlock, CodeInline) که همان هنگام نوشتن بررسی میشود، پس یک گره نادرست یاhrefناامن در همان فراخوانیای که آن را نوشته رد میشود، بهجای آنکه به شکل ایمیلی خراب برسد. یا مارکآپی که خودتان رندر کردهاید: اگر قالبهایتان همین حالا در مخزن خودتان مؤلفههای react-email هستند، آنها را همانجا با@react-email/renderرندر کنید و HTML را ارسال کنید، که یکبار هنگام انتشار نسخه پاکسازی میشود. - بیستوسه نقطهٔ شروع و یکی خالی، در یک گالری و نه یک منو، چون اینها چیزهایی هستند که پیش از انتخاب باید دیدشان، پس هر کارت خودِ ایمیل را نشان میدهد. خوشآمدگویی و تأیید، رسید و صورتحساب، ارسال و تمدید، خلاصهها و اطلاعیهها، چیدهشده زیر چهار عنوان، و هرکدام در ویرایشگر دیداری باز میشود که در آن هر تکه جابهجاشدنی، قابل تغییر ظاهر و حذفشدنی است. هرکدام را که برگزینید به شکل پیشنویس میآید، پس تا منتشرش نکنید چیزی فرستادنی نیست.
- گالری تنها بخشی از این ماجراست که فقط در برنامه هست. فراخوانی که از کد خودتان یا از یک عامل به قالبها میرسد، بهجای نام بردن یک نقطهٔ شروع، یک متن (یک سند بلوکی یا مارکآپ خودتان) ارسال میکند، پس آن بیستوسهتا جایی برای شروعاند، نه فهرستی برای نصب کردن.
- slotهای نامدار و propهای نامدار دو گونه جای خالیاند که در متن و در موضوع به شکل {{key}} نوشته میشوند. slot را هرکس که قالب را ویرایش میکند پر میکند و مقدار پیشفرض دارد، پس ارسالی که هیچ نامی نبرد باز هم رندر میشود. prop هنگام ارسال داده میشود و اگر required علامت خورده باشد، نبودنش ارسال را رد میکند: یک 422، و هیچ ایمیلی بیرون نمیرود. همین رد کردن، دلیل اعلام کردن آن است: راه دیگر این است که پیامی با یک جای خالی بهجای شمارهٔ سفارش بیرون برود، چیزی که هیچ چیزی گزارشش نمیدهد و هیچکس نمیتواند پسش بگیرد.
- نسخهٔ منتشرشده منجمد است. ویرایش متن یک قالب منتشرشده بهجای بازنویسی آنچه زنده است، پیشنویس تازهای میسازد، پس ارسالها تا وقتی کسی منتشر نکرده همان چیزی را برمیگزینند که دیروز برمیگزیدند، و ارسالی که شمارهٔ نسخه را سنجاق کرده حتی آنوقت هم دستنخورده میماند. متن هنگام انتشار کامپایل میشود، و همین است که باعث میشود قالبی که رندر نمیشود برای منتشرکننده شکست بخورد، نه برای گیرنده.
- پیشنمایش دقیقاً همان چیزی را رندر میکند که یک ارسال میساخت، بیآنکه بفرستدش، و بهجای رد کردن، گزارش میدهد چه چیزی هنوز خالی است. قالبی که پیشنمایش میشود معمولاً قالبی در حال نوشته شدن است، و نویسندهای که بلوکبهبلوک پیش میرود نباید برای دیدن آنچه تا اینجا دارد ناچار باشد هر prop را برآورده کند.
- هر قالب سابقهٔ ارسال خودش را دارد: چند تا در هفت، سی یا نود روز گذشته بیرون رفته، کدامها باز شده و کدامها کلیک خورده، یک سری روزبهروز، و تفکیکی از اینکه هر ارسال از کجا آمده است: نگارشگر، کد شما، یک عامل، یا صف. هر نرخ مخرج خودش را نام میبرد و آن را قرض نمیگیرد، چون واقعاً با هم فرق دارند: بازشدنها روی پیامهایی شمرده میشوند که پیکسل داشتهاند و کلیکها روی پیامهایی که پیوند بازنویسیشده داشتهاند، و یک پیام میتواند یکی را داشته باشد بیآنکه دیگری را داشته باشد. پیشنمایش اصلاً ثبت نمیشود، و ارسال آزمایشی جداگانه شمرده میشود و از هر عددی بیرون میماند، چون هرگز بیرون نرفته است.
- این سابقه دربارهٔ آنچه نمیبیند صادق است، و همین دلیلی است که میتوان به نیمهٔ دیگرش اعتماد کرد. هر ارسال با خودِ ارسال به رکورد تحویلش تطبیق داده میشود، و تنها ایمیلی که از کد خودتان یا از صف فرستاده شده چنین رکوردی دارد. پیامی که از نگارشگر، از یک عامل یا بهدست دستیار فرستاده شود ندارد. پس قالبی که بیشتر از نگارشگر به کار میرود با بیشترِ ارسالهایش بدون تطبیق میرسد، و شمار بدونتطبیقها بهجای آنکه در «کسی بازش نکرد» تا شود، بهعنوان عددی مستقل نشان داده میشود.
- چهار سطح روی یک سرویس، تا «انتشار یعنی چه» یک پاسخ داشته باشد نه سه پاسخ که امروز با هم جورند. دکمهٔ Templates در نگارشگر قالبهای منتشرشده را پیشنهاد میدهد و پیام را با آنچه برمیگزینید جایگزین میکند، نه اینکه آن را داخل پیام بچسباند: ارسال نام قالب را میبرد، نسخه در همان لحظهای که انتخابش میکنید سنجاق میشود، و متن همانجا که نوشته شده رندر میشود، پس انتشاری که میان انتخاب و کلیک رخ دهد نمیتواند آنچه را بیرون میرود عوض کند، و چیدمانی که نگارشگر نمیتوانست نگه دارد دستنخورده میماند. آنچه آنجا پر میکنید مقدارهاست، نه متن. /templates نُه اندپوینت پشت اسکوپهای templates:read و templates:write است که SDK متدبهمتد آنها را میپوشاند. فرستادن یک قالب افزون بر اجازهٔ قالب به اجازهٔ ارسال هم نیاز دارد، پس کلیدی که به یک ابزار کپیرایتینگ داده شده میتواند بنویسد و منتشر کند بیآنکه بتواند برای کسی ایمیل بفرستد. سرور MCP پنج ابزار دارد: list، read، preview، create و send. عمداً هیچ ابزاری برای بهروزرسانی، حذف یا انتشار یک قالب موجود نیست. ویرایش پیشنویسی میسازد که ارسال بعدی به آن نمیرسد، و حذف را نمیشود پس گرفت. ویرایش متنِ ذخیرهشده یک صفحه است: /workspace/templates یک بوم بلوکی با پالت و بازرس دارد، یک پیشنمایش زنده در کنارش، و Save و Publish را دو کنش جدا، و همین است که نسخهٔ منتشرشده را چیزی میکند که میتوانید در حالی که روی نسخهٔ بعدی کار میکنید دستنخورده رهایش کنید.
- 200 قالب برای هر اتصال، یک سند بلوکی با سقف 500 بلوک، هشت سطح تودرتویی، 20,000 نویسه در هر مقدار و 100 slot و 100 prop؛ متنی که به شکل مارکآپ ارسال شود سقف یک میلیون نویسه دارد و موضوع سقف 998. هرکدام از اینها نگهبانی در برابر اسکریپت لگامگسیخته است، نه محدودیت طرح؛ هرکدام با پیامی رد میکنند که عددی را که بر پایهاش رد کردهاند نام میبرد، و هیچ چیزی از قالبها پشت یک سطح اشتراک نیست.