لو لسه شغّال على Node.js 22 في الإنتاج، الخبر النهارده مش "فيه version جديد". الخبر إن Node 22 مات فعلاً يوم 24 مارس 2026، و Node 24.15.0 LTS نزل 15 أبريل كبديل الرسمي. القرار مش "أهاجر بكرة"، القرار بالظبط: إيه اللي لازم يتعمل هذا الأسبوع، وإيه اللي ينفع يستنى شهر.
Node.js 24.15 LTS: الخبر اللي هيغيّر package.json بتاعك
المشكلة باختصار
Node.js 22 (Jod) وصل End of Life في 24 مارس 2026. معناها بالظبط: مفيش security patches، مفيش bug fixes، ومفيش دعم رسمي من المنظمة. أي ثغرة CVE تطلع بعد التاريخ ده مش هتتعالج على 22 أبدًا. في نفس الوقت، Node.js 24 (Krypton) دخل Active LTS من أكتوبر 2025، وآخر إصدار 24.15.0 نزل 15 أبريل 2026.
الترقية مش حاجة "nice to have" — هي مسألة امتثال أمني لأي مشروع production. شركات التأمين السيبراني وفرق الـ SOC بتعتبر أي runtime على إصدار EOL risk مباشر.
Explicit Resource Management: المفهوم اللي هيغيّر طريقة كتابتك
دي أكبر feature جديدة في Node 24. قبل ما ندخل في التعريف العلمي، خد مثال بسيط جدًا.
تخيّل إنك فتحت صنبور مية في المطبخ علشان تملا كوباية. بعد ما تخلّص، لازم تقفل الصنبور. لو نسيت وسبته مفتوح، المية هتفضل جارية والفاتورة هتعلى، وممكن كمان تغرّق البيت. ده بالظبط اللي بيحصل لمّا تفتح ملف أو connection لقاعدة بيانات ومتقفلهاش — الـ resource بيفضل مفتوح، والـ memory بتزيد، لحد ما الـ process يقع أو الـ DB تقفل connections عليك.
قبل Node 24، كنت بتكتب try/finally كل مرة علشان تفتكر تقفل الـ resource يدويًا:
// الطريقة القديمة — Node 22 وما قبله
import { openSync, closeSync, readFileSync } from 'node:fs';
function readConfig() {
const fd = openSync('./config.json', 'r');
try {
const data = readFileSync(fd, 'utf8');
return JSON.parse(data);
} finally {
closeSync(fd); // لازم تفتكر تقفل — لو نسيت، leak
}
}في Node 24 بقى في كلمة جديدة اسمها using. أي resource عامل implement للـ Symbol.dispose بيتقفل تلقائيًا لمّا يخرج من الـ scope:
// Node 24+ — الطريقة الجديدة
class FileHandle {
constructor(path) {
this.fd = openSync(path, 'r');
}
read() { return readFileSync(this.fd, 'utf8'); }
[Symbol.dispose]() { closeSync(this.fd); }
}
function readConfig() {
using handle = new FileHandle('./config.json');
return JSON.parse(handle.read());
// handle[Symbol.dispose]() بيتنادى تلقائيًا هنا
// حتى لو throw حصل، الـ cleanup مضمون
}