سلام خدمت شما عزیزای دلی که دارین این مقاله رو میخونین.
من ، علی حسنی ، بعد از چندین ماه Full Time وقت گذاشتن روی پروژه دینو ، اینجام تا باهاتون در موردش یه گپ فنی خودمونی تقریبا طولانی ای بزنم.
خودتونو آماده کنید که قراره از این به بعد یکی از بزرگترین تغییرات زندگیِ برنامه نویسیتون رو انجام بدین و از Node قدیم به Deno جدید مهاجرت کنید .
یدونه Runtime Environment جدید برای Javascript و همینطور Typescript که هسته ی اون توسط زبان برنامه نویسی Rust { که خیلی خفنه } نوشته شده .
خب واقعیتش اینه که دنو بود ، ولی دینو شد ؛
Ryan Dahl سازنده Deno تقریبا یه سال بعد از اولین کامیت توی گیتهابِ دینو تصمیم گرفت که بخاطر اینکه دینو بیشتر شبیه تلفظ کلمه دایناسور بشه اون رو دینو تلفظ کنه ؛
پس شما هم از این به بعد همین کارو بکنید و اون رو « دیــــنو » تلفظ کنید ، با تشکر !
قطعا این اولین سوال و البته مهمترین سوالیه که باید همین اول کار از خودمون بپرسیم .
دینو اومده تا تغییری توی دنیای Javascript سرور-ساید ایجاد کنه ؛
اومده تا اونو امن تر ، سریع تر ، نزدیک تر به استاندارد ها و صد البته مدرن تر بکنه !
امروز اما ( یعنی روزی که من دارم این مقاله رو مینویسم ) به تاریخ may 13,2020 موعد رسمی انتشار نسخه 1.0.0 دینو هستش و قطعا راه بسیار بسیار طولانی ای رو در پی داره تا بتونه یه اکوسیستم به بزرگی node برای خودش درست کنه .
[ اگر به خوندن موارد غیر فنی علاقه ندارید ( پیشنهاد میکنم داشته باشید ) میتونید بخش اکوسیستم رو نادیده بگیرید و از بخش فنی ادامه بدید ... ]
اکوسیستم :
وقتی در مورد اکوسیستم یه تکنولوژی صحبت میکنیم ، موارد خیلی زیادی مد نظر ما هست و از تعداد دولوپر هایی که روی پروژه کار میکنن گرفته تا تعداد سوالاتی که توی stackoverflow پرسیده شده جزء اکوسیستم اون تکنولوژی به حساب میان ؛
چنتا از موارد خیلی مهم توی اکوسیستم رو لیست میکنم این پایین که هرچقد تعداد و نرخ این موارد بیشتر باشه به نفع اون تکنولوژیو کاربرانش هست :
• برنامه نویس هایی که با اون پروژه یا روی اون پروژه در حال کار کردن هستن .
• تعداد سوالاتی که توی جاهایی مثل reddit , stackoverflow , quora پرسیده و پاسخ داده شده .
• تعداد ماژول ها ، پکیج ها ، فریمورک ها ، کتابخونه ها و ابزارهایی که برای اون تکنولوژی وجود داره .
• مقالات ، ویدیو ها ، پادکست ها و کلا آموزش های مربوط به اون تکنولوژی .
• تعداد شغل ها یا موقعیت های شغلی که توی زمینه اون تکنولوژی فعال هستن .
• محبوبیت عمومی پروژه
در حال حاضر روی پروژه دنو 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 deno
homebrew : brew install deno
Chocolatey 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("Welcome to Deno ?");
و بعد با اجرای دستور زیر اون برنامه رو اجرا میکنیم :
> 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("./tmp/file.txt");
حالا اگه deno run رو اجرا کنیم با خطایی مواجه میشیم که به ما میگه ما اجازه دسترسی به فایل مورد نظر رو نداریم و خب این قابلیت از نظر امنیتی کاملا برنامه مارو از داشتن hole یا حفره امنیتی در امان نگه میداره .
error: Uncaught PermissionDenied: read access to "C:\Users\Ali\Desktop\tmp\file.txt", 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 "console.log(30933 + 404)" 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 رو ارائه میدن برای مثال :
خب میرسیم به بخش SUBCOMMANDS ، جذاب ترین بخش دینو تا به این زمان
یکی یکی شروع میکنیم و قابلیت هایی که دینو به صورت پیش فرض به شما ارائه میده رو خدمتتون عرض میکنم :
bundle :
با این sub command شما میتونید ماژول ها و فایل های متعددی که پروژتون نیاز داره رو با هم ترکیب کنید و صرفا یک فایل خروجی قابل حمل داشته باشید که به راحتی بشه اون رو جابجا و منتشر کرد ، یعنی همون کاری که webpack با کدها و ماژول های شما انجام میده و دینو این قابلیت رو به صورت پیش فرض روی خودش داره ؛
برای مثال شما اگر دو فایل داشته باشید :
//index.ts import { sum } from "./math.ts" 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 "output.js" 2962 bytes emmited. > deno output.js 3
به همین راحتی این قدرت رو شما به دست آوردید که فایل هاتون رو bundle کنید ؛)
ساب کامند بعدی که میخوام در موردش حرف بزنم install هستش که خب بین قابلیت های جدیدی که دینو ارائه میده واقعا بی نظیره.
- چیکار میکنه این sub command ؟
+ با استفاده از کد ما ، یک کامند یا دستورِ قابل اجرا برای ما در سیستم عامل ایجاد میکنه که برای استفاده های بعدی به راحتی بتونیم از کدهامون استفاده کنیم بدون نیاز به حتی نگه داشتن اون کد ها یا دونستن مسیر ذخیرشون .
- یعنی چی ؟
فرض کنید یه فایل داریم با این محتوا :
//index.ts console.log(" my name is Ali");
حالا درسته ما میتونیم این فایل رو با 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 کاربردی دیگه :
در مورد بقیه sub command ها باید جداگونه توضیح کامل بدم پس همچنان با ما همراه باشید ...
کتابخونه ی استانداردِ دینو ( از اون ترجمه ها بود ) مجموعه ای از 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 "https://raw.githubusercontent.com/disizali/espresso/master/application.ts"
دقت کنید چون دینو هم از js و هم از ts پشتیبانی میکنه شما باید صراحتا پسوند فایل رو توی ایمپورت هاتون بنویسید .
خب برناممون رو ادامه بدیم ؛
همونطور که توی مثالِ Espresso گفتم ، برای اجرای یک وب سرور باید یه نمونه از کلاس Application بسازید و بعد از مشخص کردن Route ها میتونید فانکشن start رو صدا بزنید و وب سرورتون رو فعال کنید،
پس با تغییرات داده شده ، حالا فایل نهایی ما به این شکل باید باشه :
//index.ts import { Application } from "https://raw.githubusercontent.com/disizali/espresso/master/application.ts" const app = new Application(); const app = new Application({ port : 80}); app.get("/", (context: any) => { context.send("Hello From Deno !"); }); 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 "127.0.0.1:80", 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 میتونید سرور ایجاد شده خودتون رو ببینید که به درخواست شما جواب میده ؛)
این proposal فوق العاده که توی tc39 هنوز توی stage 3 قرار داره ، توی دینو به صورت پیش فرض فعال هست و این امکان رو به شما میده که توی کد به صورت immediately صدا زده بشن .
یعنی دیگه نیازی نیست برای اجرای await حتما شما یک فانکشن async ایجاد و توی اون await رو به کار ببرید ، صرفا همین await نوشتن برای شما کفایت میکنه
چطور ؟
فرض کنید بخواید از fetch که یه خروجی promise داره توی top level کدتون استفاده بکنید ، حالا برای اینکار تنها کدی که کافیه بنویسید کد روبرو هستش :
let response = await fetch("http://google.com");
که خب توی کد بالا دو تا نکته وجود داره ، یکی همین top level await که میبینید اصلا توی هیچ فانکشنی نیست
و یه نکته دیگه api fetch که web compatible هست و توی دینو هم قابل پیاده سازی
خب تا اینجای کار هم فکر کنم متوجه شدید که دینو ، چه تغییر بزرگی قراره توی برنامه نویسی سرور ساید ایجاد کنه ؛
اما چیزی که مهمه ، اینه که این خود دینو هستش که تغییرات رو انجام میده ، شما لازم نیست چیزی رو عوض کنید یا خودتون راه جدیدی رو پیش بگیرید یا دردسر جدیدی بکشید ؛
دینو ، همه چیز رو برای شما محیا کرده و شما فقط باید افتخار بدید و شروع به استفاده بکنید ، همین ...
از اونجایی که محیط دینو ، برای برنامه نویس ها ، محیطِ کاملا آشناییه ، شما با پیشرفت توی Deno توی مابقی دنیای Js مثل Node ، React ، TS و ... هم پیشرفت خواهید کرد پس اصلا و اصلا نگران هدر دادن وقتتون نباشید و صرفا از فرصتی که پیش روی شماست نهایت استفاده رو ببرید .
توی قسمت های بعدی آموزش در مورد مباحث فنی تر ، عمیق تر و برتری های دیگه ( که زیادن و نمیشد همه رو تو یه مقاله جا داد ) صحبت میکنیم و سورس دینو رو باهمدیگه بررسی میکنیم .
امیدوارم لذت برده و استفاده کرده باشید و البته خوشحال میشم نقد ها ، سوالات و پیشنهاداتتون رو بشنوم.
بازم علی حسنی هستم ، مثل همیشه اگر سوالی داشتید میتونید بپرسید و تا جایی که دانشم قد بده با کمال میل جواب میدم و توی اکثر شبکه های اجتماعی هم هستم خدمت شما .
توییتر : disizali
تلگرام : aliwi
جامعه دنو ایران هم توی تلگرام و گیتهاب فعاله و عزیزانی که تمایل دارین توی جامعه فعالیت داشته باشین، میتونین از طریق راه های لینک شده با بقیه بچه ها در ارتباط باشین.