هادی شرقی
هادی شرقی
خواندن ۶ دقیقه·۶ سال پیش

معرفی و بررسی Frameworkهای Server-Side Swift (قسمت سوم Vapor)


3- Vapor

نوبت به فریمورک مورد علاقه من Vapor میرسه! Vapor یکی دیگر از فریمورک‌های متن باز بر پایه زبان Swift است، که پس از انتشار نسخه ۳ زبان Swift معرفی شد. البته Vapor از بدو معرفی زبان Swift وجود داشته ولی انتشار نسخه 1.0 آن تا اواسط سال ۲۰۱۶ طول کشید. با گذشت کمتر از ۸ ماه نسخه ۲ آن منتشر گردید که Vapor را به فریمورکی قابل استفاده در پروژه های واقعی بدل کرد.

پس از معرفی Swift NIO توسط اپل و معرفی Swift 4 ، تیم توسعه دهنده Vapor که درحال نوشتن نسخه 3 و مقدمات انتشار این نسخه بودند، طی حرکتی غیرقابل باور، تمامی کدهای قدیمی را به دور ریخته و کدهای جدید را از ابتدا برپایه Swift NIO بازنویسی کرده و آن را به فریمورکی Non-blocking تبدیل کردند. (اگر نمیدونین که non-blocking چی هست برای آشنایی اجمالی میتونین به یکی از نوشته‌های قبلی من رجوع کنید)

فریمورک Vapor در حال حاضر با بیش از ۱۶۰۰۰ هزار ستاره در گیت‌هاب (در زمان انتشار این نوشته)، پرطرفدارترین در جمع فریمورک های مبتنی بر زبان Swift است. تیم توسعه دهنده Vapor واقعا از سرعت بالایی برای هماهنگ کردن کدهای این پروژه با آخرین نسخه های زبان Swift و بهره‌گیری از امکانات جدید آن، برخوردار هستند. به عنوان مثال تنها پس از گذشت ۳ هفته از انتشار Swift NIO توسط اپل، تمامی کدهای پروژه Vapor باز نویسی شد و پروژه بر اساس Swift NIO دوباره نوشته و نسخه 3.0 آن منتشر شد.

تیم توسعه دهنده Vapor علاوه بر پروژه اصلی، چند پروژه دیگر نیز در دست اجرا دارند.

۱- پروژه Vapor Cloud که معادل IBM Cloud است (البته با امکانات بسیار کمتر) و جهت Deploy کردن آسان و سریع پروژه های نوشته شده با Vapor به سرور. درحال حاضر نسخه ۱ آن منتشر شده که هیچ نوع سرویس مجانی ندارد. اما در نسخه ۲ آن (که هنوز منتشر نشده است و در مرحله آلفا است) تا حد مناسبی که برای تست پروژه کفایت میکند، سرویس رایگان وجود دارد. منظور از آسان و سریع بودن آن تا این حد است که تنها باید این دستور یک خطی را تایپ کنید تا پروژه به روی سرور منتقل و آماده به کار شود.

~/vapor/hello-world $‍‍‍ cloud deploy --env=staging
> Creating deployment [Done]
> Building vapor [Done]
> Creating container [Done]
> Updating replicas [Done]
> Deploy successful https://hello-world-staging.vapor.cloud

البته عدم کنترل کامل بر روی تنظیمات و برنامه های سرورهای Vapor Cloud هزینه ای است که برای به دست آوردن این آسانی و سرعت می‌پردازید. اگر میخواهید کاملا بر سرور خود مسلط باشید بهتر از سراغ سرویس دوم این تیم بروید.

۲- پروژه Vapor Red که فعلا بر روی سرورهای Digital Ocean کار میکند و در آینده پشتیبانی از سرورهای آمازون هم به آن اضافه خواهد شد. این پنل، GUI کامل و بسیار مناسبی در اختیار شما میگذارد که نصب و راه اندازی هر گونه برنامه ای یا تنظیمی بر روی سرور‌های خود را به راحتی و بدون دردسر انجام دهید. نصب برنامه‌ها و تنظیمات مختص زبان و محیط Swift یا Vapor نمیباشد.

 Vapor Red
Vapor Red

میتوانید به راحتی محیط سرور خود را برای اجرای برنامه های PHP با نسخه دلخواه و دیتابیس سرور دلخواه خودتون راه‌اندازی کنید. ضمنا کار Deploy کردن پروژه های Vapor را نیز به راحتی میتوانید انجام دهید. البته این پروژه متاسفانه هیچگونه سرویس رایگانی ندارد.

راه سوم نصب Swift و Vapor بر روی سرور و راه اندازی برنامه توسط خود شما است! که انشالله در پست‌های بعدی به آن میپردازیم.


برگردیم به فریمورک Vapor و کتابخانه‌هایی که به صورت پیش فرض آماده استفاده بر روی این فریمورک هستند.

کتابخانه های از پیش نوشته شده در این فریمورک :

  • Async / non-blocking IO
  • Authentication (basic, bearer, JWT, password)
  • Cache: (Redis, in-Memory)
  • Commands / console formatting (For building CLI commands)
  • Content Negotiation: JSON, multipart, and URL-encoded form
  • Crypto (RNG, ciphers, digests, RSA)
  • HTTP Client and Server (HTTP 1.1)
  • Leaf Templating: HTML etc
  • Logging
  • URL Routing
  • Validation
  • WebSocket client and server
  • Jobs (Queue system)
  • Sessions (Web, Redis)
  • URL Routing
  • Websockets

