نحن معجبين بـ العناصر المخصصة حول هنا. تصميمهم يجعلهم قابلة بشكل خاص للتحميل البطيء، والتي يمكن أن تكون نعمة للأداء.
مستوحاة من زميل التجارب ، لقد شرعت مؤخرًا في كتابة أداة تحميل آلية بسيطة: عندما يظهر عنصر مخصص في DOM ، نريد تحميل التنفيذ المقابل إذا لم يكن متاحًا بعد. ثم يعتني المتصفح بترقية هذه العناصر من هناك فصاعدًا.
من المحتمل أنك لن تحتاج بالفعل إلى كل هذا ؛ عادة ما يكون هناك نهج أبسط. إذا تم استخدامها بشكل متعمد ، فقد تظل التقنيات الموضحة هنا إضافة مفيدة لمجموعة أدواتك.
لتحقيق الاتساق ، نريد أن يكون برنامج التحميل التلقائي لدينا عنصرًا مخصصًا أيضًا - مما يعني أيضًا أنه يمكننا تهيئته بسهولة عبر HTML. لكن أولاً ، دعنا نحدد تلك العناصر المخصصة التي لم يتم حلها ، خطوة بخطوة:
class AutoLoader extends HTMLElement { connectedCallback() { let scope = this.parentNode; this.discover(scope); }
}
customElements.define("ce-autoloader", AutoLoader);
بافتراض أننا قمنا بتحميل هذه الوحدة مقدمًا (باستخدام async
مثالي) ، يمكننا إسقاط ملف <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
طريقة لحقن ديناميكي <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
يفترض عنوان URL الخاص بالسمة وجود دليل حيث توجد جميع تعريفات العناصر المخصصة (على سبيل المثال <my-widget>
→ /components/my-widget.js
). يمكننا أن نتوصل إلى استراتيجيات أكثر تفصيلاً ، لكن هذا جيد بما يكفي لأغراضنا. يسمح ربط عنوان URL هذا بطريقة منفصلة بالتصنيفات الفرعية الخاصة بالمشروع عند الحاجة:
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 - أو بالأحرى ، الشجرة الفرعية الخاصة بنا - والتي نستخدمها بعد ذلك لإعادة تشغيل عملية الاكتشاف. (قد تجادل بأننا نعيد اختراع العناصر المخصصة هنا ، وستكون على صواب.)
اللودر الأوتوماتيكي لدينا يعمل الآن بكامل طاقته. قد تنظر التحسينات المستقبلية في ظروف السباق المحتملة والتحقق من التحسينات. لكن الاحتمالات جيدة بما يكفي لمعظم السيناريوهات. اسمحوا لي أن أعرف في التعليقات إذا كان لديك نهج مختلف ويمكننا مقارنة الملاحظات!
- محتوى مدعوم من تحسين محركات البحث وتوزيع العلاقات العامة. تضخيم اليوم.
- بلاتوبلوكشين. Web3 Metaverse Intelligence. تضخيم المعرفة. الوصول هنا.
- المصدر https://css-tricks.com/an-approach-to-lazy-loading-custom-elements/
- 1
- a
- من نحن
- فوق
- حسابي
- في الواقع
- وأضاف
- إضافة
- الكل
- تخفيف
- يسمح
- سابقا
- و
- نهج
- تجادل
- حول
- متاح
- المتصفح
- المرشحين
- لا تستطيع
- يهمني
- حذر
- فرص
- التحقق
- طفل
- فئة
- تأتي
- تعليقات
- قارن
- الشروط
- وعاء
- اتفاقية
- المقابلة
- استطاع
- الدورة
- على
- تصميم
- مختلف
- اكتشاف
- وثيقة
- لا
- DOM
- قطرة
- حيوي
- أسهل
- بسهولة
- توضيح
- عناصر
- كاف
- خطأ
- الأثير (ETH)
- EV
- حتى
- كل
- إلا
- ذو تكلفة باهظة
- فشل
- المشجعين
- الاسم الأول
- تبدأ من
- تماما
- وظيفي
- مستقبل
- الذهاب
- خير
- رئيس
- هنا
- HTML
- HTTPS
- المثالي
- تحديد
- فورا
- تنفيذ
- التنفيذ
- تحقيق
- in
- بدلًا من ذلك
- بحث
- IT
- جافا سكريبت
- وظيفة
- نوع
- علم
- الطول
- مما سيحدث
- القليل
- تحميل
- جار التحميل
- بحث
- الرئيسية
- جعل
- يصنع
- يعني
- طريقة
- ربما
- مفقود
- وحدة
- الأكثر من ذلك
- أكثر
- خطوة
- موزيلا
- متعدد
- حاجة
- بحاجة
- جديد
- العقدة
- جزء
- أداء
- أفلاطون
- الذكاء افلاطون البيانات
- أفلاطون داتا
- بلايستشن
- المزيد
- محتمل
- المحتمل
- عملية المعالجة
- أغراض
- سباق
- مؤخرا
- إزالة
- هؤلاء
- عائد أعلى
- جذر
- سيناريوهات
- نطاق
- يبدو
- مستقل
- طقم
- ينبغي
- أظهرت
- الاشارات
- عزباء
- So
- شيء
- بداية
- خطوة
- لا يزال
- استراتيجيات
- هذه
- مدعومة
- TAG
- يأخذ
- تقنيات
- •
- من مشاركة
- الأشياء
- تفكير
- إلى
- صحيح
- تحديث
- ترقية
- URI
- URL
- us
- تستخدم
- عادة
- بواسطة
- التي
- سوف
- للعمل
- أعمال
- جاري الكتابة
- حل متجر العقارات الشامل الخاص بك في جورجيا
- زفيرنت