أعلنت فريق Angular من Google في سبتمبر 2026 عن خطة طموحة لإعادة كتابة معالج TypeScript الخاص بـ Angular (الـ Compiler) باستخدام Rust و مكتبة Oxc بدلاً من TypeScript الخالص. السبب الرئيسي: استفادة Angular من الأداء الهائل الذي جلبته TypeScript 7، التي أُعيدت كتابتها بـ Go وحققت تحسّن في الأداء يصل إلى 10 مرات. لكن، Angular لا يمكنها استخدام TypeScript 7 مباشرة لأن معالجها يحتاج إلى تكامل عميق جداً مع TypeScript APIs التي لا تتوفر في النسخة من Go. الحل: بناء معالج جديد يُدعى Angular Preprocessor (ngp) بـ معمارية هجينة تجمع بين Rust و TypeScript. النسخة التجريبية متوقعة في نهاية 2026.
السياق: TypeScript 7 والمشكلة
TypeScript 7 و الأداء الجديد
في سبتمبر 2026، أطلقت Microsoft TypeScript 7 بـ بنية جديدة تماماً. TypeScript 7 أُعيدت كتابتها بـ Go بدلاً من TypeScript نفسها. النتيجة: تحسّن أداء يصل إلى 10 مرات في الـ compilation. هذا تحسّن هائل جداً. لكن مع هذا التحسّن جاءت مشكلة: TypeScript 7 مكتوبة بـ Go، وهذا يعني أنها compiler منفصل تماماً. الـ APIs الداخلية لـ TypeScript (ts.Transformer وغيرها) لا توجد في النسخة من Go، لأن Go عالم مختلف تماماً عن JavaScript/TypeScript.
مشكلة Angular الخاصة
Angular لديها معالج معقد جداً يعتمد على تكامل عميق مع TypeScript APIs. معالج Angular لا يفقط يقرأ الكود، بل يفعل أشياء متقدمة جداً:
- يعثر على Angular decorators (@Component, @Pipe, @Injectable، إلخ)
- يترجم templates الـ HTML إلى JavaScript optimized للـ runtime
- يعمل type-checking للـ expressions داخل الـ templates
- يستخدم ts.Transformer API للـ code transformation
- يفعل cross-file optimizations
هذا التكامل العميق لا يمكنه أن يعمل مع TypeScript 7 (النسخة من Go) لأن الـ APIs المطلوبة لا توجد في Go بشكل public. Microsoft في البداية لم توفر طريقة لـ interop مع TypeScript 7 بالطريقة التي تحتاجها Angular.
الحل: إعادة كتابة المعالج
المعمارية الجديدة: ngp (Angular Preprocessor)
بدلاً من محاولة تعديل TypeScript 7 أو استخدام interop APIs، فريق Angular قررت: دعونا نبني معالج جديد تماماً. هذا الحل بسيط من ناحية المبدأ:
فصل العمل إلى قسمين:
- Compilation: تحويل Angular decorators إلى كود optimized
- Type-checking: استخدام TypeScript للتحقق من الأنواع والـ diagnostics
بدلاً من أن يفعل معالج واحد كل شيء، ngp سيولد ملفين من كل ملف input:
- dashboard.ng.ts: الكود الأصلي لكن بـ decorators مترجمة وـ templates compiled
- dashboard.ngtypecheck.ts: نسخة مترجمة من الـ templates بـ صيغة تفهمها TypeScript type-checker
بعدها، TypeScript 7 يمكنها أن تعمل على هذه الملفات المحضّرة. لا حاجة للـ deep integration مع TypeScript APIs.
المعمارية الهجينة: Rust + TypeScript
ngp نفسها معمارية هجينة:
Frontend (الجزء الأمامي) — مكتوب بـ Rust:
- مكتبة Rust تُدعى الـ "analyzer"
- تستخدم Oxc library (محرك JavaScript/TypeScript من Rust)
- تقرأ الكود بـ سرعة (Rust أسرع من JavaScript)
- تجد Angular-decorated classes و تعيّن العلاقات بينها
- تستخرج معلومات الـ dependencies
- تولّد قائمة من compilation tasks لـ الـ backend
- لأن Rust لديها دعم قوي للـ multithreading، تقرأ الكود بـ parallelism
Backend (الجزء الخلفي) — مكتوب بـ TypeScript:
- يأخذ compilation tasks من الـ analyzer (Rust)
- يستخدم Angular's existing template compiler (مكتوب بـ TypeScript)
- يولّد الملفات الـ output (dashboard.ng.ts و dashboard.ngtypecheck.ts)
الـ Rust و TypeScript يتحدثان مع بعضهما عبر napi-rs، مكتبة تسمح لـ Rust code أن يُحمّل كـ native plugin في Node.js أو كـ WebAssembly bundle.
التفاصيل التقنية
الـ Analyzer (Rust Frontend)
الـ analyzer هو المحرك الرئيسي في ngp:
- يستخدم Oxc للـ parsing الكود TypeScript/JavaScript
- يبني AST (Abstract Syntax Tree)
- يفعل semantic analysis (دون type-checking مكتمل)
- يعرّف Angular-decorated classes
- يعرّف العلاقات بين NgModules و components
- يستخرج dependency information من Angular Package Format libraries
- يولّد compilation tasks
- يقرأ ملايين الـ source files بـ parallelism فعّال
الـ analyzer يُخرج stream من compilation tasks يُرسل إلى الـ TypeScript backend.
الـ Backend (TypeScript)
الـ backend يأخذ tasks من الـ analyzer ويفعل:
- يستخدم Angular's existing template compiler
- يترجم templates إلى TypeScript code
- يولّد source maps
- يكتب output files (أو يحفظها في الذاكرة للأداء)
الـ source maps مهمة جداً: عندما TypeScript 7 تقرر errors، الـ errors تُرجع إلى الملفات الأصلية، ليس الملفات الـ generated.
الـ Oxc Library
Oxc (Oxidation Compiler) محرك JavaScript parsing و compilation مكتوب بـ Rust. تطوره شركة Void Zero. Oxc هو المحرك الذي يعمل خلف Vite (build tool شهير جداً). مميزات Oxc:
- Parsing سريع جداً
- AST stable وـ mature
- دعم semantic analysis
- APIs للـ code transformations
- يستخدم بـ كفاءة من قبل أدوات أخرى
الأثر المستقبلي والفوائد
الأداء المتوقع
فريق Angular لم تؤكد بعد أن ngp ستحصل على نفس الـ 10x speedup من TypeScript 7. السبب: TypeScript compilation فقط جزء من العملية الكاملة. هناك transpilation و minification و bundling أيضاً. لكن الاختبارات الأولية تشير إلى:
- Rust analyzer سيقرأ الكود أسرع
- Multithreading في Rust سيعطي parallelism أفضل
- Incremental builds قد تكون أسرع
الـ Language Service
ngp أيضاً سيقدّم engine جديد للـ language service (الأداة التي توفر autocompletion و error checking في الـ IDE). فريق Angular لديها prototype يعمل بالفعل.
دعم WASM
لأن ngp تستخدم napi-rs، الـ Rust analyzer يمكنها أن تُحمّل كـ WebAssembly bundle. هذا يعني: Angular compilation في الـ browser ممكن الآن. أدوات online coding (زي StackBlitz) يمكنها أن تستخدم ngp.
قراءة تحليلية مستقلة
هذا الحل يعكس نضج Angular كـ framework وـ اهتمامها بـ الأداء. بدلاً من الانتظار بـ آمل أن Microsoft توفر APIs كافية في TypeScript 7، Angular بنت حلاً مستقلاً. المعمارية الهجينة (Rust + TypeScript) عملية ذكية جداً:
- تستفيد من سرعة Rust للـ parsing والـ analysis الثقيل
- تحتفظ بـ Angular's existing template compiler (مختبر جيداً، مستقر)
- لا حاجة لإعادة كتابة كل شيء من الصفر
- Hybrid approach أقل خطورة من rewrite كامل
الاختيار بـ Oxc بدلاً من Go (الذي اختارته Microsoft):
- Angular لا تحتاج لإعادة كتابة parser كامل
- Oxc موجودة وـ mature
- Rust multithreading أقوى من Go
- Rust WASM support أفضل
هناك حالياً compiler آخر من Void Zero مكتوب بـ Rust و Oxc لـ Angular (oxc-angular-compiler)، لكنه لا يفعل template type-checking أو cross-file optimizations. ngp يفعل كل هذا.
الأسئلة الشائعة
س: هل ngp ستكون متاحة قريباً؟
ج: نسخة تجريبية متوقعة في نهاية 2026 (الآن في وقت المقالة: سبتمبر 2026، فقد تكون available بالفعل في يونيو 2027 أو بعده).
س: هل سيكون هناك breaking changes؟
ج: فريق Angular تختبرها ضد Google's entire codebase. الأغلب: لا breaking changes. قد تكون بعض edge cases حيث type-checking يختلف قليلاً، لكن هذا نادر جداً.
س: لماذا لم تستخدم Angular interop APIs من TypeScript 7.1؟
ج: Angular ستستخدم TS 7.1 interop APIs للـ type-checking والـ diagnostics. لكن للأداء، معالجة في native code أفضل. Angular يفعل AST walking معقد جداً، والـ native code أسرع.
س: هل oxc-angular-compiler من Void Zero ستختفي؟
ج: لا، Angular مهتمة بـ التعاون مع Void Zero. قد تستخدم Angular أجزاء من oxc-angular-compiler في ngp مستقبلاً.
س: لماذا Rust و ليس Go؟
ج: Go جيدة للـ porting من لغة garbage-collected آخرى. Angular اختارت Rust لأنها تحتاج JavaScript/TypeScript toolchain (parser, AST, transformer)، وـ Oxc (في Rust) هي الأفضل والأنضج.
الخاتمة
Angular TypeScript 7-powered Compiler (ngp) يمثل قفزة كبيرة في استراتيجية الأداء. المعمارية الهجينة (Rust frontend + TypeScript backend) حل ذكي لـ مشكلة حقيقية: TypeScript 7 سريعة جداً لكن لا توفر APIs كافية للـ frameworks معقدة. ngp لن توفر فقط أداء أفضل، بل أيضاً فرصة لـ Angular online tools و browser-based compilation. هذا يفتح إمكانيات جديدة للـ developers و الـ tools builders. لـ developers الذين يستخدمون Angular الآن: لا شيء سيتغير في الكود الخاص بك. ngp شفافة تماماً. الفائدة الوحيدة: builds أسرع و diagnostics أفضل. هذا مثال على كيف framework maturity يعني الاستثمار في الأداء و الأدوات الأساسية، وليس فقط الميزات الجديدة اللامعة.
المصدر:
Angular Blog: An update on Angular's TypeScript 7-powered Compiler