ابزاری که Vapor برای مدیریت پروژه‌ها از طریق CLI در اختیار شما قرار میده (Vapor Toolbox) فعلا بجز چند دستور ساده برای ساختن پروژه جدید، ایجاد پروژه XCode از روی پروژه موجود و Deploy کردن پروژه، امکانات بیشتری در اختیار شما قرار نمیده. اما با استفاده از کتابخانه Command میتونین خودتون با زبان Swift دستورات CLI جدید بنویسین و در پروژه از آنها استفاده کنید.

کتابخانه ORM این فریمورک Fluent نام داره. از لحاظ ارتباط از دیتابیس های معمول بازار به صورت پیش‌فرض پشتیبانی میکنه، بجز MongoDB که برای آن کتابخانه های اشخاص ثالثی برای استفاده وجود دارد.

  • MySQL
  • PostgreSQL
  • SQLite
  • Redis
  • MongoDB (Third party packages)

برای تولید محتوای HTML این فریمورک به صورت پیش‌فرض از فرمتی به نام Leaf پشتیبانی میکنه که توسط تیم Vapor ساخته شده است. اما به صورت دلخواه، استفاده از از فرمت‌های معمول دیگر مثل Mustache, Stencile و Markdown کاملا میسر است. دلیل اینکه تیم توسعه دهنده Vapor تصمیم به ایجاد Leaf Template گرفتند این بود که تمامی قالب‌های دیگر به نحوی به زبانی به غیر از Swift وابسته بودند و برای همین Leaf تماما با زبان Swift نوشته شد، و باعث شده برای استفاده از این فریمورک تنها پکیجی که احتیاج دارین نصب کنین، Swift است و بس و بر خلاف فریمورک های دیگه که معولا به زبان C یا زبان‌های دیگری احتیاج دارند. البته این قضیه باعث شده که رندر کردن صفحات وب توسط Leaf کمی کند تر از سایر رقبای خودش انجام بشه که از آنجایی که تفاوت آنچنان زیاد نیست میشه از آن صرف نظر کرد.

این مطلب که تیم توسعه دهنده Vapor به سرعت این فریمورک را بروز رسانی میکنند و بلافاصله پس از معرفی نسخه‌های جدید Swift و کتابخانه Swift NIO تغییرات را در فریمورک اعمال میکنند از طرفی جالب و هیجان انگیز است. اما از طرفی باعث میشود که API این فریمورک مرتبا در حال تغییر باشه. البته توسعه دهندگان تیم Vapor تمامی سعی خود رو میکنن که تغییرات حداقل باشه اما برای همگام بودن با آخرین تکنولوژی روز که سرعت پیشرفت آن بسیار زیاد است، گاهی مجبور به ایجاد تغییراتی میشوند که کدهای موجود شما رو نیازمند تغییر اساسی میکنن. به عنوان مثال در حال حاضر Vapor تنها فریمورک Swift است که به سرعت کد خود را منطبق بر نسخه 5.0 Swift کرده است.

چنانچه احتیاج به فریمورکی دارین که دارای تغییرات کمتری در طول زمان باشه و مرتبا مجبور به بروزرسانی کدهای خود منطبق بر آخرین نسخه آن نباشید، استفاده از Vapor توصیه نمیشه. بهتره انتخاب دیگری مثل Kitura رو در نظر بگیرین که بسیار با احتیاط و آهسته و البته پیوسته در حال بروزرسانی هست.

درحال حاضر نسخه 4 این فریمورک در مرحله توسعه و در فاز آلفا میباشد. در نسخه ۴ شاهد استفاده از کتابخانه Swift NIO 2 که از HTTP2 پیشتیبانی میکند خواهیم بود. همچنین تغییراتی در ساختار کلی فریمورک که نوشتن کدهای پویا (Dynamic) رو راحت تر میسر میکنه.

پشتیبانی از این پروژه برای کابران و توسعه دهندگان در حال حاضر به صورت رسمی در کانال Vapor در برنامه Discord انجام میشه. البته به سوالات کاربران در Stackoverflow و forum.swift.org هم پاسخ داده میشه. کانال رسمی Vapor در Discord با بیش از ۱۰هزار نفر عضو و دسته بندی موضوعی برای مطالب معمولا مشکلات شما رو بدون جواب نمیذاره و از این لحاظ فعال ترین جامعه رو بین فریمورک های Swift داره.

نقاط قوت

  • امکان ایجاد دستورات CLI با استفاده از زبان Swift
  • پیشرو در بروز بودن (فریمورک، کتابخانه‌ها و استفاده از امکانات جدید زبان Swift)
  • قالب کد (Syntax) بسیار ساده و شبیه به کدهای معول Swift که در iOS استفاده میشه.
  • استفاده از ساختار Async / Non-blocking در کل فریمورک
  • جامعه (Community) بسیار فعال


نقاط ضعف

  • تغییرات زیاد در ساختار و API فریمورک که باعث میشه کدهای پروژه باید مرتبا بروزرسانی شوند.


برنامه نویسیسرورسوییفت
Back-end / iOS Developer
شاید از این پست‌ها خوشتان بیاید