کے ہم پرستار ہیں۔ کسٹم عناصر یہاں کے ارد گرد. ان کا ڈیزائن انہیں بناتا ہے۔ خاص طور پر سست لوڈنگ کے لیے قابل عمل، جو کارکردگی کے لیے ایک اعزاز ثابت ہو سکتا ہے۔
طرف سے حوصلہ افزائی ایک ساتھی کی تجربات، میں نے حال ہی میں ایک سادہ آٹو لوڈر لکھنے کے بارے میں ترتیب دیا ہے: جب بھی DOM میں کوئی حسب ضرورت عنصر ظاہر ہوتا ہے، ہم متعلقہ نفاذ کو لوڈ کرنا چاہتے ہیں اگر یہ ابھی دستیاب نہیں ہے۔ براؤزر پھر ایسے عناصر کو وہاں سے اپ گریڈ کرنے کا خیال رکھتا ہے۔
امکانات یہ ہیں کہ آپ کو درحقیقت ان سب کی ضرورت نہیں ہوگی۔ عام طور پر ایک آسان طریقہ ہے. جان بوجھ کر استعمال کیا گیا، یہاں دکھائی گئی تکنیک اب بھی آپ کے ٹول سیٹ میں مفید اضافہ ہو سکتی ہے۔
مستقل مزاجی کے لیے، ہم چاہتے ہیں کہ ہمارا آٹو لوڈر بھی حسب ضرورت عنصر ہو — جس کا مطلب یہ بھی ہے کہ ہم اسے HTML کے ذریعے آسانی سے کنفیگر کر سکتے ہیں۔ لیکن پہلے، آئیے ان حل شدہ حسب ضرورت عناصر کی شناخت کریں، مرحلہ وار:
class AutoLoader extends HTMLElement { connectedCallback() { let scope = this.parentNode; this.discover(scope); }
}
customElements.define("ce-autoloader", AutoLoader);
یہ فرض کرتے ہوئے کہ ہم نے اس ماڈیول کو اوپر سے لوڈ کیا ہے (استعمال کرتے ہوئے async
مثالی ہے)، ہم a چھوڑ سکتے ہیں۔ <ce-autoloader>
میں عنصر <body>
ہماری دستاویز کا۔ یہ فوری طور پر کے تمام بچوں کے عناصر کے لیے دریافت کا عمل شروع کر دے گا۔ <body>
، جو اب ہمارا بنیادی عنصر تشکیل دیتا ہے۔ ہم شامل کرکے دریافت کو اپنی دستاویز کے ذیلی درخت تک محدود کرسکتے ہیں۔ <ce-autoloader>
اس کے بجائے متعلقہ کنٹینر عنصر پر — درحقیقت، ہمارے پاس مختلف ذیلی درختوں کے لیے متعدد مثالیں بھی ہو سکتی ہیں۔
یقینا، ہمیں ابھی بھی اس پر عمل درآمد کرنا ہے۔ discover
طریقہ (کے حصے کے طور پر AutoLoader
اوپر کی کلاس):
discover(scope) { let candidates = [scope, ...scope.querySelectorAll("*")]; for(let el of candidates) { let tag = el.localName; if(tag.includes("-") && !customElements.get(tag)) { this.load(tag); } }
}
یہاں ہم ہر ایک نسل کے ساتھ اپنے جڑ عنصر کو چیک کرتے ہیں (*
)۔ اگر یہ حسب ضرورت عنصر ہے — جیسا کہ ہائفینیٹڈ ٹیگز سے اشارہ کیا گیا ہے — لیکن ابھی تک اپ گریڈ نہیں کیا گیا ہے، تو ہم متعلقہ تعریف کو لوڈ کرنے کی کوشش کریں گے۔ DOM سے اس طرح استفسار کرنا مہنگا پڑ سکتا ہے، اس لیے ہمیں تھوڑا محتاط رہنا چاہیے۔ ہم اس کام کو موخر کر کے مرکزی دھاگے پر بوجھ کو کم کر سکتے ہیں:
connectedCallback() { let scope = this.parentNode; requestIdleCallback(() => { this.discover(scope); });
}
requestIdleCallback
ابھی تک عالمی طور پر تعاون یافتہ نہیں ہے، لیکن ہم استعمال کر سکتے ہیں۔ requestAnimationFrame
فال بیک کے طور پر:
let defer = window.requestIdleCallback || requestAnimationFrame; class AutoLoader extends HTMLElement { connectedCallback() { let scope = this.parentNode; defer(() => { this.discover(scope); }); } // ...
}
اب ہم لاپتہ کو نافذ کرنے کی طرف بڑھ سکتے ہیں۔ load
متحرک طور پر انجیکشن لگانے کا طریقہ a <script>
عنصر:
load(tag) { let el = document.createElement("script"); let res = new Promise((resolve, reject) => { el.addEventListener("load", ev => { resolve(null); }); el.addEventListener("error", ev => { reject(new Error("failed to locate custom-element definition")); }); }); el.src = this.elementURL(tag); document.head.appendChild(el); return res;
} elementURL(tag) { return `${this.rootDir}/${tag}.js`;
}
میں سخت کوڈڈ کنونشن کو نوٹ کریں۔ elementURL
. src
attribute کا URL فرض کرتا ہے کہ ایک ڈائریکٹری ہے جہاں تمام حسب ضرورت عنصر کی تعریفیں رہتی ہیں (مثال کے طور پر <my-widget>
→ /components/my-widget.js
)۔ ہم مزید وسیع حکمت عملی کے ساتھ آ سکتے ہیں، لیکن یہ ہمارے مقاصد کے لیے کافی ہے۔ اس یو آر ایل کو الگ طریقہ پر منتقل کرنے سے ضرورت پڑنے پر پروجیکٹ کے لیے مخصوص ذیلی کلاسنگ کی اجازت ملتی ہے:
class FancyLoader extends AutoLoader { elementURL(tag) { // fancy logic }
}
کسی بھی طرح، نوٹ کریں کہ ہم پر بھروسہ کر رہے ہیں۔ this.rootDir
. یہ وہ جگہ ہے جہاں مذکورہ بالا کنفیگرایبلٹی آتی ہے۔ آئیے ایک متعلقہ گیٹر شامل کریں
get rootDir() { let uri = this.getAttribute("root-dir"); if(!uri) { throw new Error("cannot auto-load custom elements: missing `root-dir`"); } if(uri.endsWith("/")) { // remove trailing slash return uri.substring(0, uri.length - 1); } return uri;
}
آپ شاید سوچ رہے ہوں گے۔ observedAttributes
اب، لیکن یہ واقعی چیزوں کو آسان نہیں بناتا ہے۔ پلس اپ ڈیٹ کرنا root-dir
رن ٹائم پر ایسا لگتا ہے کہ ہمیں کبھی ضرورت نہیں ہوگی۔
اب ہم اپنی عناصر کی ڈائرکٹری کو تشکیل دے سکتے ہیں - اور ضروری ہے: <ce-autoloader root-dir="/components">
.
اس سے ہمارا آٹو لوڈر اپنا کام کر سکتا ہے۔ سوائے اس کے کہ یہ صرف ایک بار کام کرتا ہے، ان عناصر کے لیے جو پہلے سے موجود ہوتے ہیں جب آٹو لوڈر شروع کیا جاتا ہے۔ ہم ممکنہ طور پر متحرک طور پر شامل کردہ عناصر کا بھی محاسبہ کرنا چاہیں گے۔ وہیں ہے۔ MutationObserver
کھیل میں آتا ہے:
connectedCallback() { let scope = this.parentNode; defer(() => { this.discover(scope); }); let observer = this._observer = new MutationObserver(mutations => { for(let { addedNodes } of mutations) { for(let node of addedNodes) { defer(() => { this.discover(node); }); } } }); observer.observe(scope, { subtree: true, childList: true });
} disconnectedCallback() { this._observer.disconnect();
}
اس طرح، براؤزر ہمیں مطلع کرتا ہے جب بھی کوئی نیا عنصر DOM میں ظاہر ہوتا ہے — یا اس کے بجائے، ہمارے متعلقہ ذیلی درخت — جسے ہم دریافت کے عمل کو دوبارہ شروع کرنے کے لیے استعمال کرتے ہیں۔ (آپ یہ بحث کر سکتے ہیں کہ ہم یہاں حسب ضرورت عناصر کو دوبارہ ایجاد کر رہے ہیں، اور آپ درست ہوں گے۔)
ہمارا آٹو لوڈر اب مکمل طور پر فعال ہے۔ مستقبل میں اضافہ ممکنہ نسل کے حالات کو دیکھ سکتا ہے اور اصلاح کی تحقیقات کر سکتا ہے۔ لیکن امکانات یہ ہیں کہ یہ زیادہ تر منظرناموں کے لیے کافی ہے۔ مجھے تبصرے میں بتائیں اگر آپ کا نقطہ نظر مختلف ہے اور ہم نوٹوں کا موازنہ کر سکتے ہیں!
- SEO سے چلنے والا مواد اور PR کی تقسیم۔ آج ہی بڑھا دیں۔
- پلیٹو بلاک چین۔ Web3 Metaverse Intelligence. علم میں اضافہ۔ یہاں تک رسائی حاصل کریں۔
- ماخذ: https://css-tricks.com/an-approach-to-lazy-loading-custom-elements/
- 1
- a
- ہمارے بارے میں
- اوپر
- اکاؤنٹ
- اصل میں
- شامل کیا
- اس کے علاوہ
- تمام
- کم
- کی اجازت دیتا ہے
- پہلے ہی
- اور
- نقطہ نظر
- بحث
- ارد گرد
- دستیاب
- براؤزر
- امیدواروں
- نہیں کر سکتے ہیں
- پرواہ
- ہوشیار
- مشکلات
- چیک کریں
- بچے
- طبقے
- کس طرح
- تبصروں
- موازنہ
- حالات
- کنٹینر
- کنونشن
- اسی کے مطابق
- سکتا ہے
- کورس
- اپنی مرضی کے
- ڈیزائن
- مختلف
- دریافت
- دستاویز
- نہیں کرتا
- ڈوم
- چھوڑ
- متحرک طور پر
- آسان
- آسانی سے
- تفصیل
- عناصر
- کافی
- خرابی
- Ether (ETH)
- EV
- بھی
- ہر کوئی
- اس کے علاوہ
- مہنگی
- ناکام
- کے پرستار
- پہلا
- سے
- مکمل طور پر
- فنکشنل
- مستقبل
- جا
- اچھا
- سر
- یہاں
- HTML
- HTTPS
- مثالی
- شناخت
- فوری طور پر
- پر عملدرآمد
- نفاذ
- پر عمل درآمد
- in
- کے بجائے
- کی تحقیقات
- IT
- جاوا سکرپٹ
- ایوب
- بچے
- جان
- لمبائی
- LIMIT
- تھوڑا
- لوڈ
- لوڈ کر رہا ہے
- دیکھو
- مین
- بنا
- بناتا ہے
- کا مطلب ہے کہ
- طریقہ
- شاید
- لاپتہ
- ماڈیول
- زیادہ
- سب سے زیادہ
- منتقل
- موزیلا
- ایک سے زیادہ
- ضرورت ہے
- ضرورت
- نئی
- نوڈ
- حصہ
- کارکردگی
- پلاٹا
- افلاطون ڈیٹا انٹیلی جنس
- پلیٹو ڈیٹا
- کھیلیں
- علاوہ
- ممکنہ
- شاید
- عمل
- مقاصد
- ریس
- حال ہی میں
- ہٹا
- متعلقہ
- واپسی
- جڑ
- منظرنامے
- گنجائش
- لگتا ہے
- علیحدہ
- مقرر
- ہونا چاہئے
- دکھایا گیا
- سادہ
- ایک
- So
- کچھ
- شروع کریں
- مرحلہ
- ابھی تک
- حکمت عملیوں
- اس طرح
- تائید
- TAG
- لیتا ہے
- تکنیک
- ۔
- ان
- چیزیں
- سوچنا
- کرنے کے لئے
- سچ
- اپ ڈیٹ
- اعلی درجے کی
- URI
- URL
- us
- استعمال کی شرائط
- عام طور پر
- کی طرف سے
- جس
- گے
- کام
- کام کرتا ہے
- تحریری طور پر
- اور
- زیفیرنیٹ