خلق دوباره یک رویا، از Node به Deno

اگر با Node.js کار کرده باشید یا داستانش را دنبال کرده باشید احتمالا Ryan Dahl را می‌شناسید، او به عنوان خالق Node.js شناخته می‌شود، او در سال ۲۰۰۹ در کنفرانس JSConf پدیده Node.js را به دنیا معرفی کرد، امروزه کدهای مرتبط با پلتفرم Node.js در بیش از ۱۲ میلیارد ماشین در سراسر جهان روزانه اجرا می‌شوند، داستان خلق Node.js و مسیر پیشرفت آن و تبدیل شدنش به یک موضوع مورد علاقه و فراگیر اگر چه جذاب است ولی موضوع بحث این نوشته نیست. ریان سالها پس از پیشرفت Node.js امروز در حال خلق دوبارهٔ رویای قبلی خود است.


برای هر برنامه‌نویسی دیدن کدهای قدیمی که خود او خلق کرده همیشه دردناک و عذاب آور است، تصور کنید شش سال قبل با دانشی که به مراتب از امروز کمتر بوده و نیازسنجی که احتمالا واقع بینانه نبوده کدی را توسعه دادید، امروز به آن نگاه می‌کنید احتمالا موهای خود رو می‌کنید و سریع آن را از صفحه روزگار حذف می‌کنید، اگر کمی صبورتر باشید که ۱۰۰ درصد آن را بازنویسی می‌کنید، حال تصور کنید به جای تکه‌ای کد پلتفرمی به بزرگی Node.js را توسعه داده‌اید، تمام تصمیم‌های دیزاینی و معماری آن را گرفته‌اید درست ده سال قبل و اصلا تصور نمی‌کردید روی به این حجم از محبوبیت و استفاده برسد، امروز همه آن اشتباهات رو می‌بینید و امکان تغییر آن را هم ندارید (به دلیل backward compatibility و این داستانها)! الان به خوبی شرایط ریان قصه ما را درک می‌کنید.

آقای Ryan Dahl چند سال در همین شرایط بود، عملا روند توسعه Node.js دیگر به اختیار شخص اون نبود و توسط یک بنیاد تبیین و کنترل می‌شد و اصلا هم امکان تغییر بنیادی نداشت، میلیون‌ها وب‌سایت و وب اپلیکیشن از Node.js استفاده می‌کنند و امکان هر تغییری نیست.

او به جای تغییر غیرقابل امکان پلتفرم Node.js پلتفرم جدید به نام Deno را دوباره خلق کرد، با کلی ایده جذاب و جدید، Deno در ظاهر شباهت‌های به Node.js دارد ولی در ساختار و معماری زمین تا آسمان متفاوت است، شاید تنها شباهت مهم این دو این باشد که هر دو ران تایمی برای اجرای کدهای جاوا اسکریپت باشند. Deno برخلاف Node.js که با زبان cpp نوشته شده است با استفاده از زبان Rust و بر بستر فریم‌ورک Tokio نوشته شده است، در این نوشته به تشریح و توضیح این پلتفرم جدید Ryan Dahl می‌پردازم.


در سایت Deno این پلتفرم را اینچنین معرفی می‌کند: A secure runtime for JavaScript and TypeScript. مهمترین تفاوت‌ها در همین جا مشخص می‌شوند، براستی منظور از secure اینجا چیست؟ چه چیزی باعث می‌شود که Deno یک رانتایم امن باشد، ساده است، شما وقتی یک کد Node.js را در کامپیوتر خود یا سرور اجرا می‌کنید آن کد با توجه به کاربری که آن را اجرا می‌کند دسترسی به فایل‌ها و لایه شبکه ماشین شما را دارد و می‌تواند هر تغییری در آن بدهد، وقتی پکیجی را از npm دانلود می‌کنید (هیچ بررسی انسانی بر روی پکیج‌های npm وجود ندارد) با استفاده از آن در کدتان و اجرای آن کد به آن هر اجازه‌ای برای تغییر و خرابکاری احتمالی داده اید، این خیلی مهم است، در پلتفرم Deno هنگام اجرای هر کدی باید بصورت واضح با استفاده از فلگهایی به آن کد دسترسی خواندن و نوشتن فایل یا استفاده از شبکه را بدهید. برای مثال کد زیر که یک echo سرور ساده است را در نظر بگیرید از آنجایی که هنگام اجرا به آن دسترسی شبکه نداده‌ایم، آن کد هرگز اجرا نخواهد شد.

