خداحافظی با Deno و برگشت به Node.js
خلاصهٔ کاملتر
دیوید بوشل تو این پست تعریف میکنه که بعد از سالها کار با Deno، این ماه روی یه پروژهٔ SvelteKit دوباره با Node.js کار کرده و غافلگیر شده. به گفتهٔ نویسنده، Node حالا همهٔ قابلیتهای جدید ECMAScript رو ساپورت میکنه، APIهای قدیمی و اذیتکنندهش مدرن شدن و دیگه لازم نیست require() ببینی.
برای مدیریت نسخههای Node، نویسنده بهجای NVM رفته سراغ FNM (یه version manager سریعتر) و برای پکیجها هم PNPM رو انتخاب کرده. دلیلش امنیته: PNPM اسکریپتهای post-install (یعنی کدی که بعد از نصب پکیج خودکار اجرا میشه) رو بهصورت پیشفرض بلاک میکنه. اون تو pnpm-workspace.yaml دو تا تنظیم هم اضافه کرده تا آپدیتهای تازه و احتمالاً آلوده دیرتر نصب بشن:
minimumReleaseAge: 1440
trustPolicy: no-downgradeعدد 1440 یعنی یه پکیج باید حداقل یه روز از انتشارش گذشته باشه تا نصب بشه. نویسنده اول یه ماه گذاشته بود، ولی PNPM نمیتونست نسخههای سازگار پیدا کنه و مجبور شد روی یه روز بمونه. ایدهش اینه که اگه یه حملهٔ زنجیرهٔ تأمین مثل Shai-Hulud پیش بیاد، بقیه زودتر گیرش بندازن.
Node حالا میتونه فایلهای TypeScript رو با type stripping (یعنی پاک کردن تایپها و اجرای مستقیم JS) اجرا کنه. ولی یه محدودیت عمدی داره: فایلهای TS داخل node_modules رو قبول نمیکنه و خطای ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING میده. یعنی نمیشه پکیج TS خام منتشر کرد. نویسنده برای همین از Tsdown برای باندل کردن استفاده کرده.
تست آخر، مهاجرت static site generator شخصیش از Deno بود. با Node v26.10.0 فقط لازم شد API فایل Deno رو با node:fs عوض کنه، Deno.serve رو با آداپتور Node فریمورک Hono جایگزین کنه و @std/path رو با node:path. نتیجه؟ بیلدها ۱۵٪ سریعتر شدن، با اینکه کد هنوز به سبک Deno نوشته شده.
نویسنده معتقده Deno وقتی شکست خورد که موفقیت رو با معیارهای استارتاپی سیلیکونولی تعریف کرد و از نوآوری دست کشید. چیزایی که آخر سر فراریش داد: خراب بودن ادغام با ZSH برای چند هفته، خطاهای مکرر 429 از رجیستری JSR، و باگهایی که Deno رو موقع درخواستهای HTTP همزمان از کار مینداخت. اون حتی اکانت JSR خودشو هم پاک کرده.
نکات کلیدی:
- مهاجرت یه static site generator از Deno به Node v26.10.0 بیلدها رو ۱۵٪ سریعتر کرد.
- PNPM اسکریپتهای post-install رو بلاک میکنه و با minimumReleaseAge میشه نصب نسخههای خیلی تازه رو عقب انداخت.
- Node فایلهای TypeScript داخل node_modules رو اجرا نمیکنه، پس پکیجها هنوز باید build بشن.
- جایگزینهای اصلی تو مهاجرت: node:fs، node:path و آداپتور Node فریمورک Hono بهجای Deno.serve.
- دلایل ترک Deno: مشکل ZSH، خطاهای 429 در JSR و باگ درخواستهای همزمان HTTP.




