हिन्दी

विभिन्न वेब एप्लीकेशंस के लिए पुन: प्रयोज्य और एनकैप्सुलेटेड UI कंपोनेंट्स बनाने हेतु, कस्टम एलिमेंट्स पर ध्यान केंद्रित करते हुए, वेब कंपोनेंट्स की शक्ति का अन्वेषण करें।

वेब कंपोनेंट्स: कस्टम एलिमेंट्स का एक गहन अवलोकन

वेब कंपोनेंट्स वेब डेवलपमेंट में एक महत्वपूर्ण प्रगति का प्रतिनिधित्व करते हैं, जो पुन: प्रयोज्य और एनकैप्सुलेटेड UI कंपोनेंट्स बनाने का एक मानकीकृत तरीका प्रदान करते हैं। वेब कंपोनेंट्स बनाने वाली मुख्य तकनीकों में, कस्टम एलिमेंट्स नए HTML टैग को कस्टम व्यवहार और रेंडरिंग के साथ परिभाषित करने के लिए आधारशिला के रूप में खड़े हैं। यह व्यापक गाइड कस्टम एलिमेंट्स की जटिलताओं में delves करती है, आधुनिक वेब अनुप्रयोगों के निर्माण के लिए उनके लाभों, कार्यान्वयन और सर्वोत्तम प्रथाओं की खोज करती है।

वेब कंपोनेंट्स क्या हैं?

वेब कंपोनेंट्स वेब मानकों का एक सेट है जो डेवलपर्स को पुन: प्रयोज्य, एनकैप्सुलेटेड और इंटरऑपरेबल HTML एलिमेंट्स बनाने की अनुमति देता है। वे वेब डेवलपमेंट के लिए एक मॉड्यूलर दृष्टिकोण प्रदान करते हैं, जो कस्टम UI कंपोनेंट्स के निर्माण को सक्षम करते हैं जिन्हें विभिन्न परियोजनाओं और फ्रेमवर्क में आसानी से साझा और पुन: उपयोग किया जा सकता है। वेब कंपोनेंट्स के पीछे की मुख्य प्रौद्योगिकियों में शामिल हैं:

कस्टम एलिमेंट्स को समझना

कस्टम एलिमेंट्स वेब कंपोनेंट्स के केंद्र में हैं, जो डेवलपर्स को अपने स्वयं के एलिमेंट्स के साथ HTML शब्दावली का विस्तार करने में सक्षम बनाते हैं। ये कस्टम एलिमेंट्स मानक HTML एलिमेंट्स की तरह व्यवहार करते हैं, लेकिन उन्हें विशिष्ट एप्लिकेशन आवश्यकताओं के अनुरूप बनाया जा सकता है, जो अधिक लचीलापन और कोड संगठन प्रदान करते हैं।

कस्टम एलिमेंट्स को परिभाषित करना

एक कस्टम एलिमेंट को परिभाषित करने के लिए, आपको customElements.define() विधि का उपयोग करने की आवश्यकता है। यह विधि दो तर्क लेती है:

  1. एलिमेंट का नाम: एक स्ट्रिंग जो कस्टम एलिमेंट के नाम का प्रतिनिधित्व करती है। मानक HTML एलिमेंट्स के साथ टकराव से बचने के लिए नाम में एक हाइफ़न (-) होना चाहिए। उदाहरण के लिए, my-element एक मान्य नाम है, जबकि myelement नहीं है।
  2. एलिमेंट क्लास: एक जावास्क्रिप्ट क्लास जो HTMLElement का विस्तार करती है और कस्टम एलिमेंट के व्यवहार को परिभाषित करती है।

यहाँ एक मूल उदाहरण है:

class MyElement extends HTMLElement {
  constructor() {
    super();
    this.innerHTML = 'Hello, World!';
  }
}

customElements.define('my-element', MyElement);

