به دنبال یک روبی ایمن نوع ایمن روی ریل در TypeScript، شروع به توسعه یک ORM کردم.

من در حال توسعه یک کتابخانه ORM برای TypeScript به نام Accel Record هستم. اخیراً مقالهای در معرفی این کتابخانه منتشر کردهام، با عنوان مقدمهای بر «ضبط Accel»: یک ORM TypeScript با استفاده از الگوی ضبط فعال.
در مرحله بعد، می خواهم توضیح دهم که چرا تصمیم گرفتم یک ORM جدید برای TypeScript ایجاد کنم.
انگیزه اولیه
به عنوان فردی که از Ruby on Rails برای توسعه سمت سرور و TypeScript برای توسعه فرانتاند استفاده میکند، اغلب به موارد زیر فکر میکنم:
- من یک چارچوب برای TypeScript می خواهم با کارایی توسعه قابل مقایسه با Ruby on Rails.
این تمایل از تمایل به استفاده از TypeScript برای توسعه سمت سرور نیز ناشی می شود. دلایل عمدتاً به شرح زیر است:
- من می خواهم سمت سرور را با ایمنی نوع توسعه دهم.
- من میخواهم هم فرانتاند و هم بکاند را به یک زبان توسعه دهم تا هزینههای تغییر متن و یادگیری را کاهش دهم.
این فرآیند فکری رایج به نظر می رسد و در واقع مواردی وجود دارد که TypeScript برای توسعه سمت سرور به این دلایل اتخاذ می شود.
چه نوع چارچوبی می خواهم؟
بنابراین، یک چارچوب با کارایی توسعه قابل مقایسه با Ruby on Rails چگونه است؟
شرایط ممکن است از فردی به فرد دیگر متفاوت باشد، اما در مورد من، من به شرح زیر فکر کردم:
- باید بتواند عملکردهایی را برای موارد استفاده رایج در توسعه برنامه های وب با حداقل کد پیاده سازی کند.
به طور خاص، من به دنبال عناصر زیر هستم:
- بر اساس توسعه MPA با SSR (نه SPA)
- قادر به پیاده سازی توابع CRUD برای RDB با حداقل کد
- چارچوبی که دامنه MVC را در سمت سرور پوشش می دهد
اگر چنین چارچوبی وجود داشت، من معتقدم توسعه سمت سرور با TypeScript میتوانست به اندازه استفاده از Ruby on Rails کارآمدتر باشد.
چارچوب های موجود رضایت بخش نبودند
من بررسی کردم که آیا چارچوبی که شرایط فوق را برآورده می کند قبلاً وجود داشته است یا خیر.
نتیجهای که من به آن رسیدم این بود که ممکن است چارچوب TypeScript وجود نداشته باشد که عملکردهایی را برای فرآیندهای سمت سرور به کارآمدی و با کد کمی مانند Rails ارائه دهد.
بهطور کلی، به نظر میرسد چارچوبهای TypeScript موجود بیشتر بر روی مسیریابی و تقویت یکپارچهسازی front-end/back-end تمرکز دارند. در حالی که آنها از نظر ویژگی های مربوط به View و Controller (در اصطلاح MVC) غنی هستند، بخش Model در مقایسه با Rails ضعیف تر به نظر می رسد.
آیا به یک ORM مانند سابقه فعال نیاز داریم؟
در Rails، ORM که نقش Model را مدیریت می کند، Active Record است.
البته تایپ اسکریپت ORM هم دارد، اما رکورد فعال Rails چیزی فراتر از یک ORM است. این کارکردهای مختلف مربوط به مدل دامنه مربوطه را فراهم می کند، نه فقط عملیات روی رکوردهای DB.
ویژگی Rails توانایی آن در اجرای عملکردهای رایج با حداقل کد است. این امکان پذیر است زیرا کلاس های مدل ارائه شده توسط Active Record دارای ویژگی های بسیاری هستند. آنها به شدت با سایر بخشها مانند مسیریابی و کنترلکنندهها ادغام میشوند و در نتیجه کارایی توسعه بالایی دارند.
از این منظر، من فکر کردم که برای رسیدن به هدف، TypeScript به یک ORM بسیار کاربردی مشابه رکورد فعال Rails نیاز دارد.
ORM چه عناصری باید داشته باشد؟
برای ارائه یک تجربه توسعه کارآمد در TypeScript مشابه Rails، فکر کردم ORM باید عناصر زیر را داشته باشد:
1. الگوی ضبط فعال
باید الگوی Active Record را اتخاذ کند. این به این دلیل است که من میخواهم یک کلاس نه تنها عملیات روی رکوردهای DB بلکه ویژگیهای مربوط به مدل دامنه مربوطه را نیز مدیریت کند.
به عنوان مثال، با یک ORM که الگوی Table Gateway را اتخاذ می کند، رکوردهای بازیابی شده اشیاء ساده هستند و پیوستن روش های مربوط به مدل را دشوار می کند.
علاوه بر این، یک ORM الگوی ضبط فعال، ادغام با ویژگیهایی مانند مسیریابی و مشاهده همانطور که در Rails انجام میشود را آسانتر میکند.
2. نوع Safety
با استفاده از مزایای TypeScript، عملیات و رابط پرس و جو ORM باید از نظر نوع ایمن باشد.
انگیزه اولیه توسعه سمت سرور با ایمنی نوع بود، بنابراین پشتیبانی از نوع کافی انتظار می رود.
هیچ ORM موجود الزامات را برآورده نمی کند
با توجه به ملاحظات بالا، من ORM های موجود را بررسی کردم اما نتوانستم موردی را پیدا کنم که از نظر نوع ایمن باشد و الگوی ضبط فعال را اتخاذ کند.
به عنوان مثال، پریسما که به طور فزاینده ای محبوب می شود، ایمنی نوع بالایی دارد اما از الگوی Table Gateway استفاده می کند.
نزدیکترین تناسب TypeORM بود که از الگوی Active Record استفاده می کند، اما پشتیبانی از نوع آن در مقایسه با ORM های اخیر ضعیف تر است و فرکانس انتشار آن اخیراً پایین بوده است.
من تصمیم گرفتم توسعه یک ORM را امتحان کنم
بر اساس موارد فوق، تصمیم گرفتم توسعه یک ORM ایمن نوع در TypeScript را شروع کنم که از الگوی Active Record استفاده می کند.
میخواستم آن را توسعه دهم تا ببینم آیا امکانپذیر است یا خیر و چالشهای بالقوه را شناسایی کنم.
روند توسعه بعدی در مقاله دیگری توضیح داده خواهد شد، اما در نهایت، من ORM جدید را به عنوان Accel Record منتشر کردم.
نتیجه
در این مقاله، من توضیح دادم که چرا تصمیم گرفتم یک ORM جدید برای TypeScript ایجاد کنم.
انگیزه اولیه تمایل به چارچوبی در TypeScript با کارایی توسعه قابل مقایسه با Ruby on Rails بود. همانطور که به تحقیق در مورد کتابخانه های موجود ادامه دادم، نیاز به یک ORM ایمن تایپ در TypeScript را که از الگوی Active Record استفاده می کند، دریافتم.
بنابراین، توسعه را شروع کردم و در نهایت کتابخانه را منتشر کردم. برای اینکه ببینید به چه نوع ORM تبدیل شده است، لطفاً مقدمه “Accel Record” را بررسی کنید: ORM TypeScript با استفاده از الگوی ضبط فعال و README.