۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

Deno در مقابل Node.js: کدام بهتر است؟

Node.is همچنان پرکاربردترین محیط زمان اجرا جاوا اسکریپت است، اما Deno امن تر است و مزایای مدرن را به ارمغان می آورد. Deno و Node.js را مقایسه کنید و تصمیم بگیرید که برای پروژه بعدی شما مناسب است.

Node.is همچنان پرکاربردترین محیط زمان اجرا جاوا اسکریپت است، اما Deno امن تر است و مزایای مدرن را به ارمغان می آورد. Deno و Node.js را مقایسه کنید و تصمیم بگیرید که برای پروژه بعدی شما مناسب است.

در این مقاله، با Node.js و Deno، تفاوت‌های بین ماژول‌های CommonJS و ECMAScript، استفاده از TypeScript با Deno، و استقرار سریع‌تر با Deno Deploy آشنا می‌شوید. ما با یادداشت‌هایی به پایان می‌رسیم تا به شما کمک کند بین استفاده از Node.js یا Deno برای پروژه توسعه بعدی خود تصمیم بگیرید.

Node.js چیست؟

Node.js یک محیط زمان اجرا جاوا اسکریپت چند پلتفرمی است که هم برای سرورها و هم برای برنامه های دسکتاپ مفید است. این یک حلقه رویداد تک رشته ای را اجرا می کند که در سیستم ثبت شده است تا اتصالات را مدیریت کند و هر اتصال جدید باعث فعال شدن یک تابع فراخوانی جاوا اسکریپت می شود. عملکرد برگشت به تماس می‌تواند درخواست‌ها را با تماس‌های ورودی/خروجی غیرمسدود رسیدگی کند. در صورت لزوم، می‌تواند رشته‌هایی را از یک استخر ایجاد کند تا عملیات مسدودسازی یا فشرده‌سازی CPU را اجرا کند و بار را در هسته‌های CPU متعادل کند.

رویکرد Node برای مقیاس‌بندی با توابع پاسخ به تماس، نسبت به اکثر معماری‌های رقابتی که با رشته‌ها مقیاس می‌شوند، از جمله Apache HTTP Server، سرورهای مختلف برنامه جاوا، IIS و ASP.NET، و Ruby on Rails، به حافظه کمتری برای مدیریت اتصالات بیشتر نیاز دارد.

برنامه های Node به جاوا اسکریپت خالص محدود نمی شوند. شما می توانید از هر زبانی که به جاوا اسکریپت تبدیل می شود استفاده کنید. برای مثال TypeScript و CoffeeScript. Node.js دارای موتور جاوا اسکریپت Google Chrome V8 است که از نحو ECMAScript 2015 (ES6) بدون نیاز به ترانسپایلر ES6 به ES5 مانند Babel پشتیبانی می کند.

بسیاری از ابزارهای Node از کتابخانه بسته بزرگ آن می‌آیند که از طریق دستور npm قابل دسترسی است. NPM، Node Package Manager، بخشی از نصب استاندارد Node.js است، اگرچه وب‌سایت خود را دارد.

پلت فرم Node.js مبتنی بر جاوا اسکریپت توسط رایان دال در سال ۲۰۰۹ معرفی شد. این پلتفرم به عنوان جایگزین مقیاس پذیرتر برای سرور HTTP Apache برای لینوکس و MacOS توسعه یافت. NPM، نوشته ایزاک شلوتر، در سال ۲۰۱۰ راه اندازی شد. نسخه بومی ویندوز Node.js در سال ۲۰۱۱ عرضه شد.

دینو چیست؟

Deno یک زمان اجرا امن برای جاوا اسکریپت و TypeScript است که برای WebAssembly، JavaScript XML (JSX) و پسوند TypeScript آن، TSX. Deno که توسط خالق Node.js توسعه داده شده است، تلاشی برای تصور مجدد Node برای استفاده از پیشرفت های جاوا اسکریپت از سال ۲۰۰۹، از جمله کامپایلر TypeScript است.

مثل Node.js، Deno اساساً پوسته ای در اطراف موتور جاوا اسکریپت Google V8 است. برخلاف Node، کامپایلر TypeScript را در تصویر اجرایی خود گنجانده است. دال، که هر دو زمان اجرا را ایجاد کرده است، گفته است که Node.js از سه مشکل عمده رنج می برد: یک سیستم ماژول با طراحی ضعیف مبتنی بر توزیع متمرکز؛ بسیاری از APIهای قدیمی که باید پشتیبانی شوند. و عدم امنیت Deno هر سه مشکل را برطرف می کند.

مشکل سیستم ماژول Node با به‌روزرسانی در اواسط سال ۲۰۲۲ حل شد.

ماژول های CommonJS و ECMAScript

