Deno چیست و آیا جایگزین NodeJS خواهد شد؟
Deno نسخه 1.0.0 اخیراً منتشر شده است. در این مقاله به بررسی این محیط زمان اجرای جاوا اسکریپت میپردازیم و به سؤال Deno چیست پاسخ میدهیم. همچنین به بررسی مزیتهای آن نسبت به Node.js پرداخته و این دو را مقایسه خواهیم کرد. پاسخ کوتاه به سؤال عنوان این مقاله آن است که برای صحبت در مورد جایگزینی Deno به جای NodeJS هنوز خیلی زود است. اما برخی شواهد وجود دارند که برای تصمیمگیری در خصوص پاسخ این سؤال نقشی تعیینکننده دارند.
برای افرادی که نمیدانند Deno چیست باید بگوییم که Deno از سوی «رایان دال» (Ryan Dahl) ساخته شده است که خالق NodeJS نیز است. البته این بدان معنی نیست که Deno به صورت خودکار به عنوان جایگزین NodeJS مطرح میشود.
Deno چیست ؟
در سال 2018 رایان یک سخنرانی کرد که در آن به 10 چیزی اشاره کرد که در مورد Node.js اشتباه است و در انتهای ارائه خود Deno را معرفی کرد. Deno در آن زمان صرفاً یک پروژه کوچک بود که رایان مشغول ساختش بود و آن را Node.js نسخه 2 مینامید که موجب بهبود و امنتر شدن آن میشود.
اینک پس از سپری شدن دو سال شاهد عرضه نسخه Deno 1.0 هستیم که به صورت رسمی منتشر شده است. این محیط زمان اجرای جدید جاوا اسکریپت برای بکاند عرضه شده است، اما به جای این که با C++ نوشته شود با rust و بر مبنای پلتفرم Tokio (https://tokio.rs/) نوشته شده است که محیط زمان اجرای ناهمگام مورد نیاز جاوا اسکریپت را تأمین میکند و با این حال همچنان روی موتور V8 گوگل اجرا میشود.
Deno چه امکانات جدیدی دارد؟
وقتی از Deno صحبت میکنیم نهتنها از یک محیط زمان اجرای جدید جاوا اسکریپت صحبت میکنیم که کاملاً با Node.js سازگار است، بلکه رایان از این فرصت استفاده کرده و برخی چیزها را در Deno جای داده است که جای خالی آنها در Node.js دیده میشد.
امنیت یکپارچه در Deno
Node.js به صورت پیشفرض امکان دسترسی به همه چیز را میدهد، یعنی میتوانید در filesystem بخوانید و بنویسید، درخواستهای خروجی ارسال کنید، به متغیرهای محیطی دسترسی داشته باشید و غیره. با این که به عنوانی توسعهدهنده داشتن این نوع دسترسی بسیار سودمند است، اما این وضعیت موجب میشود در صورت عدم توجه کافی برخی ریسکهای امنیتی پدید آیند.
بنابراین به جای این وضعیت، Deno از آرگومانهای خط فرمان برای فعالسازی یا غیر فعالسازی دسترسی به قابلیتهای مختلف امنیتی استفاده میکند. بنابراین اگر لازم باشد که اسکریپت شما بتواند به پوشه /etc دسترسی داشته باشد، به این صورت عمل میکنیم:
deno --allow-read=/etc myscript.ts
دستور فوق به کد شما امکان میدهد که از این پوشه بخواند و هر چیزی جز آن یک استثنای امنیتی ارائه میکند. این روش شبیه پلتفرمهای دیگر است که امنیت را مدیریت میکنند. اگر کاربر اندروید باشید، احتمالاً دیدهاید که پیش از این که اپلیکیشنی بتواند به سیستمهای مختلف درون گوشی دسترسی یابد از شما سؤال میشود. همین مفهوم در اینجا نیز مصداق دارد. با استفاده از این فلگها به عنوان بخشی از خط فرمان که اسکریپت را اجرا میکند، میتوانید دسترسیهای مختلف مورد نیاز کد را تأمین کنید.
کتابخانه استاندارد کاملتر در Deno
جاوا اسکریپت نسبت به نسخه اول Node کتابخانه استاندارد خود را به میزان زیادی بهبود بخشیده است، اما در قیاس با زبانهای دیگر همچنان بسیار عقب است. Deno تلاش کرده است تا کتابخانه استاندارد کاملی عرضه کند که به توسعهدهندگان امکان میدهد تا از ابزارهای رسمی برای کارهای ابتدایی استفاده کنند و تنها برای کارهای پیچیده از کتابخانههای اکسترنال (از طریق NPM) استفاده کنند.
Deno به صورت آماده مجهز به ابزارهایی است که به متن ترمینال رنگ میدهند، میتوان با ساختمانهای داده اکسترنال (مانند باینری، CSV ،YAML و غیره) کار کرد، UUID-ها را تولید کرد و حتی وبسوکت نوشت. برخی ماژولهای ابتدایی دیگر مانند دسترسی به سیستم فایل، تابعهای کمکی دادهها، تابعهای مرتبط با http و موارد دیگر نیز وجود دارند.
یکپارچهسازی تایپ اسکریپت
اگر یکی از طرفداران تایپ اسکریپت باشید، از شنیدن این خبر که Deno اینک از این زبان پشتیبانی میکند و نیازی به استفاده از ابزارهای خارجی ندارید خوشحال میشوید. کد تایپ اسکریپت در Deno به صورت داخلی به جاوا اسکریپت ترجمه میشود و دیگر لازم نیست در این مورد نگرانی داشته باشید.
با این که Deno به صورت پیشفرض از موارد زیادی مراقبت میکند، اما شما میتوانید پیکربندی را با استفاده از فایل tsconfig.json خودتان بازنویسی کنید:
deno run -c tsconfig.json [your-script.ts]
پیکربندی پیشفرض از حالت Strict استفاده میکند، بنابراین هم رویههای کدنویسی نادرست بیدرنگ هشدار دریافت میکنند.
دیگر نیازی به NPM یا node_modules ندارید
این یکی از مشکلات عمده محسوب میشد و Deno تصمیم گرفته است آن را به طور کامل حل کند. بدین ترتیب Deno برای مدیریت وابستگیها به شما اجازه میدهد ماژولها را از هر کجا require کنید. به بیان دیگر میتوانید کدی مانند زیر بنویسید:
import * as log from "https://deno.land/std/log/mod.ts";
دیگر لازم نیست از ریپازیتوری متمرکز خاص خود استفاده کنید، اما باید در مورد این رویه هوشیار باشید چون ایمپورت کردن ماژولها از منابع شخص ثالث که روی آنها کنترل ندارید، ممکن است شما را در معرض ریسکهای مختلفی قرار دهد.
در واقع دیگر نیازی به یار قدیمیمان package.json نیز نخواهیم داشت و مدیریت وابستگی اینک با داشتن یک فهرست از ماژولها و URL-های متناظر که از فایلی به نام deps.ts فراخوانی میشوند بسیار تسهیل شده است. در مورد نسخهبندی نیز میتوانید نسخه وابستگیها را در URL بیان کنید که گرچه راه مناسبی محسوب نمیشود، اما به هر حال کار میکند. یک فایل 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";
به این ترتیب ماژولها دوباره اکسپورت میشوند و در صورتی که بخواهید نسخهشان را تغییر دهید کافی است URL را به همان ترتیب عوض کنید. کد ایمپورت شده در نخستین باری که اسکریپت را اجرا کنید کش میشود و تا زمانی که با دستور فلگ reload– آن را اجرا کنید این کش حفظ میشود.
نکات دیگر در مورد مزایای Deno
Deno قابلیتهای دیگری نیز مانند ابزارهای آماده بهتر و چیزهایی مانند اجراکننده تست، دیباگر، file watcher و موارد دیگر دارد. اما برخی از این ابزارها صرفاً API-هایی هستند که از سوی زبان ارائه میشوند و باید کد خاص خود را بنویسید تا بتوانید از آنها استفاده کنید.
برای نمونه API زیر را به عنوان یک file watcher در نظر بگیرید که از سوی Deno.watchFs عرضه شده است. اگر به دنبال یک راهحل کوتاهتر برای nodemon هستید در این صورت باید خودتان آن را بسازید. این اسکریپت 23 خط دارد و مشکل مشابهی را حل میکند:
کاربری به نام Caesar2011 این اسکریپت را به عنوان بخشی از ریپوی خودش (+) منتشر کرده است.
آیا Deno به زودی جایگزین Node.js خواهد شد؟
اگر بخواهیم صادقانه پاسخ بدهیم نه چنین نیست. برخی از ما از Node.js از زمانی که هنوز نسخه 0.10 داشت استفاده میکردیم و در محیط پروداکشن آن را به خدمت گرفتهایم. گفتن این جمله کار راحتی نیست، اما دلیل استفاده از Node.js در آن زمان این بوده که مشابهی نداشته است. نه PHP و نه پایتون یا حتی Ruby را نمیتوان با جاوا اسکریپت و یک مدل ناهمگام I/O در بکاند مقایسه کرد. در همه این سالها Node و جاوا اسکریپت طوری تکامل یافتهاند که الزامات این صنعت را برآورده سازند. با این که هنوز کامل محسوب نمیشوند، اما مانند هر چیز دیگری در زندگی در مورد زبانهای برنامهنویسی نیز هیچ چیز کاملی وجود ندارد.
Deno نیز تفاوتی ندارد و در حال حاضر صرفاً حاصل دو سال کار روی یک ایده است. این محیط زمان اجرا هنوز تست نشده است و در سیستمهای پروداکشن مورد استفاده قرار نگرفته است. Deno هنوز مورد بررسی عملی قرار نگرفته است و در موقعیتهای عجیب و ناخواسته قرار نگرفته است تا شرایط مدیریت اوضاع مرزی از سوی آن بررسی شود. تا زمانی که این اتفاق نیفتد صرفاً یک اسباببازی برای استفادهکنندگان زودهنگام است تا با آن بازی کنند. شاید تا یک سال دیگر شروع به شنیدن این بکنیم که برخی شرکتها تجربیات خود را در مورد استفاده از Deno به اشتراک میگذارند، این که چطور مشکلات جدید خود را حل کردهاند و در نهایت جامعه مسئول توسعه Deno، آن را به مرحلهای برساند که مفید باشد. آیا در آن صورت جایگزین Node خواهد شد؟ کسی نمیداند باید صبر بکنیم تا ببینیم چه پیش میآید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای JavaScript (جاوا اسکریپت)
- آموزش JavaScript ES6 (جاوا اسکریپت)
- مجموعه آموزشهای برنامهنویسی
- ۱۱ کتابخانه جاوا اسکریپت برای سال ۲۰۱۹ — راهنمای کاربردی
- آموزش جاوا اسکریپت — مجموعه مقالات جامع وبلاگ فرادرس
==