مقدمة: لماذا tsconfig.json ليس مجرد ملف؟
\n\nكل من كتب بلغة TypeScript ولو مرة واحدة، واجه الملف الغامض tsconfig.json. إذا كنت مبتدئًا، فغالبًا ما كنت تنسخه من التوثيق أو تبحث في جوجل عن "كيفية توليد tsconfig.json". أما إذا كنت مطورًا متمرسًا، فربما تساءلت يومًا: ما الذي يحدث بالفعل تحت الغطاء عندما أقوم بتشغيل tsc --init؟
في هذه المقالة، لن نقدم لك وصفة جاهزة فحسب، بل سنلقي نظرة داخل غرفة المحرك لمترجم TypeScript. ستتعلم كيف يقرأ المترجم التكوين، وما هي الأعلام المسؤولة عن صرامة الكود، وكيف تكتب "مولد" tsconfig.json الخاص بك بسرعة. هيا بنا!
\n\n1. ما هو tsconfig.json ولماذا هو مطلوب؟
\n\ntsconfig.json هو ملف JSON يخبر مترجم TypeScript (tsc) كيف يعالج الكود الخاص بك. بدونه، سيعمل tsc في الوضع "الافتراضي"، لكن هذا غالبًا لا يكفي للمشاريع الجادة.
تحت الغطاء، يحدد tsconfig.json:
\n- \n
- الملفات التي سيتم ترجمتها (المفاتيح
include،exclude،files). \n - أين يتم وضع النتائج (المفتاح
outDir). \n - إصدارات JavaScript التي سيتم دعمها (المفتاح
target). \n - مدى صرامة التحقق من الأنواع (المفاتيح
strict،noImplicitAnyوغيرها). \n - الوحدات والمسارات الإضافية. \n
عندما تطرح سؤال "how can I generate a tsconfig.json file"، تكون الإجابة عادةً واحدة: tsc --init. لكن دعنا نفهم ما يولده هذا الأمر بالضبط.
2. الأمر tsc --init: ما تحت الغطاء؟
\n\nقم بتشغيل الأمر في الطرفية:
\nnpx tsc --init\n\nسيظهر في جذر المشروع ملف tsconfig.json يحتوي على الكثير من الإعدادات المعلقة. في الواقع، تحت الغطاء، ينفذ مترجم TypeScript الخوارزمية التالية:
- \n
- يتحقق مما إذا كان
tsconfig.jsonموجودًا بالفعل في الدليل الحالي. \n - إذا لم يكن موجودًا، يقوم بإنشاء قالب بالإعدادات الافتراضية. \n
- يضبط
target: "es2016"،module: "commonjs"،strict: trueوقيمًا معقولة أخرى. \n - يعلق جميع الخيارات الأخرى، ليتمكن المطور من إلغاء تعليقها عند الحاجة. \n
لكن ماذا لو كنت تريد تخصيص التوليد؟ على سبيل المثال، تفعيل الوضع الصارم فورًا أو تحديد مسار لملفات الإخراج؟ لهذا، يمكنك كتابة سكريبت خاص بك.
\n\n2.1. مثال: مولد tsconfig.json خاص بك بلغة TypeScript
\n\nتخيل أنك تكتب أداة للإعداد التلقائي للمشاريع. إليك كيف قد تبدو دالة تولد tsconfig.json تحت الغطاء:
import * as fs from 'fs';\nimport * as path from 'path';\n\ninterface TsConfig {\n compilerOptions: {\n target: string;\n module: string;\n strict: boolean;\n outDir: string;\n rootDir: string;\n esModuleInterop: boolean;\n skipLibCheck: boolean;\n forceConsistentCasingInFileNames: boolean;\n };\n include: string[];\n exclude: string[];\n}\n\nfunction generateTsConfig(\n target: string = 'ES2020',\n outDir: string = './dist',\n rootDir: string = './src',\n strict: boolean = true\n): TsConfig {\n return {\n compilerOptions: {\n target,\n module: 'commonjs',\n strict,\n outDir,\n rootDir,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n },\n include: ['src/**/*'],\n exclude: ['node_modules', 'dist'],\n };\n}\n\n// توليد وحفظ\nconst config = generateTsConfig();\nfs.writeFileSync(\n path.join(process.cwd(), 'tsconfig.json'),\n JSON.stringify(config, null, 2)\n);\nconsole.log('تم إنشاء tsconfig.json!');\n