از گذشته تا امروز، انتخاب اول همهی توسعه دهندگان جاوا اسکریپت node.js بوده و هیچ رقیب شایستهای هم برای node.js وجود نداشته است. اما همه چیز از سخنرانی رایان دال، سازندهی اصلی node.js در سال 2018 تغییر کرد. دال در این سخنرانی محوریت صحبتهای خود را روی معایب و مشکلات node.js و بستههای npm قرار داد و 10 موردی که نمیپسندید را نام برد. سپس deno را معرفی کرد و هدف ساخت آن را رفع مشکلات بیان شدهی node.js بیان کرد. پس واضح است که deno قرار است ضعفهای node.js را برطرف سازد. شاید برایتان جالب باشد که هم deno و هم node از چهار حرف یکسان ساخته شدهاند. این شباهت علاوه بر اینکه به سازندهی یکسان آنها نیز اشاره میکند، گواهی بر این مورد است که در آیندهای نه چندان دور، شاید deno جایگزین node شود. پس توصیه میکنیم تا با node.js که فناوری اصلی این حوزه است نیز آشنا شوید. برای شروع میتوانید مقالهی "Node.js چیست و چه کاربردی دارد ؟" را مطالعه کنید. اگر به مباحث Node.js علاقهمندید پیشنهاد میکنیم به صفحه دوره آموزش node js سربزنید.
حال پس از دو سال، نسخهی اول Deno JS منتشر شده است. پس برای اینکه بدانید Deno JS چیست و چه مزایا و معایبی نسبت به node.js دارد، با ما همراه باشید.
Deno JS چیست ؟
Deno JS یک محیط زمان اجرا یا run time برای جاوا اسکریپت و تایپ اسکریپت است که بر پایهی موارد زیر توسعه پیدا کرده است:
موتور جاوا اسکریپت ورژن 8
زبان برنامه نویسی Rust ( بر خلاف node که با زبان ++C نوشته شده است. )
زبان برنامه نویسی تایپ اسکریپت
پلتفرم Tokio (با ایدهی زمان اجرای غیر همزمان)
زمان اجرای غیر همزمان یعنی برنامهی در حال اجرا، به چند بخش تقسیم میشود و این بخشها، موازی با یکدیگر وظایف خود را انجام میدهند. Deno در نقش مدیر، تضمین میکند که این عملیات بدون خطا انجام شود و در کار با بستهها و نصب و بروزرسانی آنها کمک میکند.
در بخشهای بعدی، deno و node را در زمینههای مختلف بررسی میکنیم.
هیچ پوشهی NPM یا نود ماژولی وجود ندارد!
اگر با node کار کرده باشید، میدانید که هنگام نصب یک پکیج، فایلهای جدید مربوط به آن در یک پوشه با نام نود ماژول (node module) قرار میگیرند. هر کتابخانهی مورد نیاز در برنامه باید در این پوشه قرار گیرد. در زمان اجرا نیز تمامی وابستگیهای لازم از این پوشه خوانده شده و باعث دردسرهای زیادی برای برنامه نویسان میشود، به خصوص افرادی که به صورت گروهی کار میکنند. یکی از مزایای deno، بهبود این سازوکار است.
Deno اجازه میدهد تا از هر جایی به ماژولهای خود دسترسی داشته باشید و براساس دایرکتوری آنها را فراخوانی کنید. پس دیگر نیازی به قراردادن همهی آنها در یک پوشه ندارید. توجه داشته باشید که هرچند این روش کار را بسیار راحت میکند، اما در صورت عدم کنترل و آدرسدهی نادرست توسط برنامه نویس، ممکن است باعث ایجاد خطاهای بسیاری شود. برای مثال میتوانید به راحتی و با دستور زیر، به کتابخانهی لاگ دسترسی داشته باشید:
export { assert } from "https://deno.land/std@v0.39.0/testing/asserts.ts";
export { green, bold } from "https://deno.land/std@v0.39.0/fmt/colors.ts";
مسلما با این روش، دیگر به فایل package.json که تمامی وابستگیهای پروژه در آن نوشته میشد، نیازی ندارید. در deno وابستگیها در فایلی با نام deps.ts فراخوانی میشوند. یک فایل deps.ts به طور معمول به صورت زیر است:
export { assert } from "https://deno.land/std@v0.39.0/testing/asserts.ts";
export { green, bold } from "https://deno.land/std@v0.39.0/fmt/colors.ts";
در این روش جدید، ماژولها دوباره اکسپورت میشوند و در صورت تغییر نسخهی هر کتابخانه کافی است آدرس را به همان ترتیب عوض کنید. همچنین کد در اولین باری که اسکریپت را اجرا کنید کش شده و تا زمانی که با دستور reload– آن را دوباره اجرا کنید، حفظ میشود.
امنیت در deno بیشتر است
به طور پیشفرض، Node.js به شما این امکان را میدهد که به همه چیز دسترسی داشته باشید. به این معنی که میتوانید هر چیزی را بخوانید و در فایلهای سیستمی بنویسید، درخواستهای مختلف ارسال کنید و متغیرهای محیطی را تغییر دهید. اگر چه برای یک توسعه دهنده این نوع دسترسی مفید است و کار را آسانتر میکند، اما اگر در هنگام نوشتن کد خود مراقب نباشید، خطر امنیتی شما را تهدید خواهد کرد.
یکی از مهمترین ویژگیهای deno، تمرکز آن بر امنیت است. برخلاف node ،deno به صورت پیشفرض کد را در یک sandbox اجرا میکند و در زمان اجرا هیچ گونه دسترسی به موارد زیر ندارد:
فایلهای سیستمی (file systems)
شبکه (network)
اجرای اسکریپتهای دیگر (Execution of other scripts)
متغیرهای محیطی (The environment variables)
همهی دسترسیهای مورد نیاز به دیسک و یا اینترنت باید به صراحت در اسکریپت آورده شود. برای مثال اگر بخواهید به پوشهی etc دسترسی داشته باشید، کافی است کد زیر را در اسکریپت خود بنویسید:
deno --allow-read=/etc myscript.ts
دستور بالا به شما اجازه میدهد که بتوانید در کد خود فایلهای پوشهی etc را بخوانید. برای دسترسی به مواردی به جز این پوشه، هشدار امنیتی دریافت خواهید کرد. این عمل مشابه کنترل دسترسی در سیستم عاملهای مختلف است. برای مثال در اندروید نیز باید اجازهی دسترسی به سیستمهای مختلف ( ارتباطات الکترونیکی، تماسهای تلفنی، پوشهها و غیره ) را درون گوشی فعال کنید.
Deno کتابخانههای کاملتری دارد
با اینکه جاوا اسکریپت استاندارد خود را نسبت به نسخههای اولیهی node بهبود داده است، اما هنوز هم دارای کتابخانههای کمتری در مقایسه با سایر زبانهای برنامه نویسی میباشد. deno تلاش میکند تا این کمبود را جبران کرده و ادعا میکند که کتابخانهی استاندارد کاملتری را ایجاد کرده است. این کتابخانهها به توسعه دهندگان اجازه میدهند تا از ابزارهای رسمی برای انجام وظایف خود استفاده کنند و فقط در صورت عملیات پیچیده به سراغ کتابخانههای خارجی بروند.
در deno کتابخانههایی وجود دارند که میتوان به کمک آنها، محیط ترمینال را شخصیسازی کرد و برای مثال، رنگ متن در آن را تغییر داد. علاوه بر این، توابعی برای کار با ساختمان دادههای خارجی مانند اکسل، کار با http و حتی سوکت نویسی نیز در نظر گرفته شده است.
تایپ اسکریپت یکپارچه سازی شده است
تایپ اسکریپت (typeScript) به عنوان Superset زبان جاوا اسکریپت ارائه شده و هدف آن کدنویسی آسان با کمترین میزان خطا و استفاده از ویژگیهای پیشرفتهی زبانهای شیگرا، جهت نوشتن برنامههای سمت سرور و سمت کاربر است. تایپ اسکریپت با کتابخانههای محبوب جاوا اسکریپت مانند ReactJS و JQuery سازگار است و پس از کامپایل، میتوانید اطمینان حاصل کنید که خروجی نهایی کد شما با انواع مرورگرها سازگار خواهد بود. در سالهای اخیر توسعه دهندگان زیادی علاقهمند به تایپ اسکریپت شده و در این حوزه فعالیت میکنند. برای آشنایی بیشتر با این زبان میتوانید مقالهی "تایپ اسکریپت چیست؟" را مطالعه کنید.
برخلاف node که همه چیز را به جاوا اسکریپت ترجمه میکند، deno اجازه میدهد تا از تایپ اسکریپت به صورت مستقیم استفاده کنید. علاوه بر آن، این امکان وجود دارد که برنامهها را به زبان جاوا اسکریپت نوشته و بدون هیچ مشکلی با deno اجرا کنید. چون deno به صورت پیشفرض دسترسیهای محدودی را در اختیار قرار میدهد، اما میتوانید با استفاده از فایل tsconfig.json، پیکربندی مخصوص خود را بنویسید. کافی است تا دستور زیر را بنویسید:
import * as log from "https://deno.land/std/log/mod.ts";
پیکربندی پیشفرض در Strict mode قرار دارد. این حالت در زمان انتشار ES5 ایجاد شده است و یک برنامه را به صورت دقیقتری بررسی میکند. پس هر نوع روش کدنویسی نادرستی منجر به دریافت هشدار خواهد شد.
سایر مزایای Deno JS چیست ؟
یکی از اهداف deno ایجاد سازگاری بیشتر برنامه با مرورگر است. برای مثال زمانی که از ES استفاده میکنید، دیگر نیازی به استفاده از ابزارهایی مانند webpack نیست و برنامه به صورت خودکار با مروگر sync میشود. علاوه بر آن، ابزارهایی مانند babel نیز وجود دارند که کد شما را به نسخههای ES5 تبدیل میکنند. همچنین میتوانید برنامهی خود را برای مرورگرهایی آماده کنید که از نسخههای جدید جاوا اسکریپت پشتیبانی نمیکنند. البته توجه داشته باشید که این کار باعث میشود که حجم کدهایی که قرار است بنویسید، افزایش پیدا کند.
علاوه بر مواردی که در بخشهای قبل توضیح دادیم، deno دارای مزایای دیگری نیز میباشد. برخی این مزایا عبارتند از:
linter: به پیداکردن مشکلات موجود در برنامه به شما کمک میکند.
تغییر فرمت خودکار: به صورت خودکار متن را به زبانهای جاوا اسکریپت و تایپ اسکریپت ترجمه میکند.
بررسی وابستگی: هنگام اجرای یک برنامه روی یک ماژول ES، تمام وابستگیهای موجود در یک درخت را لیست خواهد کرد.
bundler: یک اسکریپت مشخص و وابستگیهای آن را به یک فایل واحد تبدیل میکند.
اجراکنندهی تست (test runner): میتوانید از این تکنیک برای تست کد جاوا اسکریپت یا کد تایپ اسکریپت و ارتباط بین کتابخانهها استفاده کنید.
دیباگر (debugger): اجازه میدهد تا برنامههای deno با کروم، ویژوال استودیو کد و دیگر ابزارها دیباگ شود.
file watcher: فایلها و پوشهها را در جستجوی تغییرات بررسی میکند و اگر فایلی نیاز به آپدیت داشت، به شما اطلاع میدهد.
برخی از این ابزارها APIهایی هستند که از سوی زبان ارائه میشوند و شما باید با کدنویسی از آنها استفاده کنید. برای نمونه API زیر توسط یکی از کاربران گیت هاب در repository خود، به عنوان یک file watcher نوشته شده است که از Deno.watchFs استفاده میکند:
function startProcess(args: string[] = []): Deno.Process {
return Deno.run({ cmd: ['deno', 'run', ...args] });
}
const throttle = 500;
let app: Deno.Process = startProcess(Deno.args);
let timeout: number|null = null;
function runApp() {
app && app.close();
app = startProcess(Deno.args);
}
for await (const event of Deno.watchFs('.')) {
if (event.kind !== "access") {
if (timeout) clearTimeout(timeout);
timeout = setTimeout(runApp, throttle);
}
}
نصب و شروع کار با deno
برای درک بهتر اینکه Deno JS چیست ، بهتر است آن را نصب کرده تا بتوانید با آن کار کنید. برای نصب deno در سیستم عاملهای مختلف میتوانید از دستورات زیر استفاده کنید:
بعد از نصب deno، برای اجرای یک برنامهی ساده کافی است دستور زیر را تایپ کنید:
deno run https://deno.land/std/examples/welcome.ts
// Or a more complex one:
import { serve } from "https://deno.land/std@0.74.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("https://localhost:8000/");
for await (const req of s) {
req.respond({ body: "Hello World\n" });
}
در صورت بروز مشکل حتما صفحهی deno را در گیت هاب مطالعه کنید. این صفحه توسط توسعه دهندگان deno مدیریت میشود و تنظیمات مربوط به deno در آن قرار میگیرد. همچنین میتوانید مستندات زمان اجرای deno را در doc.deno.land پیدا کنید. این مستندات همانند یک کتابچهی راهنما، توضیحات بیشتری در مورد عملکردهای پیچیدهی زمان اجرا میدهد، در مورد مفاهیم مورد استفاده در deno توضیح میدهد و روند کدنویسی با استفاده از deno و اجرای برنامه با Rust را مشخص میکند. این راهنما همچنین حاوی اطلاعاتی در مورد ابزارهایی است که deno فراهم میکند.
جمعبندی
در این مقاله آموختیم که Deno JS چیست و چه تفاوتهایی با node دارد. Deno یک جایگزین مناسب برای node است، چرا که با هدف رفع نواقص موجود در node طراحی شده است. در این زمانی که در حال نوشتن این مقاله هستیم، مدت زیادی از انتشار deno نگذشته است و هنوز کتابخانههای زیادی در node وجود دارد که در deno استاندارد نشدهاند. بنابراین شاید بهتر باشد تا منتظر نسخههای بعدی آن بمانیم. برای مشاهدهی سخنرانی رایان دال میتوانید از این لینک استفاده کنید. اگر در مورد deno سوال یا تجربهای دارید، آن را در بخش نظرات با ما و سایر کاربران سون لرن به اشتراک بگذارید.
اگر به یادگیری بیشتر در زمینه جاوا اسکریپت علاقه داری، با شرکت در دوره آموزش جاوا اسکریپت در کمتر از یک سال به یک متخصص JS همه فن حریف تبدیل میشوی که آمادهی استخدام، دریافت پروژه و یا فول-استک شدن هستی.
۷ دیدگاه
۰۲ دی ۱۴۰۰، ۱۳:۴۲
ممنون بابت این مقاله. به نظرتون یادگیری node دیگه خوب نیست؟ یعنی بهتره از همون ابتدا بریم سراغ deno؟
نازنین کریمی مقدم۰۴ دی ۱۴۰۰، ۰۶:۳۱
درود ممنون که با ما همراه هستید
حقیقتا به شخصه هردو رو توصیه میکنم، بخصوص معمولا آشنایی با نود برای استخدام به کار میاد.
مهدی نیسی۰۹ آبان ۱۳۹۹، ۰۷:۳۷
عالی بود، خیلی ممنون ?
امیدوارم در آینده آموزش deno رو هم قرار بدید.
نازنین کریمی مقدم۰۹ آبان ۱۳۹۹، ۱۵:۰۴
سلام. آموزش deno در لیست مقالات درخواستی شما کاربران عزیز هست و انشالله در یک فرصت مناسب نگارشش رو استارت میزنم :)
امیر۰۸ آبان ۱۳۹۹، ۱۶:۲۹
چرا به عنوان یه نسخه جدید از نود منتشر نشد؟
ممنون
نازنین کریمی مقدم۰۹ آبان ۱۳۹۹، ۱۵:۰۷
درود.
چون نوع پیاده سازی node، این اجازه رو به توسعه دهندگان نمیداد که صرفا با تغییر کد مشکلات موجود رو حل کنند. برای همین از اول به شیوه دلخواه و مناسب پیاده سازی شد و بر همین اساس، تصمیم گرفتند که نامش رو هم deno بگذارند.