TemplateDsl؛ نوشتن template‌های HTML با C# و source generator

چرا مهم است

اگر با C# خروجی HTML می‌سازی، این پروژه رویکردی مبتنی بر source generator را پیش رویت می‌گذارد. سازنده روی تشخیص برخی خطاها هنگام compile،؜ ارسال خروجی حین render و پشتیبانی از native AOT تأکید دارد.

قبل از خواندن، این‌ها را بدان۵ مفهوم
source generator

سازوکاری برای تولید خودکار کد C# هنگام compilation بر اساس کد یا ورودی‌های پروژه.

در حال نگارش: source generator

allocation

اختصاص بخشی از حافظه برای نگهداری داده یا object در جریان اجرای برنامه.

در حال نگارش: allocation

AOT

روشی که در آن کد پیش از اجرای برنامه به کد بومی تبدیل می‌شود.

در حال نگارش: AOT

streaming

تولید یا ارسال تدریجی داده، بدون نیاز به آماده شدن تمام خروجی پیش از شروع ارسال.

در حال نگارش: streaming

endpoint

بخشی از یک سرویس که درخواست برای یک مسیر و عملیات مشخص را دریافت و پردازش می‌کند.

در حال نگارش: endpoint

TemplateDsl یک template engine مبتنی بر source generator برای قالب‌های متنی تودرتو است که سازنده‌اش آن را برای دریافت بازخورد معرفی کرده است. template‌ها با C# معمولی نوشته می‌شوند و به متدهای render با قابلیت streaming تبدیل می‌شوند. تمرکز فعلی روی HTML و TemplateDsl.Html است، اما نویسنده می‌خواهد پشتیبانی را به قالب‌های دیگر هم گسترش دهد.

سازنده، کمبودهای ابزارهای موجود در زمینهٔ static safety،؜ کارایی، boilerplate و پشتیبانی IDE را انگیزهٔ ساخت این پروژه می‌داند. به گفتهٔ او، TemplateDsl خطاهای تایپی، مقدارهای نادرست attribute و نبود context لازم را به خطای compile تبدیل می‌کند تا این موارد در runtime آشکار نشوند.

در بخش تولید خروجی، نویسنده می‌گوید template‌ها UTF-8 را مستقیم در خروجی می‌نویسند و allocation می‌تواند تا صفر کاهش پیدا کند. template‌های async نیز خروجی را هم‌زمان با render ارسال می‌کنند. داده از طریق constructor وارد می‌شود و منطق با C# معمولی نوشته می‌شود؛ template‌ها هم قابل تودرتو کردن، جابه‌جایی و استفادهٔ مجدد هستند.

به‌گفتهٔ سازنده، محتوا به‌صورت پیش‌فرض escape می‌شود، مگر اینکه خلاف آن صریحاً مشخص شود. همچنین تولید کد در زمان build و نبود reflection،؜ مبنای پشتیبانی اعلام‌شده از trimming و native AOT است.

نمونهٔ ارائه‌شده یک OrderRow برای ساخت ردیف جدول و یک OrdersPage از نوع async دارد. صفحه، سفارش‌ها را از IAsyncEnumerable<Order> می‌گیرد و با H.EachAsync برای هر سفارش یک OrderRow می‌سازد. PageContext نیز نام کاربر را در اختیار صفحه و template‌های تودرتوی آن می‌گذارد. در پایان، یک endpoint از نوع minimal API صفحه را با ToResult(context) برمی‌گرداند. این نمونه مسیر تعریف template تا بازگرداندن آن از endpoint را نشان می‌دهد؛ ادعاهای کارایی در متن از سوی سازنده مطرح شده‌اند.

نکته کلیدی

برای شناخت این رویکرد، به ارتباط OrderRow،؜ صفحهٔ async و PageContext دقت کن؛ نمونه نشان می‌دهد داده و context چگونه به template می‌رسند. کاهش allocation تا صفر را هم به‌عنوان ادعای سازنده به خاطر بسپار.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۴)