ไทย

คู่มือฉบับสมบูรณ์เกี่ยวกับ Web Components ครอบคลุมประโยชน์ การใช้งาน การรองรับของเบราว์เซอร์ และแนวทางปฏิบัติที่ดีที่สุดสำหรับการสร้างองค์ประกอบ UI ที่นำกลับมาใช้ใหม่ได้ในการพัฒนาเว็บสมัยใหม่

Web Components: การสร้างองค์ประกอบที่นำกลับมาใช้ใหม่ได้สำหรับเว็บยุคใหม่

ในภูมิทัศน์ของการพัฒนาเว็บที่เปลี่ยนแปลงอย่างรวดเร็วในปัจจุบัน การสร้างโค้ดที่เป็นโมดูล นำกลับมาใช้ใหม่ได้ และบำรุงรักษาง่ายเป็นสิ่งสำคัญยิ่ง Web Components นำเสนอโซลูชันอันทรงพลังสำหรับการสร้างสิ่งนั้น: องค์ประกอบ UI แบบกำหนดเอง มีการห่อหุ้ม และทำงานร่วมกันได้ ซึ่งสามารถนำไปใช้กับโปรเจกต์เว็บและเฟรมเวิร์กต่างๆ ได้ คู่มือฉบับสมบูรณ์นี้จะเจาะลึกแนวคิดหลักของ Web Components สำรวจประโยชน์ของมัน และให้ตัวอย่างที่ใช้งานได้จริงเพื่อให้คุณเริ่มต้นได้

Web Components คืออะไร?

Web Components คือชุดของมาตรฐานเว็บที่ช่วยให้คุณสามารถสร้างองค์ประกอบ HTML แบบกำหนดเองที่นำกลับมาใช้ใหม่ได้ พร้อมด้วยสไตล์และพฤติกรรมที่ถูกห่อหุ้มไว้ โดยพื้นฐานแล้ว มันช่วยให้คุณสามารถขยายขีดความสามารถของ HTML ได้ด้วยตัวเอง สร้างแท็กที่กำหนดเองซึ่งสามารถใช้งานได้เหมือนกับองค์ประกอบ HTML มาตรฐานอื่นๆ

ลองนึกถึงมันว่าเป็นเหมือนตัวต่อเลโก้สำหรับเว็บ ตัวต่อแต่ละชิ้น (Web Component) แทนฟังก์ชันการทำงานเฉพาะอย่าง และคุณสามารถรวมตัวต่อเหล่านี้เพื่อสร้างส่วนต่อประสานผู้ใช้ที่ซับซ้อนได้ ความงดงามของ Web Components คือความสามารถในการนำกลับมาใช้ใหม่และการแยกส่วน มันสามารถใช้ได้ในโปรเจกต์เว็บใดๆ โดยไม่คำนึงถึงเฟรมเวิร์กที่ใช้ (หรือแม้กระทั่งไม่มีเฟรมเวิร์กเลย) และสไตล์และพฤติกรรมภายในของมันจะไม่ไปรบกวนส่วนที่เหลือของแอปพลิเคชันของคุณ

เทคโนโลยีหลักของ Web Components

Web Components สร้างขึ้นบนเทคโนโลยีหลักสี่อย่าง:

ประโยชน์ของการใช้ Web Components

การนำ Web Components มาใช้ในขั้นตอนการพัฒนาของคุณมีประโยชน์มากมาย:

ตัวอย่างง่ายๆ: การสร้างองค์ประกอบตัวนับแบบกำหนดเอง

เรามาดูตัวอย่างการสร้าง Web Component พื้นฐานกัน: องค์ประกอบตัวนับแบบกำหนดเอง

1. กำหนดคลาสของ Custom Element

ขั้นแรก เรากำหนดคลาส JavaScript ที่ขยายมาจากคลาส `HTMLElement`

class MyCounter extends HTMLElement {
 constructor() {
 super();
 // Attach a shadow DOM to the element.
 this.attachShadow({ mode: 'open' });

 // Initialize the counter value.
 this._count = 0;

 // Create a button element.
 this.button = document.createElement('button');
 this.button.textContent = 'เพิ่มค่า';
 this.shadowRoot.appendChild(this.button);

 //Create a span element to display the count.
 this.span = document.createElement('span');
 this.span.textContent = `จำนวน: ${this._count}`;
 this.shadowRoot.appendChild(this.span);

 // Bind the increment method to the button click event.
 this.button.addEventListener('click', this.increment.bind(this));
 }

