5 دقیقه مطالعه

Node.js ۲۶ سیگنال مهاجرت است، نه هدف فردای پروداکشن

Mehdi Rezaei
Mehdi
نویسنده

Node.js ۲۶ سیگنال مهاجرت است، نه هدف فردای پروداکشن

اولین واکنش به نسخه تازه Node معمولاً گشتن دنبال ویژگی قابل تعریف است. کم‌فایده‌ترین خواندن همین است. خط ۲۶ بیشتر از یک قابلیت تکی، خط پایه بعدی ران‌تایم را نشان می‌دهد. این با نسخه‌ای که بیشتر تیم‌های پروداکشن باید فردا بالا بیاورند یکی نیست. نسخه‌ای است که باید همین حالا در CI ببینی، چون می‌گوید سرور جاوااسکریپت به کدام سمت می‌رود وقتی اکوسیستم برسد.

تغییرهای سرخط کوچک نیستند. Temporal به‌صورت پیش‌فرض روشن است. V8 روی ۱۴٫۶ است. Undici روی ۸ است. چند API قدیمی حذف یا سخت‌تر منسوخ شده‌اند. در ۲۶٫۱ هم `node:ffi` آزمایشی آمده، به‌قدر کافی مفید که جدی گرفته شود و به‌قدر کافی ناامن که پشت در قفل بماند. مجموعه یعنی هم‌ترازی بیشتر با پلتفرم وب، توان بومی بیشتر، و حوصله کمتر برای لبه کهنه.

Temporal همان بخش کاربردی برای اپ است

`Date` برای کاری که از آن می‌کشیم کوچک است. یک لحظه زمانی را نشان می‌دهد، ولی با آن تقویم، دوره صورتحساب، فیلد فقط-تاریخ، قاعده زمان‌بندی، و انتظار «ماه بعد» را مدل می‌کنیم. این‌ها یک مسئله نیستند.

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

`PlainDate` مهر زمان نیست. `ZonedDateTime` یک رشته تاریخ با نیت خوب نیست. API مجبورت می‌کند بگویی لحظه مدل می‌کنی، تاریخ تقویمی، ساعت دیواری محلی، یا رویداد وابسته به منطقه. این تمایز همان جایی ارزش دارد که دامنه از قبل مبهم است: منطق تمدید و صورتحساب، job یادآوری، آنالیتیکس بر اساس تاریخ محلی، فرم فقط-تاریخ، تقویم محصول، گزارش بین منطقه‌ها.

اسم نوع را در کد دامنه بیاور، نه فقط در یک کمک‌کننده دور افتاده. اگر صورت‌حساب هنوز `Date` می‌گیرد و فقط لبه‌ی API تبدیل می‌کند، ابهام داخل سیستم مانده و باگ روز مرزی دوباره سبز می‌شود.

مهاجرت کور همه `Date`ها پروژه جداست. اول نشت دامنه را پیدا کن. جایی که فقط مهر ذخیره می‌کنی و واقعاً لحظه است، عجله نکن. جایی که «روز» برای کاربر معنی دارد، همان را زودتر به نوع درست برگردان و تست را روی دو منطقه زمانی بگذار نه فقط منطقه ماشین خودت.

Current را با LTS اشتباه نگیر

خط ۲۶ در چرخه انتشار، Current است. پروژه Node برای اپ پروداکشن هنوز Active LTS یا Maintenance LTS را توصیه می‌کند. تا وقتی این خط خودش به LTS برسد و بستر استقرارت آن را تمیز پشتیبانی کند، برای بیشتر بار کاری عملی یعنی ماندن روی Node ۲۴ یا ۲۲. تاریخ دقیق ورود به LTS را از روی حافظه قفل نکن. وضعیت را روی همان صفحه انتشار ببین، چون «اکتبر» در یک نوشته یعنی برنامه، نه تقویم پلتفرم تو.