इस उदाहरण में, हम my-element नामक एक कस्टम एलिमेंट को परिभाषित करते हैं। MyElement क्लास HTMLElement का विस्तार करती है और कंस्ट्रक्टर में एलिमेंट के इनर HTML को "Hello, World!" पर सेट करती है।

कस्टम एलिमेंट लाइफसाइकल कॉलबैक

कस्टम एलिमेंट्स में कई लाइफसाइकल कॉलबैक होते हैं जो आपको एलिमेंट के जीवनचक्र के विभिन्न चरणों में कोड निष्पादित करने की अनुमति देते हैं। ये कॉलबैक एलिमेंट को इनिशियलाइज़ करने, एट्रिब्यूट परिवर्तनों पर प्रतिक्रिया देने और एलिमेंट को DOM से हटाए जाने पर संसाधनों को साफ करने के अवसर प्रदान करते हैं।

यहाँ लाइफसाइकल कॉलबैक के उपयोग का प्रदर्शन करने वाला एक उदाहरण है:

class MyElement extends HTMLElement {
  constructor() {
    super();
    this.shadow = this.attachShadow({mode: 'open'});
  }

  connectedCallback() {
    this.shadow.innerHTML = `<p>Connected to the DOM!</p>`;
    console.log('Element connected');
  }

  disconnectedCallback() {
    console.log('Element disconnected');
  }

  static get observedAttributes() { return ['data-message']; }

  attributeChangedCallback(name, oldValue, newValue) {
    if (name === 'data-message') {
      this.shadow.innerHTML = `<p>${newValue}</p>`;
    }
  }
}

customElements.define('my-element', MyElement);

इस उदाहरण में, connectedCallback() कंसोल पर एक संदेश लॉग करता है और एलिमेंट के DOM से कनेक्ट होने पर उसके इनर HTML को सेट करता है। disconnectedCallback() एलिमेंट के डिस्कनेक्ट होने पर एक संदेश लॉग करता है। attributeChangedCallback() तब कॉल किया जाता है जब data-message एट्रिब्यूट बदलता है, तदनुसार एलिमेंट की सामग्री को अपडेट करता है। observedAttributes गेटर निर्दिष्ट करता है कि हम data-message एट्रिब्यूट में परिवर्तनों का निरीक्षण करना चाहते हैं।

एनकैप्सुलेशन के लिए शैडो DOM का उपयोग करना

शैडो DOM वेब कंपोनेंट्स के लिए एनकैप्सुलेशन प्रदान करता है, जिससे आप एक कंपोनेंट के लिए एक अलग DOM ट्री बना सकते हैं जो बाकी पेज से अलग होता है। इसका मतलब है कि शैडो DOM के भीतर परिभाषित स्टाइल और स्क्रिप्ट बाकी पेज को प्रभावित नहीं करेंगे, और इसके विपरीत भी। यह एनकैप्सुलेशन टकराव को रोकने में मदद करता है और यह सुनिश्चित करता है कि आपके कंपोनेंट्स अनुमानित रूप से व्यवहार करें।

शैडो DOM का उपयोग करने के लिए, आप एलिमेंट पर attachShadow() विधि को कॉल कर सकते हैं। यह विधि एक विकल्प ऑब्जेक्ट लेती है जो शैडो DOM के मोड को निर्दिष्ट करती है। mode या तो 'open' या 'closed' हो सकता है। यदि मोड 'open' है, तो शैडो DOM को जावास्क्रिप्ट से एलिमेंट की shadowRoot प्रॉपर्टी का उपयोग करके एक्सेस किया जा सकता है। यदि मोड 'closed' है, तो शैडो DOM को जावास्क्रिप्ट से एक्सेस नहीं किया जा सकता है।

यहाँ शैडो DOM के उपयोग का प्रदर्शन करने वाला एक उदाहरण है:

class MyElement extends HTMLElement {
  constructor() {
    super();
    this.shadow = this.attachShadow({ mode: 'open' });
    this.shadow.innerHTML = `
      <style>
        p {
          color: blue;
        }
      </style>
      <p>This is inside the Shadow DOM.</p>
    `;
  }
}

