Web Components үндэс
Web Components бол браузерт суурилсан технологи бөгөөд дахин ашиглах боломжтой захиалгат HTML элемент үүсгэх боломж олгодог. Ямар нэг framework шаардахгүй — цэвэр JavaScript, HTML, CSS-ээр л хийнэ.
Web Components гурван үндсэн технологиос бүрдэнэ:
Custom Elements — өөрийн <my-card> гэх мэт шинэ HTML tag үүсгэнэ.
Shadow DOM — компонентын дотоод DOM-г гаднаас тусгаарлана. Стиль "нэвчихгүй".
HTML Template — <template> ба <slot> — шаблон бэлтгэх механизм.
Custom Element үүсгэх
Custom element үүсгэхийн тулд HTMLElement-г өргөтгөсөн JavaScript класс бичнэ.
<!-- index.html -->
<hello-world name="Болд"></hello-world>
<script>
class HelloWorld extends HTMLElement {
// Элемент DOM-д нэмэгдэхэд дуудагдана
connectedCallback() {
const name = this.getAttribute('name') || 'дэлхий';
this.innerHTML = `<p>Сайн уу, ${name}!</p>`;
}
}
// Браузерт шинэ tag бүртгэнэ — нэр дор заавал зураас (-) агуулна
customElements.define('hello-world', HelloWorld);
</script>
Хөтчид <hello-world name="Болд"> бичихэд <p>Сайн уу, Болд!</p> болж харагдана.
Shadow DOM — тусгаарлалт
Shadow DOM нь компонентын дотоод DOM-г гаднаас нуудаг. Тус компонентын CSS нь хуудасны бусад элементэд нөлөөлөхгүй, мөн гаднаас ч нөлөөлөгдөхгүй.
<color-badge color="green" label="Амжилт"></color-badge>
<script>
class ColorBadge extends HTMLElement {
connectedCallback() {
// Shadow root үүсгэнэ — 'open' бол JS-ээс хандаж болно
const shadow = this.attachShadow({ mode: 'open' });
const color = this.getAttribute('color') || 'gray';
const label = this.getAttribute('label') || '';
// Shadow DOM дотор стиль бичнэ — гадагшаа "нэвчихгүй"
shadow.innerHTML = `
<style>
span {
display: inline-block;
padding: 4px 12px;
border-radius: 9999px;
background: ${color};
color: white;
font-size: 14px;
}
</style>
<span>${label}</span>
`;
}
}
customElements.define('color-badge', ColorBadge);
</script>
template ба slot ашиглах
<template> нь браузер задлан шинжилдэг боловч дэлгэцэнд харуулдаггүй шаблон юм. <slot> нь компонент ашиглагч нь агуулга дамжуулах "нүх" юм.
<!-- Шаблон — хуудсанд харагдахгүй -->
<template id="card-template">
<style>
.card {
border: 1px solid #ccc;
border-radius: 8px;
padding: 16px;
margin: 8px;
}
h2 { margin: 0 0 8px; }
</style>
<div class="card">
<!-- slot: ашиглагчаас ирэх агуулга орно -->
<h2><slot name="title">Гарчиггүй</slot></h2>
<p><slot name="body">Агуулга байхгүй</slot></p>
</div>
</template>
<!-- Компонент ашиглах -->
<info-card>
<span slot="title">HTML курс</span>
<span slot="body">Вэбийн бүтцийг сурна.</span>
</info-card>
<script>
class InfoCard extends HTMLElement {
connectedCallback() {
const shadow = this.attachShadow({ mode: 'open' });
// Шаблоныг хуулбарлан shadow DOM-д нэмнэ
const template = document.getElementById('card-template');
shadow.appendChild(template.content.cloneNode(true));
}
}
customElements.define('info-card', InfoCard);
</script>
Lifecycle callback-ууд
Custom element-д дөрвөн тусгай callback байдаг:
class MyElement extends HTMLElement {
// DOM-д нэмэгдэхэд
connectedCallback() {
console.log('Элемент нэмэгдлэн');
}
// DOM-оос хасагдахад
disconnectedCallback() {
console.log('Элемент хасагдлан');
}
// Attribute өөрчлөгдөхөд — observedAttributes жагсаалтад байгаа attribute-д л дуудагдана
attributeChangedCallback(name, oldValue, newValue) {
console.log(`${name}: ${oldValue} → ${newValue}`);
}
// Аль attribute-г ажиглах
static get observedAttributes() {
return ['color', 'label'];
}
}
Web Components хэзээ ашиглах вэ?
Web Components нь React, Vue гэх мэт framework-гүйгээр дахин ашиглагдах UI блок хийхэд тохиромжтой. Гэхдээ өнөөдөр ихэнх томоохон төсөл framework ашигладаг тул Web Components-г голдуу дизайн систем, widget, эсвэл framework-аас хамааралгүй компонент хийхэд ашигладаг.
Дараагийн хичээлд:
HTML-ийн гүйцэтгэлийн оновчлолыг судална — script defer/async, preload, prefetch, lazy loading зэрэг хуудасны ачаалах хурдад нөлөөлдөг аргуудыг үзнэ.