همانظور که در تصویر و متن ارور مشخص است برای اجرای این کد نیاز به دسترسی به شبکه است که با فلگ allow-net می‌توانیم به Deno بگوییم که دسترسی به شبکه برای این کد بلامانع است. و اینگونه Deno یک پلتفرم امن است.

خب سراغ ادامه معرفی Deno که در سایت آن آمده است می‌رویم:

A secure runtime for JavaScript and TypeScript

کلمه typescript اینجا به ما چشمک زیبایی می‌زند، تایپ اسکریپت محصولی اوپن سورس از مایکروسافت یک زبان برنامه‌نویسی شبیه جاوااسکریپت (در واقع تایپ اسکریپت یک سوپرست از جاوا اسکریپت است، یعنی همه ویژگی‌های جاوااسکریپت را دارد در عین حال چیزهایی اضافه‌تر هم دارد) است که به جاوااسکریپت ترنسپایل می‌شود ولی یک ویژگی جذاب دارد و آن هم اضافه کردن یک تایپ سیستم قوی به جاوا اسکریپت است. معرفی تایپ اسکریپت در ویکی پدیا:

TypeScript is an open-source programming language developed and maintained by Microsoft. It is a strict syntactical superset of JavaScript and adds optional static typing to the language. TypeScript is designed for development of large applications and transcompiles to JavaScript.[5] As TypeScript is a superset of JavaScript, existing JavaScript programs are also valid TypeScript programs.

پلتفرم Deno به صورت Native و بدون نیاز به هیچ ترنسپایلر و کمپایلری از تایپ اسکریپت پشتیبانی می‌کند، شما می‌توانید به جای جاوااسکریپت از تایپ اسکریپت در Deno استفاده کنید.


ویژگی جذاب دیگر Deno استفاده از APIهای web standards است، Deno تا جایی که امکان داشت از این استانداردها پیروی کرده است، شما اگر در مرورگر از web apiها استفاده کردید به راحتی می‌توانید از همانها در Deno نیز استفاده کنید، برای مثال fetch را در نظر بگیرید، شما به راحتی از آن در مرورگر استفاده می‌کنید ولی برای استفاده از آن در Node.js باید از یک ترد پارتی لایبرری (نمی‌دونم چی ترجمش کنم!) استفاده کنید، ولی در Deno این api به صورت native و built in و با همان ساختار مرورگر در اختیار شماست، Deno از apiهای زیر به صورت built in و native پشتیبانی می‌کند:

  • addEventListener
  • atob
  • btoa
  • clearInterval
  • clearTimeout
  • dispatchEvent
  • fetch
  • queueMicrotask
  • removeEventListener
  • setInterval
  • setTimeout
  • AbortSignal
  • Blob
  • File
  • FormData
  • Headers
  • ReadableStream
  • Request
  • Response
  • URL
  • URLSearchParams
  • console
  • isConsoleInstance
  • location
  • self
  • window
  • AbortController
  • CustomEvent
  • DOMException
  • ErrorEvent
  • Event
  • EventTarget
  • MessageEvent
  • TextDecoder
  • TextEncoder
  • Worker
  • ImportMeta
  • Location

اگرچه همه این APIها در Deno به صورت صد درصد مطابق با همطراز آنها در وب نیستند، اما این هنوز یک خبر خوب برای توسعه دهندگان فرانت اند است که می‌توانند از دانش قبلی‌شان در Deno برای توسعه استفاده کنند.