customElements.define('my-element', MyElement);

इस उदाहरण में, हम mode: 'open' के साथ एलिमेंट से एक शैडो DOM संलग्न करते हैं। फिर हम शैडो DOM के इनर HTML को एक स्टाइल शामिल करने के लिए सेट करते हैं जो पैराग्राफ का रंग नीला कर देता है और कुछ टेक्स्ट के साथ एक पैराग्राफ एलिमेंट। शैडो DOM के भीतर परिभाषित स्टाइल केवल शैडो DOM के भीतर के एलिमेंट्स पर लागू होगी, और शैडो DOM के बाहर के पैराग्राफ को प्रभावित नहीं करेगी।

कस्टम एलिमेंट्स का उपयोग करने के लाभ

कस्टम एलिमेंट्स वेब डेवलपमेंट के लिए कई लाभ प्रदान करते हैं:

कस्टम एलिमेंट्स के व्यावहारिक उदाहरण

आइए कुछ व्यावहारिक उदाहरणों का पता लगाएं कि कैसे कस्टम एलिमेंट्स का उपयोग सामान्य UI कंपोनेंट्स बनाने के लिए किया जा सकता है।

एक सरल काउंटर कंपोनेंट

यह उदाहरण दिखाता है कि कस्टम एलिमेंट्स का उपयोग करके एक सरल काउंटर कंपोनेंट कैसे बनाया जाए।

class Counter extends HTMLElement {
  constructor() {
    super();
    this.shadow = this.attachShadow({ mode: 'open' });
    this._count = 0;
    this.render();
  }

  connectedCallback() {
    this.shadow.querySelector('.increment').addEventListener('click', () => {
      this.increment();
    });
    this.shadow.querySelector('.decrement').addEventListener('click', () => {
      this.decrement();
    });
  }

  increment() {
    this._count++;
    this.render();
  }

  decrement() {
    this._count--;
    this.render();
  }

  render() {
    this.shadow.innerHTML = `
      <style>
        .counter {
          display: flex;
          align-items: center;
        }
        button {
          padding: 5px 10px;
          margin: 0 5px;
        }
      </style>
      <div class="counter">
        <button class="decrement">-</button>
        <span>${this._count}</span>
        <button class="increment">+</button>
      </div>
    `;
  }
}

customElements.define('my-counter', Counter);

यह कोड एक Counter क्लास को परिभाषित करता है जो HTMLElement का विस्तार करता है। कंस्ट्रक्टर कंपोनेंट को इनिशियलाइज़ करता है, एक शैडो DOM संलग्न करता है, और प्रारंभिक गिनती को 0 पर सेट करता है। connectedCallback() विधि इंक्रीमेंट और डिक्रीमेंट बटन में इवेंट श्रोताओं को जोड़ती है। increment() और decrement() विधियाँ गिनती को अपडेट करती हैं और कंपोनेंट के रेंडरिंग को अपडेट करने के लिए render() विधि को कॉल करती हैं। render() विधि शैडो DOM के इनर HTML को काउंटर डिस्प्ले और बटन शामिल करने के लिए सेट करती है।

एक इमेज कैरोसेल कंपोनेंट

यह उदाहरण दिखाता है कि कस्टम एलिमेंट्स का उपयोग करके एक इमेज कैरोसेल कंपोनेंट कैसे बनाया जाए। संक्षिप्तता के लिए, इमेज स्रोत प्लेसहोल्डर हैं और इन्हें एपीआई, सीएमएस या स्थानीय भंडारण से गतिशील रूप से लोड किया जा सकता है। स्टाइलिंग को भी न्यूनतम कर दिया गया है।

class ImageCarousel extends HTMLElement {
 constructor() {
  super();
  this.shadow = this.attachShadow({ mode: 'open' });
  this._images = [
  'https://via.placeholder.com/350x150',
  'https://via.placeholder.com/350x150/0077bb',
  'https://via.placeholder.com/350x150/00bb77',
  ];
  this._currentIndex = 0;
  this.render();
 }

