Herb در GitHub: ابزار جدید پارس ERB برای ریلز
خلاصهٔ کاملتر
Herb یه اکوسیستم ابزار توسعه برای قالبهای HTML+ERB در ریلزه که توسط Marco Roth ساخته شده. قلب این پروژه یه پارسر نوشتهشده به زبان C بر پایهی Prismه که درخت syntax لازم برای ویژگیهایی مثل language server و formatter رو فراهم میکنه — چیزهایی که تا حالا تو دنیای ERB جای خالیشون حس میشد. تیم Rails core هم دنبال اینه که Herb جایگزین Erubi بشه، و گیتهاب به عنوان احتمالاً بزرگترین رندرکننده ERB دنیا، این ابزار رو روی مونولیت واقعیش تست کرده.
گیتهاب حدود نیم میلیون خط ERB در ۱۰ هزار فایل داره. وقتی Joel (مهندس ارشد تیم سلامت مونولیث github.com) اولین بار لینتر Herb رو اجرا کرد، کمتر از ۷۵٪ فایلها پاس شدن و ۲۷۶۸ فایل نیاز به بررسی داشتن. بخش بزرگی از این مشکلات، باگهای واقعی بودن که ابزارهای قبلی مثل erb_lint پیداشون نکرده بودند.
از جمله مشکلات جالبی که Herb پیدا کرد: تگهای بستهنشده HTML، جاهایی که تگهای بستن ERB و HTML با هم عوض شده بودن، و جدیتر از همه، Ruby نامعتبر داخل قالبها — مثل شرطهایی که ناقص نوشته شده بودن ولی چون هیچوقت در CI مستقیم اجرا نمیشدن، کشف نشده بودن. چون Herb از Prism برای پارس واقعی کد Ruby استفاده میکنه، این نوع خطاها رو فوری میگیره.
در کنار باگهای موجود در کدبیس گیتهاب، چند باگ هم در خود Herb پیدا شد؛ از جمله یه مشکل whitespace و یه باگ جدیتر: وقتی یه کامنت روی همون خط end قرار میگرفت، Herb خروجی Ruby نامعتبر تولید میکرد:
<%= render Foo.new do %>
hello
<% end # comment %>این نوع خطا میتونست مستقیم به پروداکشن برسه چون Rails خروجی پارسرهایی مثل Herb رو بدون اعتبارسنجی اجرا میکنه. Marco بعداً اعتبارسنجی Ruby رو به دستور herb analyze اضافه کرد.
یه چالش دیگهای که هنوز باز مونده مشکل پرفورمنس در زمان بوته. با فعال کردن Herb در یه کلاستر پروداکشن، زمان بوت از ۲ دقیقه به نزدیک ۳ دقیقه رسید. دلیل: Herb برای کامپایل قالبها بهطور چشمگیری کندتر از Erubiه — در برخی اندازهها تا ۱۵ برابر کندتر. این مسئله برای اپلیکیشنهایی که کش قالبها رو موقع بوت گرم میکنن (مثل گیتهاب که از ActionView::Precompiler استفاده میکنه) خیلی محسوسه.
در حال حاضر گیتهاب منتظر حل این مشکل پرفورمنسه تا Herb رو به پروداکشن ببره، ولی توصیه میکنه همین الان خارج از محیط پروداکشن ازش استفاده کنید. پلنهای بعدی شامل حذف وابستگی به erb_lint، فعالسازی قوانین lint بیشتر، و حتی استفاده از AST درخت Herb برای تبدیل ERB به React میشه.
نکات کلیدی:
- Herb پارسر C-based برای HTML+ERBه و قراره جایگزین Erubi در Rails core بشه
- گیتهاب با ۵۰۰ هزار خط ERB، این ابزار رو در مقیاس واقعی تست کرده
- Herb باگهای جدی از جمله Ruby نامعتبر رو پیدا کرد که ابزارهای قبلی از دستشون داده بودن
- مشکل اصلی: کامپایل قالبها تا ۱۵ برابر کندتر از Erubiه
- استفاده در محیطهای غیرپروداکشن همین الان توصیه میشه