ویژگی مهم دیگر Deno ابزارهای built in آن است، Deno دارای test runner متعلق به خود است، برای تست کدهایی که برای Deno می‌نویسید نیاز به ابزار اضافه‌ای ندارید خود cli دینو دارای یک تست رانر است، دیگر ابزارهای درونی Deno شامل یک file watcher، باندلر اختصای و سیستم کد فرمت کننده اختصاصی است، تصور کنید برای اجرا، تست و فرمت کردن کدهایتان نیازی به نصب webpack، jest و pretier ندارید، ابزار Deno همه اینها را برای شما فراهم کرده است. Deno به صورت کامل از golang در این مورد ایده گرفته است. Deno شامل ابزارهای بیشتری است که اینجا اشاره نکرده‌ام و تقریبا نیاز شما را به اکثر ابزارهای فعلی که در node از آنها استفاده می‌شود را پوشش می‌دهد. این ویژگی از آنجا مهم است که تمام پروژه‌ها از ابزار یکسان استفاده می‌کنند و برای هر پروژه‌ای نیاز به یادگیری ابزار جدیدی وجود ندارد.


ویژگی دیگر Deno عدم استفاده از یک پکیج منیجر مرکزی مثل NPM است، در واقع مدیریت پکیج‌ها در Deno به صورت decentralized انجام می‌شود (شبیه مدل golang)، هر کسی می‌تواند هر جایی کدهای Deno رو قرار دهد (برای مثال در یک ریپازیتوری گیت‌هاب) و شما صرفا با دانستن آدرسش آن را به کدهایتان اضافه کنید.

استفاده از پکیج منیجر مرکزی معایب و مزایایی دارد و این بخش از Deno یعنی استفاده از پکیج منیجر غیرمرکزی احتمالا بحث برانگیز باشد (مثل مشکلات go get در golang)، در هر صورت وقتی Deno کد ما را اجرا می‌کند فایل یا پکیج را دانلود کرده و در جایی (بصورت global) ذخیره می‌کند و از آن در runtime استفاده می‌کند. اگر می‌خواهید فایلها و پکیج‌ها در کنار پروژه شما ذخیره شوند می‌توانید مقدار متغیر $Deno_DIR را تغییر دهید.


موضوع مهم دیگری که باید اشاره کنم سیستم ماژولار Deno می‌باشد، Node.js از ورژن‌های ابتدایی از استاندارد Commonjs استفاده کرده بود (همون require و ...) و تا الان از سیستم استاندارد ماژول‌های ECMAScript پشتبانی کاملی ندارد، ماژول سیستم دیفالت Deno به طور کامل منطبق بر ECMAScript module standard می‌باشد، این موضوع اگرچه خبر خوبی است چون که این استاندارد به مراتب بهتر از Commonjs است ولی باعث می‌شود پورت کردن هزاران پکیج فعلی Node.js به Deno به سختی امکان پذیر باشد و نیاز به بازنویسی کامل داشته باشد.


دیگر ویژگی‌ها و اهداف پروژه Deno:

  • تولید یک باندل قابل اجرا، بعد از اجرای deno bundle شما یک فایل با پسوند .deno خواهید داشت که می‌توانید هر جایی آن را اجرا کنید.
  • توانایی سرو کردن درخواست‌های http به صورت بهینه و سریع
  • ساخت لایه‌ای ابسترکت و جدا از مفاهیم V8 سمت کاربر (دولوپر)

دیگر تفاوت‌ها با Node.js:

  • عدم استفاده از فایل package.json
  • در Deno همانند Node.js همه عملکردهای آسینک یک پرامیس برمی‌گردانند اما api پرامیس در Deno متفاوت می‌باشد.
  • کدهایی که در Deno اجرا میشوند اجرایشان در صورت برخورد به خطایی که هندل نشده است متوقف می‌شود

اطلاعات بیشتر و دقیقتر:

سایت پروژه Deno

سخنرانی Ryan Dahl با موضوع Ten Things I Regret About Node.js در JSConf

معرفی Deno در JSConf 2019

نظر شما چیه؟ به نظرتون پلتفرم Deno پلتفرم موفقی خواهد شد؟ آیا با اقبال کامیونیتی JavaScript مواجه خواهد شد؟ تو بخش نظرات بنویسید.