 connectedCallback() {
  this.shadow.querySelector('.prev').addEventListener('click', () => {
  this.prevImage();
  });
  this.shadow.querySelector('.next').addEventListener('click', () => {
  this.nextImage();
  });
 }

 nextImage() {
  this._currentIndex = (this._currentIndex + 1) % this._images.length;
  this.render();
 }

 prevImage() {
  this._currentIndex = (this._currentIndex - 1 + this._images.length) % this._images.length;
  this.render();
 }

 render() {
  this.shadow.innerHTML = `
  <style>
  .carousel {
  display: flex;
  flex-direction: column;
  align-items: center;
  }
  img {
  max-width: 350px;
  max-height: 150px;
  }
  .controls {
  margin-top: 10px;
  }
  button {
  padding: 5px 10px;
  }
  </style>
  <div class="carousel">
  <img src="${this._images[this._currentIndex]}" alt="Carousel Image">
  <div class="controls">
  <button class="prev">Previous</button>
  <button class="next">Next</button>
  </div>
  </div>
  `;
 }
}

customElements.define('image-carousel', ImageCarousel);

यह कोड एक ImageCarousel क्लास को परिभाषित करता है जो HTMLElement का विस्तार करता है। कंस्ट्रक्टर कंपोनेंट को इनिशियलाइज़ करता है, एक शैडो DOM संलग्न करता है, और प्रारंभिक इमेज ऐरे और वर्तमान इंडेक्स को सेट करता है। connectedCallback() विधि पिछले और अगले बटनों में इवेंट श्रोताओं को जोड़ती है। nextImage() और prevImage() विधियाँ वर्तमान इंडेक्स को अपडेट करती हैं और कंपोनेंट के रेंडरिंग को अपडेट करने के लिए render() विधि को कॉल करती हैं। render() विधि शैडो DOM के इनर HTML को वर्तमान इमेज और बटन शामिल करने के लिए सेट करती है।

कस्टम एलिमेंट्स के साथ काम करने के लिए सर्वोत्तम प्रथाएं

कस्टम एलिमेंट्स के साथ काम करते समय पालन करने के लिए यहां कुछ सर्वोत्तम प्रथाएं दी गई हैं:

कस्टम एलिमेंट्स और फ्रेमवर्क

कस्टम एलिमेंट्स को अन्य वेब तकनीकों और फ्रेमवर्क के साथ इंटरऑपरेबल होने के लिए डिज़ाइन किया गया है। उनका उपयोग React, Angular, और Vue.js जैसे लोकप्रिय फ्रेमवर्क के साथ किया जा सकता है।

React में कस्टम एलिमेंट्स का उपयोग करना

React में कस्टम एलिमेंट्स का उपयोग करने के लिए, आप उन्हें किसी भी अन्य HTML एलिमेंट की तरह प्रस्तुत कर सकते हैं। हालांकि, आपको अंतर्निहित DOM एलिमेंट तक पहुंचने और उसके साथ सीधे इंटरैक्ट करने के लिए एक रेफ का उपयोग करने की आवश्यकता हो सकती है।

import React, { useRef, useEffect } from 'react';

function MyComponent() {
  const myElementRef = useRef(null);

  useEffect(() => {
    if (myElementRef.current) {
      // Access the custom element's API
      myElementRef.current.addEventListener('custom-event', (event) => {
        console.log('Custom event received:', event.detail);
      });
    }
  }, []);

  return <my-element ref={myElementRef}></my-element>;
}

export default MyComponent;

इस उदाहरण में, हम my-element कस्टम एलिमेंट तक पहुंचने और उसमें एक इवेंट श्रोता जोड़ने के लिए एक रेफ का उपयोग करते हैं। यह हमें कस्टम एलिमेंट द्वारा भेजे गए कस्टम ईवेंट को सुनने और तदनुसार प्रतिक्रिया देने की अनुमति देता है।