هنگامی که Node ایجاد شد، استاندارد واقعی ماژول‌های جاوا اسکریپت CommonJS بود، چیزی که npm در ابتدا از آن پشتیبانی می‌کرد. از آن زمان، کمیته ECMAScript رسماً ماژول‌های ECMAScript< /a>، همچنین به عنوان ماژول های ES شناخته می شود، که توسط مدیر بسته jspm پشتیبانی می شود. Deno همچنین از ماژول های ES پشتیبانی می کند.

پشتیبانی آزمایشی برای ماژول‌های ES در Node.js 12.12 اضافه شد و از Node.js 16 به بعد پایدار است. TypeScript 4.7 همچنین از ماژول های ES برای Node.js 16 پشتیبانی می کند.

روش بارگذاری یک ماژول CommonJS در جاوا اسکریپت استفاده از عبارت require است. روش بارگیری یک ماژول ECMAScript استفاده از عبارت import همراه با عبارت export منطبق است.

آخرین Node.js دارای لودرهایی برای ماژول‌های CommonJS و ES است. اونها چجوری متفاوت هستن؟ لودر CommonJS کاملاً همزمان است. مسئول رسیدگی به تماس های require() است. از پوشه ها به عنوان ماژول پشتیبانی می کند. و در صورتی که از فراخوانی require() حذف شده بود، پسوندهای (js.، .json، یا .node) را اضافه می کند. بارگذار CommonJS نمی توان برای بارگیری ماژول های ECMAScript استفاده کرد. لودر ماژول های ES ناهمزمان است. مسئول رسیدگی به عبارات import و عبارات import() است. پوشه ها را به عنوان ماژول پشتیبانی نمی کند (شاخص های دایرکتوری مانند ./startup/index.js باید به طور کامل مشخص شوند). پسوندها را جستجو نمی کند. و فقط پسوندهای js، mjs. و cjs. را برای فایل‌های متنی جاوا اسکریپت می‌پذیرد. ماژول های ES می توانند برای بارگیری ماژول های JavaScript CommonJS استفاده شوند.

چرا Deno برای امنیت بهتر است

به خوبی شناخته شده است که Deno امنیت را نسبت به Node بهبود می بخشد. عمدتاً به این دلیل است که Deno به طور پیش‌فرض به یک برنامه اجازه دسترسی به دیسک، شبکه، فرآیندهای فرعی یا متغیرهای محیطی را نمی‌دهد. هنگامی که نیاز به اجازه دادن به هر یک از این موارد دارید، می‌توانید با یک پرچم خط فرمان که می‌تواند به اندازه دلخواهتان دانه‌دار باشد، شرکت کنید. برای مثال، --allow-read=/tmp یا --allow-net=google.com. یکی دیگر از پیشرفت‌های امنیتی در Deno این است که همیشه با خطاهای کشف نشده از بین می‌رود. در مقابل، Node به اجرا اجازه می دهد تا پس از یک خطای کشف نشده، با نتایج غیرقابل پیش بینی ادامه یابد.

آیا می توانید Node.js و Deno را با هم استفاده کنید؟

همانطور که می‌خواهید از Node.js یا Deno برای پروژه جاوا اسکریپت بعدی خود در سمت سرور استفاده کنید، احتمالاً از خود می‌پرسید که آیا می توانید آنها را ترکیب کنید. پاسخ به آن یک “شاید” قطعی است.

اول از همه، استفاده از بسته‌های Node از Deno به دفعات کار می‌کند. حتی بهتر از آن، راه‌حل‌هایی برای بسیاری از موانع رایج وجود دارد. این موارد شامل استفاده از ماژول‌های std/node کتابخانه استاندارد Deno برای “polyfill” ماژول‌های داخلی Node است. استفاده از CDN ها برای دسترسی به اکثریت قریب به اتفاق بسته های npm به روش هایی که تحت Deno کار می کنند. و از وارد کردن نقشه‌ها استفاده کنید. علاوه بر این، Deno دارای یک حالت سازگاری Node است که با Deno 1.15 شروع می شود.

از جنبه منفی، سیستم پلاگین Node با Deno ناسازگار است. حالت سازگاری Node Deno از TypeScript پشتیبانی نمی کند. و چند ماژول Node داخلی (مانند vm) با Deno ناسازگار هستند.

 اگر کاربر Node هستید و به فکر تغییر به Deno هستید، در اینجا یک برگ تقلب وجود دارد. به شما کمک کند.

استفاده از TypeScript با Deno