 increment() {
 this._count++;
 this.span.textContent = `จำนวน: ${this._count}`;
 }

 connectedCallback() {
 console.log('เชื่อมต่อ custom element เข้ากับ DOM แล้ว');
 }

 disconnectedCallback() {
 console.log('ตัดการเชื่อมต่อ custom element ออกจาก DOM แล้ว');
 }

 adoptedCallback() {
 console.log('ย้าย custom element ไปยัง document ใหม่แล้ว');
 }

 attributeChangedCallback(name, oldValue, newValue) {
 console.log(`Attribute ${name} เปลี่ยนจาก ${oldValue} เป็น ${newValue}`);
 }

 static get observedAttributes() {
 return ['count'];
 }
}

2. กำหนด Shadow DOM

บรรทัด `attachShadow({ mode: 'open' })` จะแนบ Shadow DOM เข้ากับองค์ประกอบ ตัวเลือก `mode: 'open'` ช่วยให้ JavaScript จากภายนอกสามารถเข้าถึง Shadow DOM ได้ ในขณะที่ `mode: 'closed'` จะป้องกันการเข้าถึงจากภายนอก

3. ลงทะเบียน Custom Element

ต่อไป เราจะลงทะเบียน Custom Element กับเบราว์เซอร์โดยใช้เมธอด `customElements.define()`

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

4. การใช้ Custom Element ใน HTML

ตอนนี้คุณสามารถใช้องค์ประกอบ `` ใน HTML ของคุณได้เหมือนกับองค์ประกอบ HTML อื่นๆ

<my-counter></my-counter>

โค้ดนี้จะแสดงผลปุ่มที่มีข้อความว่า "เพิ่มค่า" และ span ที่แสดงจำนวนปัจจุบัน (เริ่มต้นที่ 0) การคลิกปุ่มจะเพิ่มค่าตัวนับและอัปเดตการแสดงผล

เจาะลึก: Shadow DOM และการห่อหุ้ม

Shadow DOM เป็นส่วนสำคัญของ Web Components มันให้การห่อหุ้มโดยการสร้าง DOM tree แยกต่างหากสำหรับคอมโพเนนต์ ซึ่งจะแยกสไตล์และพฤติกรรมของมันออกจากส่วนที่เหลือของหน้า สิ่งนี้จะช่วยป้องกันการขัดแย้งของสไตล์และทำให้แน่ใจว่าคอมโพเนนต์ทำงานตามที่คาดไว้โดยไม่คำนึงถึงสภาพแวดล้อมโดยรอบ

ภายใน Shadow DOM คุณสามารถกำหนดสไตล์ CSS ที่มีผลเฉพาะกับองค์ประกอบภายในของคอมโพเนนต์เท่านั้น สิ่งนี้ช่วยให้คุณสร้างคอมโพเนนต์ที่สมบูรณ์ในตัวเองซึ่งไม่ต้องพึ่งพา CSS stylesheets ภายนอก

ตัวอย่าง: การกำหนดสไตล์ใน Shadow DOM

constructor() {
 super();
 this.attachShadow({ mode: 'open' });

 // Create a style element for the shadow DOM
 const style = document.createElement('style');
 style.textContent = `
 button {
 background-color: #4CAF50;
 color: white;
 padding: 10px 20px;
 border: none;
 cursor: pointer;
 }
 span {
 margin-left: 10px;
 font-weight: bold;
 }
 `;
 this.shadowRoot.appendChild(style);

 // Initialize the counter value.
 this._count = 0;

 // Create a button element.
 this.button = document.createElement('button');
 this.button.textContent = 'เพิ่มค่า';
 this.shadowRoot.appendChild(this.button);

 //Create a span element to display the count.
 this.span = document.createElement('span');
 this.span.textContent = `จำนวน: ${this._count}`;
 this.shadowRoot.appendChild(this.span);

 // Bind the increment method to the button click event.
 this.button.addEventListener('click', this.increment.bind(this));
 }

ในตัวอย่างนี้ สไตล์ CSS ที่กำหนดภายในองค์ประกอบ `style` จะมีผลกับปุ่มและ span ที่อยู่ภายใน Shadow DOM ของคอมโพเนนต์ `my-counter` เท่านั้น สไตล์เหล่านี้จะไม่ส่งผลกระทบต่อปุ่มหรือ span อื่นๆ บนหน้า

HTML Templates: การกำหนดโครงสร้างที่นำกลับมาใช้ใหม่ได้

