Deno.js چیست؟ نگاهی مختصر به یک تازه‌وارد در دنیای JavaScript Runtimeها

?What is Deno.js

Deno.js چیست؟ نگاهی مختصر یک تازه وارد در دنیای JavaScript Runtime ها

JavaScript runtime ها محیط هایی هستند که می توانند کد جاوا اسکریپت ما را در خود اجرا کنند. معروف ترین JavaScript runtime در حال حاضر Node.js است که شهرت بسیار زیادی دارد اما توسعه دهنده آن، آقای Ryan Dahl، اخیرا یک runtime جدید به نام Deno را ساخته است و سعی کرده در آن اشتباهات گذشته خود را جبران کند. البته Deno یک runtime برای جاوا اسکریپت و تایپ اسکریپت می باشد و سعی می کند نقاط ضعف node.js را پوشش دهد.

اولین سوالی که به ذهن مخاطبین می آید این است که آیا باید Node.js را کنار بگذاریم؟ خیر! Node.js توسط بسیاری از کمپانی های بسیار بزرگ استفاده می شود و به هیچ عنوان زبانی نیست که بخواهد در چند سال آینده از صحنه وب حذف شود. خود آقای Ryan Dahl نیز در مصاحبه خودشان توضیح دادند که Node.js حالا حالا ها بر سر کار خواهد ماند. بنابراین Deno.js روش دیگری است که اگر به طبع شما خوش بیاید می توانید از آن استفاده کنید.

آقای Ryan Dahl در مصاحبه معروفی توضیح می دهد که چند ویژگی یا مشکل خاص در مورد Node.js وجود دارد که به خاطر آن ها احساس پشیمانی می کند:

  • پیاده نکردن Promise ها از همان ابتدای کار (promise ها ابتدا اضافه شده و سپس حذف شده و بعدا دوباره اضافه شدند).
  • مشکلات امنیتی: اسکریپت های js به تمام سیستم (دیسک و شبکه و غیره) دسترسی دارد.
  • Build system کلی آن و نارضایتی از معماری اولیه آن (استفاده از GYB). مثلا وجود NPM و node modules و غیره. مثلا از نظر ایشان الگوریتم resolve شدن ماژول های Node_modules بیش از حد پیچیده است.

تمرکز اصلی Deno روی جاوا اسکریپت امروزی و مدرن است. زمانی که Node.js ارائه شد (در اوایل ارائه آن) کاربران به promise ها دسترسی نداشتند بنابراین کدهای توسعه دهندگان پر از callback های مختلف می شد:

const fs = require('fs');
fs.readFile('readme.txt', (err, data) => {
  if (err) {
    // Handle the error
  }
  // Otherwise handle the data
});

Node.js بعدها این مشکل را برطرف کرد و promise ها را به این زبان اضافه کرد.

تمرکز Deno.js بیشتر روی قابلیت های مدرن جاوا اسکریپت امروزی بوده است به همین دلیل تمام عملیات های async (ناهمگام) یک promise را برمی گردانند. همچنین شما می توانید در هر قسمتی از برنامه خود از await استفاده کنید، آن هم بدون اینکه نیاز باشد آن را درون یک متد Async قرار بدهید:

try {
  const data = await Deno.readFile('readme.txt');
  // Handle the data
} catch (e) {
  // Handle the error
}

همچنین Deno.js سعی خود را کرده است که API مرورگرهای مختلف را در خود پیاده سازی کند. به طور مثال یک شیء سراسری window دارد (دقیقا مانند جاوا اسکریپت در مرورگرها). همچنین موارد دیگری مانند addEventListener و fetch را نیز در دسترس خود خواهید داشت. اگر می خواستیم در Node.js از چیزی مثل fetch استفاده کنیم به پکیج های اضافه نیاز پیدا می کردیم و یا مجبور می شدیم از polyfill استفاده کنیم.

همچنین همانطور که می دانید Node.js برای مدیریت پکیج های خود از NPM استفاده می کند و تمام این پکیج ها در package.json لیست می شوند. همچنین فایل های این پکیج ها در پوشه node_modules ذخیره می شود. این در حالی است که Deno به طور کل package manager ای ندارد و مستقیما از url ها برای وارد کردن پکیج های خودش استفاده می کند:

import { Response } from "https://deno.land/std@0.53.0/http/server.ts";

اولین باری که پروژه خود را اجرا می کنید تمام این پکیج ها دانلود و درون پروژه خودتان کامپایل می شود بنابراین در اجراهای بعدی از نسخه کش شده و کامپایل شده استفاده می شود که سرعت را بسیار زیاد می کند.

از تفاوت های دیگر بین این دو runtime می توان به Node.js اشاره کرد. همانطور که می دانید Node.js دسترسی کامل به شبکه و فایل های سرور را به دست می گیرد و به همین دلیل اگر از یک پکیج خارجی استفاده کنید که به نوعی مخرب باشد، مشکلات زیادی برایتان به وجود می آید. برای حل این مشکل Deno تمام کدها را درون یک sandbox (یک محیط ایزوله شده در سرور) اجرا می کند. به همین دلیل کدها به فایل ها و شبکه و غیره دسترسی ندارند مگر اینکه به طور صریح خودتان اجازه داده باشید. مثلا دستور زیر در Deno.js همین کار را برای فایلی به نام server.ts انجام می دهد:

# Allow script to make network requests
deno run --allow-net server.ts

علاوه بر این مسائل Deno.js به صورت پیش فرض قابلیت هایی اضافی نیز دارد که به شما کمک می کنند تجربه راحت تری در توسعه برنامه ها داشته باشید. این ابزار ها و قابلیت های اضافی عبارت اند از:

  • bundler: شما یک اسکریپت را مشخص می کنید و Deno آن اسکریپت را به همراه تمام وابستگی هایش در یک فایل قرار می دهد.
  • debugger: از این به بعد می توانید کدهای js خود را درون محیط های مختلفی مانند Chrome Devtools و VS Code و غیره اشکال زدایی کنید. البته Node.js نیز debugger خاص خودش را دارد.
  • dependency inspector: تمام وابستگی های پروژه شما را برایتان لیست می کند.
  • documentation generator: با استفاده از JSDoc annotations می تواند documentation یک فایل را نمایش بدهد.
  • formatter: هم کدهای جاوا اسکریپت و هم کدهای تایپ اسکریپت شما را فرمت می کند.
  • test runner: این ویژگی به شما کمک می کند که کدهای خود را راحت تر تست کنید.
  • linter: یک linter ساده را به شما می دهد که از نوشتن کدهای خطا جلوگیری می کند.

در نهایت سوالی که باقی می ماند این است که آیا Deno.js جایگزین Node.js می شود؟ در حال حاضر Deno یک تازه کار است و آینده اش مشخص نیست اما اگر در اینده موفق به انجام این کار شود نیز مدت زمان بسیار زیادی طول خواهد کشید و احتمالا Node.js به این سادگی ها جایگزین نخواهد شد.


منبع: سایت‌های Javascript Conference و Site Point

نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.