گمشدہ ایکسپورٹس سے آگے: ایک ارلی گارج کلیکٹر (Early Garbage Collector) کی تعمیر

میں نے Webpack کی دستاویزات میں گمشدہ لنکس کو ٹھیک کرنے کے لیے ایک اسٹینڈرڈ پلگ ان استعمال کرنے کی کوشش کی۔ یہ ناکام رہا۔

ایک بڑے کوڈ بیس (codebase) میں پلگ ان کو شامل کرنا کوئی آسان کام نہیں ہے۔ یہ ایک آرکیٹیکچرل چیلنج بن گیا۔ مجھے Abstract Syntax Tree (AST) کے مینیپولیشن، میموری کے استعمال، اور ریکرسو لوپس (recursive loops) کو سنبھالنا پڑا۔

اسٹینڈرڈ پلگ انز کے ساتھ مسئلہ

میں نے حل تلاش کرنے کے لیے تین تجربات کیے۔

تجربہ 1: پلگ ان نے 135 اقسام (types) کو بحال کیا۔ تاہم، اس نے انہیں ایک انٹرنل ماڈیول میں رکھ دیا۔ ہمارا ٹول ان کے لیے ایک الگ فولڈر بنا دیتا تھا۔ ہمیں انہیں دستی طور پر ترتیب دینا پڑا۔ دستاویزات کی ساخت بھی غلط تھی۔

تجربہ 2: میں نے بیرونی اقسام (external types) کو چھپانے کے لیے ایک سیٹنگ آن کی۔ یہ کچھ چیزوں کے لیے کام آیا۔ اس نے پے لوڈ (payload) کو کم کر کے 60 Webpack types تک پہنچا دیا۔ لیکن TypeDoc نے نیسٹڈ ڈیپینڈنسیز (nested dependencies) کو نظر انداز کر دیا۔ اس کی وجہ سے بہت سی اقسام چھپی رہ گئیں جبکہ وہ پھر بھی میموری استعمال کر رہی تھیں۔

تجربہ 3: میں نے اقسام کو ان کے اصل ماڈیولز کے ساتھ دوبارہ نقش (map) کرنے کی کوشش کی۔ اس سے ایک ریکرسو لوپ (recursive loop) پیدا ہوا۔ پلگ ان نیسٹڈ انٹرفیسز کو اس وقت تک نکالتا رہا جب تک کہ اس نے 630 اقسام تخلیق نہیں کر دیں۔ دستاویزات غیر ضروری معلومات (noise) سے بھر گئیں، جس سے صارف کا تجربہ (user experience) خراب ہو گیا۔

حل: ارلی گارج کلیکشن (Early Garbage Collection)

مجھے اضافی شور (noise) کے بغیر اقسام کو ان کے درست ماڈیولز میں چاہیے تھے۔ میں نے آؤٹ پٹ کو ٹھیک کرنے کی کوشش چھوڑ دی اور عمل (process) کو ٹھیک کرنا شروع کر دیا۔

میں نے EVENT_RESOLVE_END نامی ایک ہک (hook) استعمال کیا۔ اس نے مجھے ریزولوشن کے فوراً بعد AST کو روکنے (intercept) کی اجازت دی۔ میں نے یہ کام TypeDoc کے کیٹیگریز تفویض کرنے یا زیادہ میموری استعمال کرنے سے پہلے کیا۔

میرا منطق (logic) تین مراحل پر مشتمل تھا:

نتیجہ: میں نے 240 اہم اقسام کو بچا لیا۔ اب وہ نظر آ رہی ہیں اور درست طریقے سے روٹ کی گئی ہیں۔ میں نے تیسرے تجربے کے ریکرسو شور سے بچنے میں کامیابی حاصل کی۔

سیکھے گئے اسباق

• ASTs کو شروع میں ہی ہینڈل کریں۔ غیر ضروری نوڈز کو ہٹانے سے بعد میں میموری کا ضیاع نہیں ہوتا۔ • ہیکس (hacks) کے بجائے ہکس (hooks) کا استعمال کریں۔ کمپائلر لائف سائیکل کو سمجھنے سے کام صاف ستھرا ہوتا ہے۔ • فیڈ بیک آرکیٹیکچر کو بہتر بناتا ہے۔ مینٹینر کے ریویوز نے مجھے ایک بہتر سسٹم بنانے میں مدد دی۔ • زیادہ ڈیٹا کا مطلب بہتر ہونا نہیں ہے۔ اچھی انجینئرنگ کا مطلب ڈیٹا اور استعمال کے قابل ہونے (usability) کے درمیان توازن تلاش کرنا ہے۔

Source: https://dev.to/moshams272/beyond-missing-exports-building-an-early-garbage-collector-for-webpacks-typedoc-ast-5ep7