آغاز یک تغییر اجتناب‌ناپذیر

ژوئن 2018; سالن کنفرانس JSConf EU پر از توسعه‌دهنده‌های جاوااسکریپت بود. رایان دال، خالق پادشاه بی‌رقیب سمت سرور آن دوران، روی سن رفت و دقیقاً همان چیزی را گفت که هیچ‌کس انتظار نداشت. او در سخنرانی‌اش با عنوان «10 موردی که در مورد نود‌جی‌اس پشیمیام»، یکی‌یکی تصمیمات معماری خود از سال 2009 را زیر سوال برد. همان لحظه دینو اعلام شد; یک محیط اجرایی جدید که قرار بود با دور زدن محدودیت‌های نود، استانداردهای برنامه‌نویسی سمت سرور را متحول کند.

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

معماری نود‌جی‌اس; قدرت و محدودیت

در سالیان اولیه توسعه وب، مدل‌های سنتی سرور بر پایه اختصاص یک رشته اجرایی برای هر درخواست کار می‌کردند که در ترافیک‌های سنگین به گلوگاه تبدیل می‌شدند. دال راه حل ساده و هوشمندانه‌ای ارائه داد; موتور V8، حلقه رویداد و ورودی‌خروجی غیرمسدودکننده. این ترکیب اجازه داد جاوااسکریپت به راحتی سرورهای شبکه‌ای بسازد.

نمودار عملکرد حلقه رویداد در نود‌جی‌اس

حلقه رویداد به زبان ساده

در نود، تنها یک رشته اصلی جاوااسکریپت اجرا می‌شود. ظاهر این موضوع ترسناک به نظر می‌رسد، اما واقعیت این است که نود هرگز رشته اصلی را درگیر کارهای طولانی نمی‌کند. وقتی کدی یک درخواست دیتابیس یا فایل را شروع می‌کند، آن وظیفه را به سیستم‌عامل می‌سپارد و بلافاصله به خط بعد کد می‌رود. به محض آماده شدن نتیجه، حلقه رویداد آن را در صف قرار می‌دهد تا جاوااسکریپت بدون کندی پردازش، آن را دریافت کند. همین الگو باعث می‌شود نود در مدیریت هزاران اتصال همزمان بی‌نظیر عمل کند.

اما همین معماری یک شکاف بزرگ ایجاد می‌کند. هرگاه یک اپلیکیشن وارد فاز محاسبات سنگین شود; پردازش عکس، الگوریتم‌های رمزنگاری پیچیده یا تغییرات حجیم در ساختار JSON، رشته اصلی قفل می‌کند. توسعه‌دهندگان مجبورند از رشته‌های کارگر، صف‌های برون‌سپاری محاسبات یا سرویس‌های میکروسرویسی جداگانه استفاده کنند که پیچیدگی زیرساخت را به شدت بالا می‌برد.

نقاط کور اکوسیستم نود

اکوسیستم NPM با هزاران پکیج، سرعت توسعه را چندین برابر کرد. اما این حجم عظیم از وابستگی، باگ‌های امنیتی، حملات زنجیره‌ای Supply Chain و مدیریت پیچیده نسخه‌ها را به کابوس تیم‌های بزرگ تبدیل کرد. فایل package.json که قرار بود ساده باشد، به یک پروتکل سنگین و غیر استاندارد تبدیل شد. پوشه node_modules نه تنها حجم پروژه‌ها را منفجر می‌کند، بلکه مکانیزم قدیمی شناسایی ماژول‌ها را با چالش‌های مدرن سازگار نکرد.

چالش‌های مدیریت وابستگی و حجم پروژه در نود

دینو; اصلاح معماری از صفر

رایان دال در همان سخنرانی سال 2018، معمار دینو را خط خطی کرد تا اشتباهات تکراری نشوند:

  • استانداردهای مدرن وب: پشتیبانی اولیه و کامل از Promiseها و ESM بدون نیاز به پلی‌فیل.
  • امنیت ذاتی: برخلاف نود که دسترسی به فایل و شبکه را نامحدود می‌داد، دینو به صورت پیش‌فرض تمام دسترسی‌ها را مسدود می‌کند. توسعه‌دهنده باید صریحاً پریمیشن‌ها را درخواست کند.
  • حذف node_modules: استفاده از سیستم شناسایی ماژول مبتنی بر URL که ریسک حملات اسکریپت تزریقی را قطع می‌کند.
  • ساختار ساده: حذف package.json پیچیده و جایگزینی با فایل‌های پیکربندی سبک‌تر و شفاف‌تر.
  • زبان بومی‌تر: اجرای مستقیم TypeScript، JSONC و YAML بدون نیاز به کامپایلرهای خارجی.

این تغییرات فلسفه دینو را از یک جایگزین صرف به یک استاندارد جدید برای توسعه وب مدرن ارتقا داد. ابزارهای یکپارچه‌شده‌ای مانند linter، test runner و bundler که از همان ابتدا در هسته وجود دارند، گردش کار تیم‌ها را از مدیریت چندین ابزار جداگانه به یک محیط متمرکز تغییر دادند.

چشم‌انداز آینده یا دو راهی اجباری؟

امروز نود‌جی‌اس با استقبال سنگین شرکت‌های تکنولوژی و پشتیبانی گسترده، همچنان پادشاه سمت سرور باقی مانده است. تیم اصلی نود نیز بسیاری از انتقادات دال را شنیدند و نسخه‌های جدید را با پشتیبانی کامل از ESM، Worker Threads بهینه‌شده و ابزارهای داخلی ارتقا دادند. در مقابل، دینو با عبور از چالش‌های اولیه، به سمت یکپارچه‌سازی بیشتر با استانداردهای وب و ابزارهای سازمانی حرکت می‌کند.

انتخاب میان این دو ران‌تایم دیگر یک مسئله ایدئولوژیک نیست، بلکه یک تصمیم مهندسی است. پروژه‌های کلان و سازمان‌هایی که به پایداری، سازگاریbackward و نیروی کار ماهر نیاز دارند، معمولاً به نود پایبند می‌مانند. در مقابل، تیم‌های استارتاپی، میکروسرویس‌های جدید و پروژه‌هایی که امنیت داده‌ها و پیکربندی‌های مینیمال در اولویت است، مسیر دینو را ترجیح می‌دهند. اکوسیستم جاوااسکریپت دیگر رقیب ندارد; این فضا در حال تبدیل شدن به یک معماری ترکیبی است که در آن مرزهای نود و دینو برای بهره‌گیری از بهترین ویژگی‌های همدیگر در حال محو شدن است.