Angular में कस्टम एलिमेंट्स का उपयोग करना

Angular में कस्टम एलिमेंट्स का उपयोग करने के लिए, आपको कस्टम एलिमेंट को पहचानने के लिए Angular को कॉन्फ़िगर करने की आवश्यकता है। यह मॉड्यूल के कॉन्फ़िगरेशन में schemas ऐरे में कस्टम एलिमेंट जोड़कर किया जा सकता है।

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent],
  schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class AppModule { }

एक बार कस्टम एलिमेंट पंजीकृत हो जाने के बाद, आप इसे अपने Angular टेम्प्लेट में किसी भी अन्य HTML एलिमेंट की तरह उपयोग कर सकते हैं।

Vue.js में कस्टम एलिमेंट्स का उपयोग करना

Vue.js भी मूल रूप से कस्टम एलिमेंट्स का समर्थन करता है। आप उन्हें बिना किसी विशेष कॉन्फ़िगरेशन के सीधे अपने टेम्प्लेट में उपयोग कर सकते हैं।

<template>
  <my-element></my-element>
</template>

<script>
export default {
  name: 'MyComponent'
}
</script>

Vue स्वचालित रूप से कस्टम एलिमेंट को पहचान लेगा और इसे सही ढंग से प्रस्तुत करेगा।

एक्सेसिबिलिटी संबंधी विचार

कस्टम एलिमेंट्स का निर्माण करते समय, यह सुनिश्चित करने के लिए एक्सेसिबिलिटी पर विचार करना महत्वपूर्ण है कि आपके कंपोनेंट्स विकलांग लोगों सहित सभी के लिए उपयोग करने योग्य हों। यहाँ कुछ प्रमुख एक्सेसिबिलिटी संबंधी विचार दिए गए हैं:

अंतर्राष्ट्रीयकरण और स्थानीयकरण

एक वैश्विक दर्शक के लिए कस्टम एलिमेंट्स विकसित करते समय, अंतर्राष्ट्रीयकरण (i18n) और स्थानीयकरण (l10n) पर विचार करना महत्वपूर्ण है। यहाँ कुछ प्रमुख विचार दिए गए हैं:

निष्कर्ष

कस्टम एलिमेंट्स पुन: प्रयोज्य और एनकैप्सुलेटेड UI कंपोनेंट्स बनाने के लिए एक शक्तिशाली उपकरण हैं। वे वेब डेवलपमेंट के लिए कई लाभ प्रदान करते हैं, जिनमें पुन: प्रयोज्यता, एनकैप्सुलेशन, इंटरऑपरेबिलिटी, रखरखाव और प्रदर्शन शामिल हैं। इस गाइड में उल्लिखित सर्वोत्तम प्रथाओं का पालन करके, आप आधुनिक वेब अनुप्रयोगों के निर्माण के लिए कस्टम एलिमेंट्स का लाभ उठा सकते हैं जो मजबूत, रखरखाव योग्य और वैश्विक दर्शकों के लिए सुलभ हैं। जैसे-जैसे वेब मानक विकसित होते रहेंगे, वेब कंपोनेंट्स, जिनमें कस्टम एलिमेंट्स शामिल हैं, मॉड्यूलर और स्केलेबल वेब अनुप्रयोगों के निर्माण के लिए तेजी से महत्वपूर्ण होते जाएंगे।

वेब के भविष्य का निर्माण करने के लिए कस्टम एलिमेंट्स की शक्ति को अपनाएं, एक समय में एक कंपोनेंट। यह सुनिश्चित करने के लिए कि आपके कंपोनेंट्स हर जगह, सभी के द्वारा उपयोग किए जा सकें, एक्सेसिबिलिटी, अंतर्राष्ट्रीयकरण और स्थानीयकरण पर विचार करना याद रखें।

वेब कंपोनेंट्स: कस्टम एलिमेंट्स का एक गहन अवलोकन | MLOG