سلام دینو | Hello Deno

سلام دینو | Hello Denoسلام خدمت شما عزیزای دلی که دارین این مقاله رو میخونین.من ، علی حسنی ، بعد از چندین ماه Full Time وقت گذاشتن روی پروژه دینو ، اینجام تا باهاتون در موردش یه گپ فنی خودمونی تقریبا طولانی ای بزنم.خودتونو آماده کنید که قراره از این به بعد یکی از بزرگترین تغییرات زندگیِ برنامه نویسیتون رو انجام بدین و از Node قدیم به Deno جدید مهاجرت کنید .Deno چیه ؟یدونه Runtime Environment جدید برای Javascript و همینطور Typescript که هسته ی اون توسط زبان برنامه نویسی Rust { که خیلی خفنه } نوشته شده .دینو ؟ مگه دنو نیست ؟خب واقعیتش اینه که دنو بود ، ولی دینو شد ؛Ryan Dahl سازنده Deno تقریبا یه سال بعد از اولین کامیت توی گیتهابِ دینو تصمیم گرفت که بخاطر اینکه دینو بیشتر شبیه تلفظ کلمه دایناسور بشه اون رو دینو تلفظ کنه ؛پس شما هم از این به بعد همین کارو بکنید و اون رو « دیــــنو » تلفظ کنید ، با تشکر !چرا Deno ؟قطعا این اولین سوال و البته مهمترین سوالیه که باید همین اول کار از خودمون بپرسیم .دینو اومده تا تغییری توی دنیای Javascript سرور-ساید ایجاد کنه ؛اومده تا اونو امن تر ، سریع تر ، نزدیک تر به استاندارد ها و صد البته مدرن تر بکنه !امن ؟ با ایجاد sandbox و permission ها به صورت پیش فرض روی برنامه .سریع تر ؟ دینو روی Rust و Tokio سوار شده و قاعدتا نباید از C++ و Libuv برتری خاصی توی سرعت داشته باشه اما از اونجایی که هدف خیلی از module های دینو Native بودن روی سیستم عامل شماست قطعا تفاوت سرعت بسیار زیادی رو در مقایسه با node شاهد خواهید بود ( یعنی چیزی حدود همون پرفورمنسی که خود Rust ارائه میده ) .مدرن تر ؟ خب معلومه ، standard library نود ، هنوز callback base هست و تنها راه مدرن کردن اونا استفاده از promisify هستش که خب در مقایسه با دینو که به صورت پیشفرض promise base هست حرفی برای گفتن نداره و در مورد Web api ها Node در مقابل Deno حرفای زیادی برای گفتن نداره . نزدیک تر به استاندارد ها ؟ خب deno مجبور نیست Backward Compatiblity داشته باشه ، یعنی لازم نیست با نسخه های قبلی خودش سازگار باشه چون اصلا نسخه ی قبلی ای نداره و تا جایی که ممکنه از استاندارد های وب مثل fetch , top level await , es modules و ... استفاده کرده که خب میتونه شما رو به نزدیک ترین حالت تطابق با وب برسونه .امروز اما ( یعنی روزی که من دارم این مقاله رو مینویسم ) به تاریخ may 13,2020 موعد رسمی انتشار نسخه 1.0.0 دینو هستش و قطعا راه بسیار بسیار طولانی ای رو در پی داره تا بتونه یه اکوسیستم به بزرگی node برای خودش درست کنه .[ اگر به خوندن موارد غیر فنی علاقه ندارید ( پیشنهاد میکنم داشته باشید ) میتونید بخش اکوسیستم رو نادیده بگیرید و از بخش فنی ادامه بدید ... ]اکوسیستم : وقتی در مورد اکوسیستم یه تکنولوژی صحبت میکنیم ، موارد خیلی زیادی مد نظر ما هست و از تعداد دولوپر هایی که روی پروژه کار میکنن گرفته تا تعداد سوالاتی که توی stackoverflow پرسیده شده جزء اکوسیستم اون تکنولوژی به حساب میان ؛چنتا از موارد خیلی مهم توی اکوسیستم رو لیست میکنم این پایین که هرچقد تعداد و نرخ این موارد بیشتر باشه به نفع اون تکنولوژیو کاربرانش هست : • برنامه نویس هایی که با اون پروژه یا روی اون پروژه در حال کار کردن هستن .• تعداد سوالاتی که توی جاهایی مثل reddit , stackoverflow , quora پرسیده و پاسخ داده شده .• تعداد ماژول ها ، پکیج ها ، فریمورک ها ، کتابخونه ها و ابزارهایی که برای اون تکنولوژی وجود داره .• مقالات ، ویدیو ها ، پادکست ها و کلا آموزش های مربوط به اون تکنولوژی .• تعداد شغل ها یا موقعیت های شغلی که توی زمینه اون تکنولوژی فعال هستن .• محبوبیت عمومی پروژهاکوسیستم کنونی Denoتیم اصلی دینودر حال حاضر روی پروژه دنو 279 برنامه نویس در حال کار کردن هستن که لیستشون رو اینجا میتونید ببینید.طبق انتظار نفر اول لیست Ryan Dahl سازنده دینو که خب سازنده Node.js هم هستن ایشون و قطعا همتون حداقل یک بار اسم ایشون به گوشتون خورده و نیازی به معرفی نداره ، ایشون برای پروژه دینو از کارش استعفا داده تا تمام وقت روی این پروژه بزرگ بتونه کار کنه .نفر سوم که شریک و همراه اصلی Ry بوده آقای Bert Belder که اتفاقا توی پروژه Node هم از اصلی ترین اعضای تیم بوده و سابقه کار توی شرکت هایی مثل IBM رو داره و از بنیان گذارای اصلی Libuv بوده ( هسته اصلی مدیریت عملیاتِ asynchronous توی node.js ) . نفر دوم ولی آقای Bartek Iwańczuk برنامه نویس لهستانی Rust و Ts که یه توفیق اجباری برای تیم دینو به حساب میاد و از اوایل کار با Ry و Bert همراه شده و طی این مدتی که باهاش آشنا شدم متوجه شدم که قطعا این آقا یکی از بزرگان عرصه برنامه نویسای آینده خواهد بود و اگه مثل من به کامیونیتی ها و دنبال کردن انسان های با استعداد این عرصه علاقه مند باشید قطعا اسم ایشون از این به بعد زیاد به گوش شما میخوره .کسای دیگه هم مثل Kitson Kelly ، Kevin Kassimo ، Nayeem Rahman و ... هستن که اگه PR های دینو رو دنبال کنید میفهمید با چه انسان های با استعدادی روبرو هستید توی تیم دینو .کلا هدفم از نوشتن این لیست این بوده که بهتون بگم ، چند نفر اصلیِ تیم هسته Deno آدمای خیلی خیلی با تجربه و با استعدادین و دینو زیر دست همچین آدمای خفنی داره رشد پیدا میکنه و شما میتونید مطمئن باشید با دنبال کردنِ راهِ دینو ، آینده ی تاریکی رو به هیچ عنوان تجربه نخواهید کرد.{ البته این جانب علی حسنی هم دست کوچیکی توی Deno داشتم و یه چنتایی کامیت رو میتونید از بنده توی لیست کامیت های repo ببینید، در حال حاضر نفر 22 لیست هستم و بهتون بگم که مشارکت توی پروژه ای مثل دینو کنار همچین آدمای بزرگی قطعا یکی از مهترین و بهترین تجربه های یه برنامه نویس میتونه باشه }ابزار کار با دینوبرای کار کردن و اجرای پروژه هاتون با دینو شما نیاز به ابزار خاصی ندارید ، صرفا دینو رو نصب میکنید و بسیاری از امکانات لازمه رو توی صرفا یک Executable File به دست میارید.اما برای هماهنگی بیشتر با محیط هایی مثل Vs Code تیم دینو به طور رسمی روی پلاگینی داره کار میکنه که کاملا با آخرین type های deno سازگار باشه و شما بدون محدودیت بتونید روی vscode کدِ دینو بنویسید.- ابزار دیگه ؟ پکیج منیجر dpm ؟ compiler برای typescript ؟ ابزار تست ؟+ اصلا حرفشو نزنید ، هیچی لازم نداره ، همه چی توی همون یک فایل اصلی خلاصه شده که در موردش صحبت میکنیم .کامیونیتیتیم دنو و برنامه نویس هایی که دارن روی پروژه کار میکنن همگی توی دیسکورد و توی این کانال فعال هستن و میتونید سوالاتتون ، اشکالات یا نقد هاتون رو اونجا با تیم اصلی و مابقی اعضا در میون بذارید .در مورد وب سایت های دیگه مثل stackoverflow و reddit ، طبق انتظار خیلی خیلی محدود هستن و هنوز طیف بزرگی از برنامه نویس ها به اون سمت کشیده نشدنتوی StackOverFlowبرای مثال نتیجه جستجوی برای کلمه Deno در حال حاضر 263 نتیجهدر مقایسه با نتیجه جستجو برای کلمه Node.js که در حال حاضر 327,029 نتیجه دارهیا توی redditکامیونیتی Node حدود 159 هزار نفر عضو دارهکامیونیتی Deno چیزی حدود 1.4 هزار نفر عضو !{ با حالی ویران و خراب محل مقایسه را ترک میکند }اما خب چیزی که مشخص هست ، وقتی من دارم این آمار رو منتشر میکنم که هنوز نسخه 1 هم ارائه نشده ( چند ساعت دیگه میشه ) و نباید انتظار داشت کامیونیتی ای مثل Node داشته باشه که از سال 2009 فعاله و الان نسخه 14 خودش رو داره عرضه میکنه !!اما در مورد Github قضیه فرق میکنه؛پروژه Node بعد از گذشتن حدودا 11 سال از تاریخ نسخه یکش نزدیک به 70k ستاره توی گیت هاب دارهولی پروژه Deno قبل از ارائه حتی نسخه 1 نزدیک به 51k ستاره !دینو 1.5k دنبال کننده یا اصطلاحا watcher داره و Node چیزی نزدیک به 3k .ستاره توی گیتهاب چیز مهمیه ؟قطعا هست !نه به اون مهمی که اگر پروژه ای ستاره نداشت دورش بندازیم ( مثل پروژه SWC که واقعا بهش ظلم داره میشه در مقابل Babel )اما دقیقا به همین مهمی که اگر پروژه ای star بیشتری داشت ، یعنی چشم افراد خیلی بیشتری بهش هست و شما میتونید روی تک تک اونا برای پرسیدن سوال توی stackoverflow ، توی اضافه کردن یه فیچر به پروژه ، توی رفع کردن یه باگ توی پروژه و خیلی چیزای دیگه حساب ببرید ؛پس مطمئن باشید کامیونیتی بسیار عظیمی در انتظار Deno هست و مشکلاتی که چند سانتی‌متر بالاتر نوشتم در مورد مقایسه کامیونیتی ،به زودی قابل حل شدن هستن.موقعیت های شغلیقاعدتا ، فعلا هیچ !چرا هیچ ؟ چون هیچ شرکتی برای استخدام نیروی جدید نمیتونه برنامه نویس Deno استخدام کنه و دلیلش هم اینه که اصلا برنامه نویس دینویی وجود نداره چون اصلا نسخه پایداری از دینو ارائه هم نشده !پس اصلا تعجب نکنید و این رو نقطه منفی به حساب نیارید و اتفاقا به چشم یه نقطه عطف و شانس توی زندگی برنامه نویسیتون بهش نگاه کنید .چرا شانس و نقطه عطف ؟اگر الان سال 2009 بود و شما پروژه Node نسخه 1 رو میشناختید ، کار باهاش رو بلد بودید و نسخه به نسخه باهاش جلو میومدید توی سال 2010 یا 2011 به نظرتون کجاها میتونستید کار پیدا کنید ؟قطعا بخاطر ترند شدنش میتونستید توی شرکت های بزرگ دنیای تکنولوژی کار پیدا کنید و چون برنامه نویس های کمتری هم سمت اون رفته بودن شانس شما برای پیدا کردن کار چندین برابر بود اما در حال حاضر شما این شانس رو توی سال 2020 برای بازار کار node ندارید و تنها شانس مجدد شما جلوی روتونه ، دینو ؛)« پس آینده نگر باشید ، به آدم های با تجربه تر اعتماد کنید و راهشون رو پیش بگیرید تا موفق باشید »خب ، بریم سراغ بحث های فنی ...شروع کار با دینونصبیه خبر بی نظیر !دینو فقط و فقط یه فایل executable هستش و همیشه هم همینطور باقی میمونه ؛یعنی شما برای اجرای دینو فقط و فقط نیاز به دانلود یک فایل دارید و اون فایل هم با توجه به سیستم عاملتون میتونه از منابع رسمی دینو دانلود و استفاده بشه .( مواردی که پایین مینویسم عینا از اینجا کپی میشه )نصب با bash : curl -fsSL https://deno.land/x/install/install.sh | shنصب با powershell : iwr https://deno.land/x/install/install.ps1 -useb | iexنصب یک نسخه خاص :با Shell : curl -fsSL https://deno.land/x/install/install.sh | sh -s v0.38.0با PowerShell : iwr https://deno.land/x/install/install.ps1 -useb -outf install.ps1; .\install.ps1 v0.38.0نصب با package manager ها :scoop : scoop install denohomebrew : brew install denoChocolatey choco install denoو اگر میخواید چند نسخه رو روی سیستمتون داشته باشید و به راحتی بینشون سوییچ کنید میتونید از ابزار asdf استفاده کنید :نصب : asdf plugin-add deno https://github.com/asdf-community/asdf-deno.git asdf install deno 0.38.0 فعال کردن روی کل سیستم : asdf global deno 0.38.0 فعال کردن صرفا برای پوشه ای که پروژه توش هست : asdf local deno 0.38.0بعد از نصب دینو ، حالا میتونیم از کامند deno توی هر محیط ترمینالی استفاده کنیمبرای اطمینان از نصب، کامند زیر رو اجرا کنید :> deno --version deno 1.0.0-rc3 v8 8.4.300 typescript 3.8.3خب اگه نسخه نصب شده دینو رو دیدین یعنی دینو با موفقیت نصب شده و اگر با خطایی مواجه شدید ، یعنی یکی از مراحل نصب ( که در واقع فقط یکیه ) رو اشتباه انجام دادید پس برگردید و دوباره انجامش بدید .اجرای اولین برنامهبریم برای اولین پروژه خودمون با Deno.یه فایل ایجاد میکنیم و توش فقط یه خط کد مینویسیم :// index.ts console.log(&quotWelcome to Deno ?&quot);و بعد با اجرای دستور زیر اون برنامه رو اجرا میکنیم :> deno run index.ts Compile file:///C:/Users/Ali/Desktop/index.ts Welcome to Deno ?وقتی دستور بالا رو اجرا میکنیم ، ما 2 خط خروجی رو میبینیم که خب خط دوم قاعدتا خروجی برنامه ما و خط اول یعنی اونجایی که نوشته compile رو میخوام یه توضیح کوچیکی بدم :- چی رو کامپایل میکنه دقیقا ؟+ تایپ اسکریپت رو ، یعنی وقتی ما فایل رو با پسوند .ts اجرا میکنیم دینو به صورت اتوماتیک اون رو برای ما کامپایل و با موتور v8 و rust اجرا میکنه . این یه مزیت بینظیره که دینو به ما میده ، یعنی اجرای مستقیم کدهای TS بدون نیاز به هیچ ابزار جانبی دیگه ای .حالا اگر همون فایل رو با پسوند .js ذخیره میکردیم این عملیات کامپایل صورت نمیگرفت و قاعدتا سرعت اجرای برنامه ما هم بیشتر میشد .یه خبر بی نظیر دیگه !دینو از یه قابلیتی توی v8 به اسم Snapshot استفاده میکنه که این قابلیت باعث میشه سرعت اول اجرای برنامه ما با سرعت اجرای دفعال بعدی زمین تا آسمون فرق کنه ؛- چطور ؟شما دفعه اولی که deno run رو اجرا میکنید ، عملیات کامپایل به جاوااسکریپت رو انجام میدید و از دفعه های بعدی اگر تغییری توی کد نداده باشید دینو این رو تشخیص میده و دیگه از ابتدا برای شما کامپایل نمیکنه و کدی رو برای شما اجرا میکنه که دفعه ی قبلی کامپایل کرده و یه shot ازش توی v8 گرفتهاگر دستور زیر رو اجرا کنید :> deno info index.ts local: C:\Users\Ali\Desktop\index.ts type: TypeScript compiled: C:\Users\Ali\AppData\Local\deno\gen\file\C\Users\Ali\Desktop\index.ts.js map: C:\Users\Ali\AppData\Local\deno\gen\file\C\Users\Ali\Desktop\index.ts.js.map deps: file:///C:/Users/Ali/Desktop/index.tsمیبینید که اطلاعاتی در مورد اون فایل بهتون میده و compiled نسخه جاوااسکریپتی همون فایلتون هست که توی مسیر خاصی ذخیره شده و دفعات بعدی ( که کدتون بدون تغییر مونده ) از همون برای اجرا استفاده میکنه پس سرعت توی لود اول و دوم بسیار فرق خواهد کرد و این توی اجراهای زمان دار برنامه روی سرور نکته بسیار مهمیه .البته ، یه راه خیلی باحالِ دیگه برای اجرای کد دینو هم وجود دارهاجرای کد ها به صورت ریموت روی یه سرور ابری ، برای مثال :> deno run https://deno.land/std/examples/welcome.ts Compile https://deno.land/std/examples/welcome.ts Welcome to Deno ?یعنی دقیقا همون نتیجه ای رو گرفتید که به صورت local میگرفتید و این یعنی حتی برای بعضی از کارها نیاز به جابجایی فایل بین سرور و سرور دیگه یا لوکال یا سرور رو هم ندارید .امنیت دینودینو به صورت پیش فرض ، داخل یک sandbox یا به اصطلاح یک جعبه محدودِ بدون اجازه دسترسی ، اجرا میشهیعنی چی ؟یعنی ما وقتی یه برنامه دینو رو اجرا کنیم ، فقط و فقط به کد های خود برنامه دسترسی داریم و نمیتونیم با سیستم عامل ، فایل سیستم ، نتورک و ... ارتباطی برقرار کنیم مگر اینکه به طور صریح این اجازه رو به برنامه بدیممثلا ما میخوایم یه برنامه بنویسیم که یک فایل رو از هارد بخونه ، کد ما این شکلی میشه ://index.ts Deno.open(&quot./tmp/file.txt&quot);حالا اگه deno run رو اجرا کنیم با خطایی مواجه میشیم که به ما میگه ما اجازه دسترسی به فایل مورد نظر رو نداریم و خب این قابلیت از نظر امنیتی کاملا برنامه مارو از داشتن hole یا حفره امنیتی در امان نگه میداره .error: Uncaught PermissionDenied: read access to &quotC:\Users\Ali\Desktop\tmp\file.txt&quot, run again with the --allow-read flag at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11) at Object.sendAsync ($deno$/ops/dispatch_json.ts:98:10) at async Object.open ($deno$/files.ts:37:15)همونطور که توی متن خطا هم نوشته شده ، برای اجرای این کد نیازه که ما دسترسیِ خوندن رو به این برنامه بدیم که این کار با flag روبرو قابل قابل انجامه : --allow-readیعنی برای اجرای برنامه ما باید این دستور رو بنویسیم :deno run --allow-read index.tsکه خب میبینید که برنامه ( در صورت وجود داشتن اون فایل file.txt ) بدون مشکل اجرا میشه.به همین سادگی ما امنیت رو به دست آوردیم ، تبریک میگم ؛البته شاید براتون سوال بشه خب الان به کل فایل سیستم برای خوندن دسترسی داریم که دوباره ، پس چطور ممکنه تضمین کنیم این برنامه به جاهای دیگه ی سیستم نفوذ نمیکنه ؟با پاس دادن مقدار به flag ، یعنی به این شکل :deno run --allow-read=tmp/ index.tsالان این برنامه صرفا به پوشه tmp در root پروژه دسترسی داره ، همین ؛)امکانات داخلی دینوبیاید یه دور تقریبا بزرگ توی cli دنو بزنیم ، ببینیم چیا داره و به صورت پیش فرض چه امکاناتی رو به ما میده ، خب دستور help رو صادر میکنیم و نتیجه رو یه بررسی میکنیم :> deno help deno 1.0.0-rc3 A secure JavaScript and TypeScript runtime Docs: https://deno.land/std/manual.md Modules: https://deno.land/std/ https://deno.land/x/ Bugs: https://github.com/denoland/deno/issues To start the REPL: deno To execute a script: deno run https://deno.land/std/examples/welcome.ts To evaluate code in the shell: deno eval &quotconsole.log(30933 + 404)&quot USAGE: deno [OPTIONS] [SUBCOMMAND] OPTIONS: -h, --help Prints help information -L, --log-level <log-level> Set log level [possible values: debug, info] -q, --quiet Suppress diagnostic output -V, --version Prints version information SUBCOMMANDS: bundle Bundle module and dependencies into single file cache Cache the dependencies completions Generate shell completions doc Show documentation for a module eval Eval script fmt Format source files help Prints this message or the help of the given subcommand(s) info Show info about cache or info related to source file install Install script as an executable repl Read Eval Print Loop run Run a program given a filename or url to the module test Run tests types Print runtime TypeScript declarations upgrade Upgrade deno executable to given version ENVIRONMENT VARIABLES: DENO_DIR Set deno's base directory (defaults to $HOME/.deno) DENO_INSTALL_ROOT Set deno install's output directory (defaults to $HOME/.deno/bin) NO_COLOR Set to disable color HTTP_PROXY Proxy address for HTTP requests (module downloads, fetch) HTTPS_PROXY Same but for HTTPSقسمت OPTIONS عملیات مربوط به development رو ارائه میدن برای مثال :-q : برای سایلنت کردن لاگ های کارهاییه که دینو توی پس زمینه انجام میده-L : برای مشخص کردن خروجی لاگ ها که اگر روی حالت دیباگ قرار بگیره تمام فرایند های پس زمینه دینو رو به شما گزارش میده-h , -V : همینطور که مشخص هستن راهنما و نسخه دینو رو به شما اعلام میکننخب میرسیم به بخش SUBCOMMANDS ، جذاب ترین بخش دینو تا به این زمانیکی یکی شروع میکنیم و قابلیت هایی که دینو به صورت پیش فرض به شما ارائه میده رو خدمتتون عرض میکنم :bundle : با این sub command شما میتونید ماژول ها و فایل های متعددی که پروژتون نیاز داره رو با هم ترکیب کنید و صرفا یک فایل خروجی قابل حمل داشته باشید که به راحتی بشه اون رو جابجا و منتشر کرد ، یعنی همون کاری که webpack با کدها و ماژول های شما انجام میده و دینو این قابلیت رو به صورت پیش فرض روی خودش داره ؛برای مثال شما اگر دو فایل داشته باشید ://index.ts import { sum } from &quot./math.ts&quot console.log(sum(1,2)); //math.ts export function sum(a: number, b: number) { return a+b; }با اجرای دستور deno bundle این دو فایل رو ترکیب و توی یک فایل قابل حمل میتونید داشته باشید> deno bundle index.ts output.ts Bundling file:///C:/Users/Ali/Desktop/index.ts Emitting bundle to &quotoutput.js&quot 2962 bytes emmited. > deno output.js 3به همین راحتی این قدرت رو شما به دست آوردید که فایل هاتون رو bundle کنید ؛)ساب کامند بعدی که میخوام در موردش حرف بزنم install هستش که خب بین قابلیت های جدیدی که دینو ارائه میده واقعا بی نظیره.- چیکار میکنه این sub command ؟+ با استفاده از کد ما ، یک کامند یا دستورِ قابل اجرا برای ما در سیستم عامل ایجاد میکنه که برای استفاده های بعدی به راحتی بتونیم از کدهامون استفاده کنیم بدون نیاز به حتی نگه داشتن اون کد ها یا دونستن مسیر ذخیرشون .- یعنی چی ؟فرض کنید یه فایل داریم با این محتوا ://index.ts console.log(&quot my name is Ali&quot);حالا درسته ما میتونیم این فایل رو با deno run بدون هیچ مشکلی اجرا کنیم ، ولی ما میخوایم این فایل و این کد، توی تموم سیستم عاملمون قابل اجرا باشه ؛برای این کار از sub command نصب یا install استفاده میکنیم تا دینو تموم کار رو برای ما انجام بده ، به این شکل :> deno install --name=ali index.ts Compile file:///C:/Users/Ali/Desktop/index.ts ✅ Successfully installed ali C:\Users\Ali\.deno\bin\ali.cmdاز این به بعد دیگه کامند ali توی تمام سیستم ما ، نماینده اجرای اون فایل index.ts هستش ، یعنی ما هرجای سیستم بنویسیم ali نتیجه ای رو میگیریم که از اجرای فایل index.ts میگرفتیم :> ali my name is Ali{ اشک در چشمانش حلقه میزند }{ این نکته رو هم اضافه کنم که این قابلیت هایی که گفتم چیزای آنچنان جدید و خفن و معرکه ای نیستن که بتونیم بگیم ایول دینو چقد قابلیت های جدید داره که قبلا هیشکی نداشته و به ذهن کسی خطور نکرده بودن اینا ، اما باید اینو قبول کنیم دنیای برنامه نویسی دنیای راحت کردن زندگیه و کسی این وسط برندست که دنیا رو به جای راحت تری تبدیل بکنه و الان ، دینو ، داره این کارو به بهترین شکل ممکن انجام میده }چند sub command کاربردی دیگه :fmt : کد شما رو فرمت و دیزاین میکنه ، مثل prettier ولی با سرعت بسیار بیشترdoc : داکیومنت کد شما رو نمایش میده و میتونید به راحتی از اون توی وب سایت یا هرجای دیگه استفاده کنید و نیازی به نوشتن دستی مجدد داکیومنت نداشته باشید مثل کاری که وب سایت رسمی دینو برای داکیومنتش انجام میده repl : Read Eval Print Loop ، اجرای سریع دینو توی محیط ترمینالupgrade : آپدیت کردن نسخه دینو بدون نیاز به حتی یک لحظه سختی کشیدندر مورد بقیه sub command ها باید جداگونه توضیح کامل بدم پس همچنان با ما همراه باشید ...STANDARD LIBRARYکتابخونه ی استانداردِ دینو ( از اون ترجمه ها بود ) مجموعه ای از functionality هایی هست که به صورت پیش فرض توی خودِ دینو قرار دارن و توسط تیم اصلی دینو مدیریت میشن ، یعنی شما اگر library رو توی std پیدا کردید میتونید مطمئن باشید بهترین عملکرد روی توی اون تکنولوژی بین رقیب های خودش دارهمثلا برای ساختن uuid ما توی دینو یک کتابخونه کامل و بالغ داریم که نسخه های 1 ، 4 و 5 رو در حال حاضر پشتیبانی میکنه و شما با استفاده از این کتابخونه میتونید اطمینان خاطر داشته باشید درست ترین و بهترین عملکرد رو دریافت میکنید .ماژول های زیاد دیگه هم وجود دارن از جمله FS که برای کار با فایل سیستم تهیه شدهماژول WS که برای کار با وب سوکت هم نسخه سرور هم نسخه کلاینت استفاده میشه و بدون درد و خونریزی میتونید تموم عملکرد لایبرری مثل socket.io رو توی دینو به صورت استاندارد داشته باشید .لیست کامل این ماژول ها رو میتونید اینجا ببینید .ماژول های سوم شخصاین بخش یکی از مهم ترین امکانات دینو به حساب میاد و تقریبا بزرگترین تفاوتش با node.js توی نحوه مدیریت کردن این قسمته.دینو چیزی به اسم NPM یا DPM نداره ، یعنی پکیج منیجرِ centralized مثل npm نداره و پکیج ها میتونن از هر نقطه ای توی دنیای وب نصب بشن.- حالا چه مزیتی داره ؟+ اولین مزیتش همین decentralized شدن هستش ، یعنی شما میتونید پکیجتون رو صرفا روی وب سایت خودتون ، روی گیتهاب یا هرجای دیگه که دوست دارین منتشر کنید و دینو اصلا شما رو محدود به استفاده از یه پکیج منیجر خاص نمیکنه .- چطور ؟فرض کنید ما پکیجی نوشتیم به اسم Espresso و میخوایم منتشرش کنیم .{ البته زیاد فرض نمیکنیم D: ، اینو بنده قبلا نوشتم و قراره که توسعش بدم و از minimal web framework به یه framework کامل تبدیلش کنم ( خوشحال میشم اگر کسی علاقه به کار روی پروژه open source داره باهم توی توسعه این فریمورک همکاری داشته باشیم ) } حالا کجا منتشر کنیم ؟ همونطور که گفتم هرجا که خودمون دوست داریم !هرجایی که بشه فایل آپلود کرد ، مثل گیتهاب !لینک فایل اصلی رو از گیتهاب در میاریم ، که توی مثال ما اینه :https://raw.githubusercontent.com/disizali/espresso/master/application.tsحالا چطور از این ماژول توی کدمون استفاده کنیم ؟کافیه فقط import کنیم و از اونجایی که توی دینو از ESModule به صورت پیشفرض پشتیبانی میشه میتونیم به صورت زیر کد ماژول اسپرسو رو ایمپورت کنیم :import { Application } from &quothttps://raw.githubusercontent.com/disizali/espresso/master/application.ts&quotدقت کنید چون دینو هم از js و هم از ts پشتیبانی میکنه شما باید صراحتا پسوند فایل رو توی ایمپورت هاتون بنویسید .خب برناممون رو ادامه بدیم ؛همونطور که توی مثالِ Espresso گفتم ، برای اجرای یک وب سرور باید یه نمونه از کلاس Application بسازید و بعد از مشخص کردن Route ها میتونید فانکشن start رو صدا بزنید و وب سرورتون رو فعال کنید،پس با تغییرات داده شده ، حالا فایل نهایی ما به این شکل باید باشه ://index.ts import { Application } from &quothttps://raw.githubusercontent.com/disizali/espresso/master/application.ts&quot const app = new Application(); const app = new Application({ port : 80}); app.get(&quot/&quot, (context: any) => { context.send(&quotHello From Deno !&quot); }); app.start();و برای اجرا ما کامند deno run رو وارد و منتظر نتیجه میمونیم :> deno run index.ts Compile file:///C:/Users/Ali/Desktop/index.ts Download https://raw.githubusercontent.com/disizali/espresso/master/application.ts Download https://deno.land/std@v0.50.0/http/server.ts Download https://raw.githubusercontent.com/disizali/espresso/master/context.ts Download https://raw.githubusercontent.com/disizali/espresso/master/router/router.ts Download https://deno.land/std@v0.50.0/encoding/utf8.ts Download https://deno.land/std@v0.50.0/io/bufio.ts Download https://deno.land/std@v0.50.0/testing/asserts.ts Download https://deno.land/std@v0.50.0/async/mod.ts Download https://deno.land/std@v0.50.0/http/_io.ts Download https://deno.land/std@v0.50.0/io/util.ts Download https://deno.land/std@v0.50.0/path/mod.ts Download https://deno.land/std@v0.50.0/path/win32.ts Download https://deno.land/std@v0.50.0/path/posix.ts Download https://deno.land/std@v0.50.0/path/common.ts Download https://deno.land/std@v0.50.0/path/separator.ts Download https://deno.land/std@v0.50.0/path/interface.ts Download https://deno.land/std@v0.50.0/path/glob.ts Download https://deno.land/std@v0.50.0/path/_constants.ts Download https://deno.land/std@v0.50.0/path/_util.ts Download https://deno.land/std@v0.50.0/fmt/colors.ts Download https://deno.land/std@v0.50.0/testing/diff.ts Download https://deno.land/std@v0.50.0/path/_globrex.ts Download https://deno.land/std@v0.50.0/async/deferred.ts Download https://deno.land/std@v0.50.0/async/delay.ts Download https://deno.land/std@v0.50.0/async/mux_async_iterator.ts Download https://deno.land/std@v0.50.0/textproto/mod.ts Download https://deno.land/std@v0.50.0/http/http_status.ts Download https://deno.land/std@v0.50.0/bytes/mod.ts Download https://raw.githubusercontent.com/disizali/espresso/master/router/route.ts error: Uncaught PermissionDenied: network access to &quot127.0.0.1:80&quot, run again with the --allow-net flag at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11) at Object.sendSync ($deno$/ops/dispatch_json.ts:72:10) at Object.listen ($deno$/ops/net.ts:51:10) at listen ($deno$/net.ts:152:22) at serve (server.ts:261:20) at Application.start (application.ts:20:19) at index.ts:8:5اوپس ، خطا داد !خب بریم که نتیجه رو بخونیم و بررسی کنیم ببینیم چه اتفاقایی افتاد1 - Compile اینجا رو که گفتیم ، دینو تایپ اسکریپت رو به جاوا اسکریپت تبدیل میکنه2 - Downloadتوی این لاگ ها ، دینو داره به ما میگه که برای نصب این ماژول espresso چه ماژول های دیگه ای لازم بوده نصب بشن و لیستشون رو به ما نشون میده که خب اگر نیازی به دونستن اونها ندارید ، میتونید flag -q رو پاس بدید و از شر لاگ های غیر ضروری خلاص بشید ؛{ برای نصب ماژول ها بدون اجرای کد ها میتونستیم از sub command کش یا cache استفاده کنیم و صرفا ماژول های مورد نیاز رو دانلود کنیم تا بعدا هروقت لازم شد فایل رو اجرا کنیم }3 - ERRORخطایی که داده برای چیه ؟میگه که این برنامه دسترسی میخواد به اجرا روی هاست 127.0.0.1 و پورت 80 که خب ما این اجازه رو بهش ندادیم پس برنامه خطا میده و خارج میشه ؛برای صادر کردن این دسترسی میتونیم از flag روبرو استفاده کنیم : --allow-netبه این صورت :> deno run --allow-net=127.0.0.1:80 index.tsحالا با رفتن به آدرس localhost میتونید سرور ایجاد شده خودتون رو ببینید که به درخواست شما جواب میده ؛)Top Level awaitاین proposal فوق العاده که توی tc39 هنوز توی stage 3 قرار داره ، توی دینو به صورت پیش فرض فعال هست و این امکان رو به شما میده که توی کد به صورت immediately صدا زده بشن .یعنی دیگه نیازی نیست برای اجرای await حتما شما یک فانکشن async ایجاد و توی اون await رو به کار ببرید ، صرفا همین await نوشتن برای شما کفایت میکنهچطور ؟فرض کنید بخواید از fetch که یه خروجی promise داره توی top level کدتون استفاده بکنید ، حالا برای اینکار تنها کدی که کافیه بنویسید کد روبرو هستش :let response = await fetch(&quothttp://google.com&quot);که خب توی کد بالا دو تا نکته وجود داره ، یکی همین top level await که میبینید اصلا توی هیچ فانکشنی نیستو یه نکته دیگه api fetch که web compatible هست و توی دینو هم قابل پیاده سازیخب تا اینجای کار هم فکر کنم متوجه شدید که دینو ، چه تغییر بزرگی قراره توی برنامه نویسی سرور ساید ایجاد کنه ؛اما چیزی که مهمه ، اینه که این خود دینو هستش که تغییرات رو انجام میده ، شما لازم نیست چیزی رو عوض کنید یا خودتون راه جدیدی رو پیش بگیرید یا دردسر جدیدی بکشید ؛دینو ، همه چیز رو برای شما محیا کرده و شما فقط باید افتخار بدید و شروع به استفاده بکنید ، همین ...از اونجایی که محیط دینو ، برای برنامه نویس ها ، محیطِ کاملا آشناییه ، شما با پیشرفت توی Deno توی مابقی دنیای Js مثل Node ، React ، TS و ... هم پیشرفت خواهید کرد پس اصلا و اصلا نگران هدر دادن وقتتون نباشید و صرفا از فرصتی که پیش روی شماست نهایت استفاده رو ببرید .توی قسمت های بعدی آموزش در مورد مباحث فنی تر ، عمیق تر و برتری های دیگه ( که زیادن و نمیشد همه رو تو یه مقاله جا داد ) صحبت میکنیم و سورس دینو رو باهمدیگه بررسی میکنیم .امیدوارم لذت برده و استفاده کرده باشید و البته خوشحال میشم نقد ها ، سوالات و پیشنهاداتتون رو بشنوم.بازم علی حسنی هستم ، مثل همیشه اگر سوالی داشتید میتونید بپرسید و تا جایی که دانشم قد بده با کمال میل جواب میدم و توی اکثر شبکه های اجتماعی هم هستم خدمت شما .توییتر : disizaliتلگرام : aliwiجامعه دنو ایران هم توی تلگرام و گیتهاب فعاله و عزیزانی که تمایل دارین توی جامعه فعالیت داشته باشین، میتونین از طریق راه های لینک شده با بقیه بچه ها در ارتباط باشین.