پس با ۲۶ چه کار کنی. در CI به‌عنوان زنگ زودرس، در job غیرمسدودکننده. تست، بیلد، مدیر بسته، لینت، و تولید نوع را روی آن اجرا کن. اگر کتابخانه منتشر می‌کنی، قبل از کاربرانت روی ۲۶ بشکن. اشتباه این است که ارتقای ران‌تایم را یک رویداد یک‌شبه بدانی.

ترتیب سالم: نسخه را به CI اضافه کن. شکستگی واضح را بدون عوض کردن پروداکشن درست کن. پشتیبانی وابسته‌ها را نگاه کن. استیجینگ را وقتی اکوسیستم آرام شد تست کن. پروداکشن را وقتی خط LTS است و پلتفرم استقرار بدون پرچم عجیب قبولش می‌کند جابه‌جا کن.

حذف‌ها یک فهرست ممیزی‌اند

در ۲۶، `http.Server.prototype.writeHeader()` حذف شده و جایگزینش `writeHead()` است. ماژول‌های داخلی کهنه جریان مثل `_stream_wrap` و خواندن و نوشتن و duplex داخلی هم از مسیر عمومی کنار رفته‌اند. `module.register()` هم بیشتر به سمت منسوخ ران‌تایم رفته. بیشتر کد اپ این‌ها را مستقیم صدا نمی‌زند. ریسک در وابستگی قدیمی و در ابزاری است که سال‌ها به لبه داخلی چسبیده.

پس شکست بیلد روی ۲۶ را با عجله پین نکن. ببین کدام بسته هنوز به API حذف‌شده تکیه دارد. گاهی ارتقای همان بسته کافی است. گاهی باید جایگزینش کنی. این فهرست مفیدتر از جدول ویژگی جدید است، چون کار مشخص می‌دهد.

Undici ۸ را هم فقط به‌خاطر عدد جشن نگیر. اگر کلاینت HTTP خودت رفتار مهلت، هدر، یا پروکسی را فرض کرده، روی خط تازه یک بار مسیر واقعی خروج به API بیرونی را بزن. اختلاف جزئی در کلاینت HTTP باگ‌هایی می‌سازد که تست واحد خالص نمی‌بیند.

FFI آزمایشی را به محصول راه نده

`node:ffi` اگر در خط ۲۶٫۱ آزمایشی است، یعنی می‌شود از جاوااسکریپت به تابع بومی رسید بدون اینکه تمام addon را مثل قدیم بست. برای ابزار خاص وسوسه‌کننده است. برای اپ محصول، درِ آزمایشی یعنی قرارداد ناپایدار و سطح حمله تازه. تا وقتی پایدار نشده و مدل تهدیدش را نوشته‌ای، پشتش منطق کسب‌وکار نگذار. کتابخانه بومی جاافتاده با نگهداری مشخص، از FFI دست‌ساز در مسیر پرداخت امن‌تر است.

اگر کسی در تیم برای «سرعت» می‌خواهد همین حالا FFI را به سرویس اصلی وصل کند، سؤال را عوض کن: کدام تابع، کدام کتابخانه، چه مرزی دور ورودی، و چه کسی آن باینری را به‌روز می‌کند. بدون این جواب، ویژگی ران‌تایم به بدهی عملیاتی تبدیل شده.

پرسش‌های کوتاه

روی لپ‌تاپ ۲۶ نصب کنم؟ برای آزمون محلی بله، اگر می‌توانی ۲۲ یا ۲۴ را هم برای کار روزمره نگه داری. تنها ران‌تایم ماشین را به Current نبند.

Temporal را همه‌جا جایگزین Date کنم؟ نه. جایی که معنی دامنه مبهم است. مهر زمان ساده اگر واقعاً لحظه است می‌تواند بماند تا کد اطرافش روشن شود.

اگر Vercel یا بستر دیگر هنوز ۲۶ نمی‌دهد چه؟ همان بهتر. CI زنگ می‌زند، پروداکشن روی نسخه‌ای می‌ماند که بستر و تیم هر دو پشتیبانی‌اش می‌کنند.

Share this article