كيف تجعل ts-node يعيد التحميل عند تغيير الملفات: تحليل المشاكل الحقيقية
تخيل: أنت تكتب خادمًا على TypeScript، وتشغل ts-node، وتقوم بتعديل — ولا يحدث شيء. تضطر إلى إيقاف العملية يدويًا، والضغط على Ctrl+C، ثم إعادة التشغيل. هل هذا مألوف؟ هذه المشكلة جمعت آلاف المشاهدات على Stack Overflow، وليس من دون سبب: إعداد المراقبة وإعادة التحميل لـ ts-node هو لغز حقيقي.
في هذه المقالة، لن أقدم لك وصفة جاهزة فقط. سنحلل أهم الأخطاء التي يرتكبها حتى المطورون ذوو الخبرة، وسأريك كيفية تجنبها. ستتعرف على سبب عدم عمل ts-node --watch "بشكل افتراضي"، ولماذا ts-node-dev أفضل من الطريقة التقليدية، وكيف لا تقتل أداء الخادم في هذه العملية.
لماذا لا يعيد ts-node التحميل تلقائيًا؟
دعنا نضع النقاط على الحروف فورًا. ts-node ليس خادم تطوير (dev-server). إنه مترجم (transpiler) من TypeScript إلى JavaScript يقوم بتشغيل الكود في بيئة Node.js. ليس لديه آلية مدمجة لتتبع تغييرات الملفات (file watcher). عندما تكتب ts-node app.ts، فهو ببساطة ينفذ الملف وينهي عمله.
للحصول على إعادة تحميل تلقائية عند تغيير الملفات، تحتاج إلى استخدام أدوات خارجية. وهنا يبدأ الجزء المثير للاهتمام.
أفضل 5 أخطاء عند إعداد المراقبة وإعادة التحميل لـ ts-node
لقد جمعت أكثر المشاكل شيوعًا التي يقع فيها المطورون. سنستعرض كل واحدة مع أمثلة وحلول.
الخطأ رقم 1: استخدام العلم --watch بدون الأداة الصحيحة
يكتب الكثيرون في الطرفية (terminal):
ts-node --watch app.tsويتفاجؤون بعدم عمل أي شيء. السبب هو أن ts-node لا يحتوي على العلم --watch في الإصدار القياسي. هذا الأمر ببساطة يتم تجاهله أو ينتج خطأ.
الحل: استخدم nodemon مع ts-node. إليك الأمر الصحيح:
npx nodemon --exec ts-node app.tsأو، إذا كنت تريد حفظه في package.json:
{ "scripts": { "dev": "nodemon --exec ts-node src/index.ts" }}هذا سيجعل nodemon يراقب التغييرات في الملفات ويعيد تشغيل ts-node عند كل حفظ.
الخطأ رقم 2: nodemon لا يرى التغييرات في ملفات .ts
لقد قمت بإعداد nodemon، وتحفظ ملفًا، لكنه لا يستجيب. لماذا؟ افتراضيًا، يراقب nodemon فقط الملفات ذات الامتدادات .js و .json وبعض الامتدادات الأخرى. .ts ليس ضمن القائمة.
الحل: حدد الامتدادات بشكل صريح:
nodemon --watch src --ext ts --exec ts-node src/index.tsالعلم --watch src يحدد نطاق المراقبة بمجلد src (لتجنب مراقبة node_modules). والعلم --ext ts يضيف ملفات TypeScript إلى قائمة الامتدادات المراقبة.
يمكنك أيضًا إنشاء ملف nodemon.json:
{ "watch": ["src"], "ext": "ts", "exec": "ts-node src/index.ts"}الخطأ رقم 3: تعارض مع tsconfig.json — دقة الوحدة (module resolution) غير صحيحة
موقف نموذجي: تستخدم ts-node مع nodemon، ولكن عند التشغيل تحصل على أخطاء مثل Cannot find module أو Unknown file extension ".ts". غالبًا ما تكون المشكلة في إعدادات tsconfig.json.
مثال على tsconfig.json إشكالي:
{ "compilerOptions": { "module": "ESNext", "moduleResolution": "bundler", "target": "ES2020" }}المشكلة: ts-node يعمل في بيئة Node.js، بينما module: "ESNext" مع moduleResolution: "bundler" مصممان لأدوات التجميع مثل Webpa