مقدمة: "صديقك القديم require أصبح فجأة غير مرئي"
\n\nأنت تكتب كودًا بلغة TypeScript، كل شيء يسير بسلاسة، وفجأة — بام! المترجم يصدر رسالة جليدية: "TS2304: Cannot find name 'require'". هل هذا مألوف؟ إذا كنت تنتقل من JavaScript إلى TypeScript أو تعمل مع مشاريع Node.js، فبالتأكيد واجهت هذا الشبح. في عام 2025، لا يزال هذا الخطأ في صدارة Stack Overflow (أكثر من 200,000 مشاهدة)، لكن الخبر السار: من السهل التغلب عليه.
\n\nفي هذه المقالة، سنحلل لماذا لا يرى TypeScript الدالة require، وما هي الإعدادات التي تحتاج إلى تعديلها، والأهم من ذلك — كيفية كتابة كود حديث لتنسى هذه المشكلة إلى الأبد. هيا بنا!
ما هو TS2304 ولماذا يظهر؟
\n\nيظهر الخطأ TS2304: Cannot find name 'require' عندما لا يتمكن TypeScript من العثور على تعريف الدالة العامة require. في JavaScript (خاصة في بيئة Node.js)، require هي دالة أصلية لاستيراد الوحدات بأسلوب CommonJS. لكن TypeScript افتراضيًا لا يعرف عن بيئة Node.js. فهو يعتقد أنك تعمل في متصفح، حيث لا توجد دالة require.
السيناريو النموذجي:
\n\n// app.ts\nconst express = require('express');\n// ❌ TS2304: Cannot find name 'require'\n\n\nفي عام 2025، يستخدم TypeScript (الإصدار 5.x فما فوق) افتراضيًا وحدات ES (import/export). إذا كنت تحاول استخدام require بدون إعدادات صحيحة، فسيحتج المترجم بحق.
الأسباب الرئيسية للخطأ:
\n- \n
- عدم تثبيت حزمة
@types/node— TypeScript لا يعرف عن واجهات برمجة التطبيقات العامة لـ Node.js. \n - إعدادات غير صحيحة في
tsconfig.json— عدم وجودtypes: ["node"]أو أنmoduleلا يتوافق مع CommonJS. \n - استخدام بناء جملة قديم — في 2025، من الأفضل استخدام
importبدلاً منrequire. \n - تعارض بين CommonJS و ESModules — المشروع مهيأ لوحدات ES، لكنك تكتب كودًا بأسلوب CommonJS. \n
الطريقة رقم 1: تثبيت @types/node (حل سريع)
\n\nأبسط وأكثر الطرق شيوعًا — جعل TypeScript "يرى" Node.js. للقيام بذلك، قم بتثبيت حزمة الأنواع:
\n\nnpm install --save-dev @types/node\n\n\nبعد ذلك، أضف إلى tsconfig.json:
{\n "compilerOptions": {\n "types": ["node"]\n }\n}\n\n\nالآن يعرف TypeScript عن الدالة require، و __dirname، و process، وغيرها من الكائنات العامة لـ Node.js. سيختفي الخطأ.
الإيجابيات: سريع، يعمل "فورًا".
\nالسلبيات: تستمر في استخدام بناء جملة CommonJS القديم.
الطريقة رقم 2: إعداد moduleResolution و esModuleInterop
\n\nإذا كنت ترغب في استخدام require في مشروع مهيأ للوحدات الحديثة، أضف الخيارات التالية إلى tsconfig.json:
{\n "compilerOptions": {\n "module": "commonjs",\n "moduleResolution": "node",\n "esModuleInterop": true,\n "allowSyntheticDefaultImports": true\n }\n}\n\n\n- \n
"module": "commonjs"— نحدد بوضوح أن الكود الناتج سيكون بتنسيق CommonJS. \n "moduleResolution": "node"— نبحث عن الوحدات كما يفعل Node.js (أولاً فيnode_modules). \n "esModuleInterop": true— يسمح باستيراد وحدات CommonJS عبرimport(والعكس). \n "allowSyntheticDefaultImports": true— يسمح بالاستيراد الافتراضي من الوحدات التي ليس لديها تصدير افتراضي. \n
مثال على كود يعمل:
\n\nimport express = require('express');\n// أو حتى\nconst express