HTML Templates เป็นวิธีการกำหนดโครงสร้าง HTML ที่นำกลับมาใช้ใหม่ได้ ซึ่งสามารถโคลนและแทรกเข้าไปใน DOM มีประโยชน์อย่างยิ่งสำหรับการสร้างเลย์เอาต์ของคอมโพเนนต์ที่ซับซ้อน

ตัวอย่าง: การใช้ HTML Templates

<template id="counter-template">
 <style>
 button {
 background-color: #4CAF50;
 color: white;
 padding: 10px 20px;
 border: none;
 cursor: pointer;
 }
 span {
 margin-left: 10px;
 font-weight: bold;
 }
 </style>
 <button>เพิ่มค่า</button>
 <span>จำนวน: <span id="count-value">0</span></span>
</template>

<script>
class MyCounter extends HTMLElement {
 constructor() {
 super();
 this.attachShadow({ mode: 'open' });

 const template = document.getElementById('counter-template');
 const templateContent = template.content;
 this.shadowRoot.appendChild(templateContent.cloneNode(true));

 this.button = this.shadowRoot.querySelector('button');
 this.span = this.shadowRoot.querySelector('#count-value');
 this._count = 0;
 this.span.textContent = this._count;
 this.button.addEventListener('click', this.increment.bind(this));
 }

 increment() {
 this._count++;
 this.span.textContent = this._count;
 }
}

customElements.define('my-counter', MyCounter);
</script>

ในตัวอย่างนี้ เราได้กำหนด HTML template ที่มี ID `counter-template` เทมเพลตนี้ประกอบด้วยโครงสร้าง HTML และสไตล์ CSS สำหรับคอมโพเนนต์ตัวนับของเรา ภายในคลาส `MyCounter` เราโคลนเนื้อหาของเทมเพลตและผนวกเข้ากับ Shadow DOM ซึ่งช่วยให้เราสามารถนำโครงสร้างเทมเพลตกลับมาใช้ใหม่ได้สำหรับทุกอินสแตนซ์ของคอมโพเนนต์ `my-counter`

Attributes และ Properties

Web Components สามารถมีได้ทั้ง attributes และ properties โดย attributes จะถูกกำหนดในมาร์กอัป HTML ในขณะที่ properties จะถูกกำหนดในคลาส JavaScript การเปลี่ยนแปลงของ attributes สามารถสะท้อนไปยัง properties ได้ และในทางกลับกัน

ตัวอย่าง: การกำหนดและการใช้ Attributes

class MyGreeting extends HTMLElement {
 constructor() {
 super();
 this.attachShadow({ mode: 'open' });
 this.shadowRoot.innerHTML = `<p>สวัสดี, <span id="name"></span>!</p>`;
 this.nameSpan = this.shadowRoot.querySelector('#name');
 }

 static get observedAttributes() {
 return ['name'];
 }

 attributeChangedCallback(name, oldValue, newValue) {
 if (name === 'name') {
 this.nameSpan.textContent = newValue;
 }
 }
}

customElements.define('my-greeting', MyGreeting);
<my-greeting name="โลก"></my-greeting>
<my-greeting name="อลิซ"></my-greeting>

ในตัวอย่างนี้ เรากำหนด attribute `name` สำหรับคอมโพเนนต์ `my-greeting` getter `observedAttributes` จะบอกเบราว์เซอร์ว่าต้องติดตามการเปลี่ยนแปลงของ attribute ใดบ้าง เมื่อ attribute `name` เปลี่ยนแปลง เมธอด `attributeChangedCallback` จะถูกเรียก และเราจะอัปเดตเนื้อหาขององค์ประกอบ `span` ด้วยชื่อใหม่

Lifecycle Callbacks

Web Components มี lifecycle callbacks หลายตัวที่ช่วยให้คุณสามารถเรียกใช้โค้ดในขั้นตอนต่างๆ ของวงจรชีวิตของคอมโพเนนต์:

callbacks เหล่านี้เป็นโอกาสในการเริ่มต้นการทำงาน, การล้างข้อมูล และงานอื่นๆ ที่เกี่ยวข้องกับวงจรชีวิตของคอมโพเนนต์

ความเข้ากันได้ของเบราว์เซอร์และ Polyfills