Deno با TypeScript به عنوان یک زبان درجه یک رفتار می کند، درست مانند JavaScript یا WebAssembly. تایپ اسکریپت (و همچنین TSX و JSX) را با استفاده از ترکیبی از کامپایلر TypeScript که در Deno تعبیه شده است و یک کتابخانه Rust به نام swc به جاوا اسکریپت تبدیل می کند. هنگامی که کد تایپ شده (اگر بررسی فعال باشد) و تبدیل شد، در یک کش ذخیره می شود. به عبارت دیگر، برخلاف Node.js یا یک مرورگر، نیازی نیست که TypeScript خود را برای Deno به صورت دستی با کامپایلر tsc ترجمه کنید.

از Deno 1.23، بررسی نوع TypeScript وجود ندارد در Deno به طور پیش فرض. از آنجایی که بیشتر توسعه دهندگان از طریق ویرایشگر خود با نوع چک کننده تعامل دارند، بررسی مجدد تایپ هنگام راه اندازی Deno چندان منطقی نیست. با این حال، می‌توانید بررسی نوع را با پرچم --check در Deno فعال کنید.

Deno Deploy برای استقرار سریعتر

Deno Deploy یک سیستم توزیع شده است که به شما امکان می دهد جاوا اسکریپت، تایپ اسکریپت و WebAssembly را نزدیک به کاربران، در لبه، در سراسر جهان اجرا کنید. سرورهای Deno Deploy که عمیقاً با زمان اجرا V8 یکپارچه شده اند، حداقل تأخیر را ارائه می دهند و انتزاعات غیر ضروری را حذف می کنند. می توانید اسکریپت خود را به صورت محلی با استفاده از Deno CLI توسعه دهید، و سپس آن را در کمتر از یک ثانیه در زیرساخت مدیریت شده Deno Deploy مستقر کنید، بدون نیاز به پیکربندی چیزی.

Deno Deploy که بر روی همان سیستم‌های مدرن Deno CLI ساخته شده است، جدیدترین و بهترین فناوری‌های وب را به روشی مقیاس‌پذیر در سطح جهانی ارائه می‌کند:

  • ساخت‌ها در وب: از Fetch، WebSocket یا URL درست مانند مرورگر استفاده کنید.
  • پشتیبانی داخلی از TypeScript و JSX: کد ایمن تایپ و رندر بصری سمت سرور بدون مرحله ساخت.
  • ماژول‌های ECMAScript سازگار با وب: وابستگی‌ها را درست مانند مرورگر، بدون نیاز به نصب صریح وارد کنید.
  • ادغام GitHub: به یک شعبه فشار دهید، یک پیش‌نمایش مستقر شده را مرور کنید و برای عرضه به تولید ادغام کنید.
  • بسیار سریع: در کمتر از یک ثانیه مستقر می شود. خدمات جهانی نزدیک به کاربران.
  • استقرار از یک URL: کدی را با چیزی بیشتر از یک URL مستقر کنید.

Deno Deploy دو سطح دارد. سطح رایگان به ۱۰۰۰۰۰ درخواست در روز، ۱۰۰ گیگابایت انتقال داده در ماه و ۱۰ میلی ثانیه زمان CPU برای هر درخواست محدود شده است. هزینه سطح حرفه ای ۱۰ دلار در ماه شامل ۵ میلیون درخواست در ماه و ۱۰۰ گیگابایت انتقال داده، به علاوه ۲ در هر میلیون درخواست اضافی در ماه و ۰.۳۰ دلار به ازای هر گیگابایت انتقال داده بیش از سهمیه موجود است. سطح حرفه ای به ازای هر درخواست ۵۰ میلی ثانیه زمان CPU را می دهد.

Deno در حال تولید است

طبق گزارش Deno، در حال تولید فعال در Slack، Netlify، GitHub و سوپا بیس. اگر مطالعات موردی وجود داشته باشد که نحوه استفاده آن شرکت‌ها از Deno را توضیح دهد، من آنها را پیدا نکرده‌ام.

کدامیک را انتخاب کنیم: Node.js یا Deno؟

همانطور که ممکن است انتظار داشته باشید، پاسخ اینکه کدام فناوری برای استفاده شما بهتر است به عوامل زیادی بستگی دارد. نتیجه من: اگر یک استقرار Node.js موجود دارید که خراب نیست، آن را تعمیر نکنید. اگر پروژه جدیدی دارید که قصد دارید آن را در TypeScript بنویسید، من به شدت Deno را در نظر خواهم گرفت. با این حال، اگر پروژه TypeScript شما نیاز به استفاده از چندین بسته Node.js دارد که معادل Deno ندارند، باید امکان‌سنجی پروژه Deno را بسنجید. شروع با اثبات مفهوم تقریباً اجباری است: پیش‌بینی اینکه آیا می‌توانید یک بسته Node.js را بدون امتحان کردن آن در Deno کار کنید یا نه، دشوار است.