تقریباً ۲ سال از زمانی که Ryan Dahl خالق Node.js توی JSConf اشاره به ۱۰ تا از اشتباهات و مشکلاتی که توی نودجیاس وجود داره میکنه و در نهایت پروژه جدیدش تحت عنوان Deno رو معرفی کرد میگذره و یک هفته پیش دینو نسخه ۱ بطور رسمی منتشر شد و توجه های زیادی رو بخودش جلب کرد.
دینو مشابه نود یک Runtime برای اجرای برنامههای جاوااسکریپت در محیط خارج از مرورگره ولی مزیت هایی داره که دقیقاً ضعفها و مشکلات طراحی نود هستن و اصلاً همین مشکلات انگیزه شده برای کسی که نود رو ساخته بیاد و دینو رو بسازه.
برای اینکه متوجه این مزیتها بشیم بهتره با هم چندتا از مهمترین تغییرات که محسوستر و روشنتر هستن رو با هم یه مروری بکنیم:
امنیت
برنامههای جاوا اسکریپتی در مرورگر بدون اینکه امکان دسترسی مستقیم به فایل سیستم، شبکه و… رو داشته باشن بخوبی در یک محیط ایزوله و با امنیت بالا اجرا میشن ولی زمانی که برنامهها بر روی نود اجرا میشن میتونن به همه چیز دسترسی داشته باشن در حالی که اکثر اوقات دسترسی های محدودی لازمه. مثلاً غالبا برنامهها فقط با یک دایرکتوری خاص کار دارن ولی با نود عملاً به همه فایل سیستم دسترسی دارن. حالتی رو فرض کنید که یا خود برنامه باگ داره یا از کتابخونهای استفاده میکنه که در نسخه جدیدش مثلاً این باگ رو داره که منجر میشه کل فایلهای سیستم حذف بشه. با نود این اتفاق کاملاً شدنیه.
حالا دینو میاد و برنامه رو بصورت پیشفرض بدون اجازه دسترسی اجرا میکنه ( شبیه مرورگر ) و اگر دسترسی خاصی لازمه باید هنگام اجرا مستقیماً به دینو اعلام بشه. چجوری؟ اینجوری :
deno --allow-read=/var/tmp/ FirstDenoProgram.js
به این ترتیب دینو اسکریپت FirstDenoProgram.js رو اجرا میکنه و فقط اجازه خواندن فایل سیستم از مسیر var/tmp/ رو به برنامه میده. و یا مثلا فرض کنید برای کار با شبکه، با دستور زیر برنامه فقط اجازه باز کردن سوکت به سایت google.com رو داره.
deno --alow-net=google.com
و به همین ترتیب امکان تفویض بقیه دسترسی ها رو به مجری برنامه میده.
تحولات جاوااسکریپت
نود سال ۲۰۰۹ طراحی و ساخته شد و چون زبان جاوا اسکریپت زبانی قدیمی و خاص منظوره بود، خیلی از نیازهایی که در برنامهنویسی سمت سرور وجود داشت رو پشتیبانی نمیکرد؛ برای حل این مشکل برای نیازهای نود از راهکارهای خاص نود استفاده کردن. ولی در نسخه ۶ اکمااسکریپت که در سال ۲۰۱۵ ارائه شد و نسخه های بعدی اون بسیاری از این نیاز ها پوشش داده شد، ویژگی هایی مثل Promise / Async / Await ، ES Modules ، Typed Arrays که میتونه در خارج از مرورگر هم استفاده بشه ولی به دلیل طراحی نود و حجم عظیم کتابخونههای توسعه داده شده با اون عملا این ارتقا رو سخت میکنه، تا جایی که قید این تغییر رو بزنن.
دینو با هدف رفع این مشکل و استفاده کامل از امکانات ما بعد ۲۰۰۹ در زبان جاوااسکریپت طراحی شده و سعی میکنه حداکثر تشابه رو بین برنامههای مرورگر و سرور فراهم بکنه.
سازگاری با مرورگر
نود تقریبا بدون توجه به web-api مرورگرها مسیر خودش رو در پیش گرفت و نیازها رو حل کرد؛ این مسئله باعث سازگاری کمتر برنامههای نود با مرورگر شد. دینو در راستای هدف سازگاری بیشتر با برنامههای مرورگر تا حد امکان سعی کرده از api های مرورگر استفاده و پشتیبانی بکنه. طبیعتا محیط و هدف مرورگر با سرور و دسکتاپ متفاوته و نهایتا کمی ناسازگاری وجود خواهد داشت.
تایپ اسکریپت
احتمالا تا حالا تیکههایی که به زبان جاوا اسکریپت انداخته میشه رو شنیدین. خیلی هاشون درسته و بی راه نیست و همین ضعفهای طراحی زبان و داینامیک تایپ بودنش باعث شده توسعه برنامههای بزرگ با این زبان سخت بشه، به همین خاطر زبان های مختلفی مثل تایپ اسکریپت ،کافی اسکریپت و ... به وجود اومدن که زبان های کاملتر و خوش ساختتری هستن و توسعه محصول رو راحت میکنن و در نهایت تبدیل به کدهای جاوا اسکریپت شده و اجرا میشن. تو این داستان تایپاسکریپت به واسطه جامعیت و طراحی خوبش محبوبیت بیشتری پیدا کرد و عملا بسیاری از برنامهها به این زبان توسعه داده میشن. ولی هنوز هم کدهای تایپاسکریپت برای اینکه بر روی نود اجرا بشن مجبورن به کدهای جاوااسکریپت تبدیل بشن و خب این مشکل ساز، زحمتزا و غیربهینهست. دینو از اساس طراحی شده که هم قابلیت اجرای کدهای جاوااسکریپت رو داشته باشه و هم تایپاسکریپت؛ و این یک مزیت و بهبود بزرگ به شمار میره که زمینه فراگیری هرچه بیشتر تایپاسکریپت رو هم فراهم میکنه.
مدیریت وابستگیها
درون مرورگر برای استفاده از یک کتابخونه و اسکریپت خارجی از یه روش ساده و کارا استفاده میشه و اون اضافه کردن با آدرس اینترنتی اون هست. ولی زمانی که نود ساخته شد برای مدیریت وابستگیها از سیستم NPM و دایرکتوری node_modules استفاده شد. ولی این سیستم باعث مناقشه ها و مشکلاتی شد از جمله وابستگی به یک سرور متمرکز، سیستم و الگوریتمهای پیچیده مدیریت وابستگیها و .... که این باعث شد دینو سیستم مدیریت وابستگیها رو به همون شکل ساده مرورگر مدیریت بکنه و بگفته خالق دینو میره که جایگزین سیستم ماژول نود بشه. یعنی وارد کردن کتابخونه ها و اسکریپت ها از طریق آدرس نسبی یا مطلق. مثلا:
import * from "https://deno.land/std/http/server.ts"
خب پس نسخههای مختلف کتابخونهها چی میشن؟ توی url تعبیه میشن؛ دیگه باید آنلاین باشیم تا برنامه کار کنه؟ نه، شبیه npm که کتابخونه بار اول دانلود میشه و کش میشه، دینو هم به همین شکل کار میکنه و بار اول دانلود میکنه و کش میکنه و در درخواستهای بعدی دیگه از اون استفاده میکنه.
دینو مزیتهای بسیار دیگهای هم داره مثل ابزارهای داخلی برای توسعه (اجرا کننده تست، باندلر و ...)، کتابخونههای استاندارد کاملتر و ... که دیگه بحثش توی این مقاله نمی گنجه ولی اگه علاقه مند بودین میتونید به سایت خودش سر بزنید، هم بیشتر در موردش بخونید و هم کارکردن باهاش رو یادبگیرید.
همون طور که گفتم در واقع دینو یک Runtime برای جاوااسکریپت و تایپاسکریپته و بجای زبان سیپلاسپلاس که نود باهاش توسعه داده شده با زبان Rust توسعه داده شده. دینو همچنان از موتور V8 استفاده میکنه ولی از لحاظ ساختار کاملا با نود متفاوته و با توجه به هدف، نوآوریهاش و خالقش احتمالا در آینده نزدیک نود رو از تخت سلطنت پایین بکشه.
کلا سه تا مطلب در مورد دینو توی ویرگول منتشر شده که اینجا براتون میزارم وقت کردین اونا رو هم بخونید مفیده.