Web Components ได้รับการสนับสนุนโดยเบราว์เซอร์สมัยใหม่ทั้งหมด อย่างไรก็ตาม เบราว์เซอร์รุ่นเก่าอาจต้องการ polyfills เพื่อให้มีฟังก์ชันการทำงานที่จำเป็น ไลบรารี polyfill `webcomponents.js` ให้การสนับสนุนที่ครอบคลุมสำหรับ Web Components ในเบราว์เซอร์รุ่นเก่า หากต้องการรวม polyfill ให้ใช้แท็กสคริปต์ต่อไปนี้:

<script src="https://unpkg.com/@webcomponents/webcomponentsjs@2.6.0/webcomponents-loader.js"></script>

โดยทั่วไปแนะนำให้ใช้วิธีการตรวจจับคุณสมบัติ (feature detection) โดยจะโหลด polyfill เฉพาะในกรณีที่เบราว์เซอร์ไม่รองรับ Web Components โดยกำเนิด

เทคนิคขั้นสูงและแนวทางปฏิบัติที่ดีที่สุด

การประกอบคอมโพเนนต์ (Component Composition)

Web Components สามารถนำมาประกอบเข้าด้วยกันเพื่อสร้างองค์ประกอบ UI ที่ซับซ้อนยิ่งขึ้นได้ สิ่งนี้ช่วยให้คุณสร้างแอปพลิเคชันที่เป็นโมดูลและนำกลับมาใช้ใหม่ได้อย่างสูง

การจัดการอีเวนต์ (Event Handling)

Web Components สามารถส่งและรับฟัง custom events ได้ ซึ่งช่วยให้คอมโพเนนต์สามารถสื่อสารกันเองและกับส่วนที่เหลือของแอปพลิเคชันได้

การผูกข้อมูล (Data Binding)

แม้ว่า Web Components จะไม่มีกลไกการผูกข้อมูลในตัว แต่คุณสามารถใช้การผูกข้อมูลโดยใช้โค้ดที่กำหนดเองหรือโดยการผสานรวมกับไลบรารีการผูกข้อมูล

การเข้าถึงได้ (Accessibility)

สิ่งสำคัญคือต้องแน่ใจว่า Web Components ของคุณสามารถเข้าถึงได้โดยผู้ใช้ทุกคน รวมถึงผู้ที่มีความพิการ ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดด้านการเข้าถึงได้เมื่อออกแบบและใช้งานคอมโพเนนต์ของคุณ

Web Components ในโลกแห่งความเป็นจริง: ตัวอย่างจากนานาชาติ

Web Components กำลังถูกใช้งานโดยบริษัทและองค์กรต่างๆ ทั่วโลกเพื่อสร้างส่วนต่อประสานผู้ใช้ที่ทันสมัยและนำกลับมาใช้ใหม่ได้ นี่คือตัวอย่างบางส่วน:

นี่เป็นเพียงตัวอย่างเล็กๆ น้อยๆ ของวิธีการใช้ Web Components ในโลกแห่งความเป็นจริง เทคโนโลยีกำลังได้รับการยอมรับเพิ่มขึ้นเรื่อยๆ เนื่องจากนักพัฒนาตระหนักถึงประโยชน์ของมันในการสร้างเว็บแอปพลิเคชันที่เป็นโมดูล นำกลับมาใช้ใหม่ได้ และปรับขนาดได้

สรุป

Web Components นำเสนอแนวทางที่ทรงพลังในการสร้างองค์ประกอบ UI ที่นำกลับมาใช้ใหม่ได้สำหรับเว็บยุคใหม่ ด้วยการใช้ประโยชน์จาก custom elements, shadow DOM และ HTML templates คุณสามารถสร้างคอมโพเนนต์ที่สมบูรณ์ในตัวเองซึ่งสามารถนำไปใช้กับโปรเจกต์และเฟรมเวิร์กต่างๆ ได้ การยอมรับ Web Components สามารถนำไปสู่เว็บแอปพลิเคชันที่เป็นโมดูล บำรุงรักษาง่าย และปรับขนาดได้มากขึ้น ในขณะที่มาตรฐานเว็บมีการพัฒนาอย่างต่อเนื่อง Web Components จะยังคงมีบทบาทสำคัญในการกำหนดอนาคตของการพัฒนาเว็บ

เรียนรู้เพิ่มเติม

เริ่มทดลองกับ Web Components วันนี้และปลดล็อกพลังขององค์ประกอบ UI ที่นำกลับมาใช้ใหม่ได้ในโปรเจกต์การพัฒนาเว็บของคุณ!

Web Components: การสร้างองค์ประกอบที่นำกลับมาใช้ใหม่ได้สำหรับเว็บยุคใหม่ | MLOG