Web Components는 재사용 가능하고 캡슐화된 커스텀 HTML element를 만들기 위한 네이티브 브라우저 API 집합으로, 프레임워크에 구애받지 않고 표준에 기반합니다. 세 가지 기술이 결합됩니다.
- — 동작을 가진 자신만의 tag를 정의합니다.
<template>, <slot>) — 비활성의 재사용 가능한 마크업입니다.class UserCard extends HTMLElement {
connectedCallback() { // 라이프사이클: 페이지에 추가될 때 실행된다
const shadow = this.attachShadow({ mode: "open" }); // shadow DOM 생성
shadow.innerHTML = `
<style> h2 { color: blue; } </style>
<h2>${this.getAttribute("name")}</h2>
<slot></slot>
`;
}
}
customElements.define("user-card", UserCard); // 이름에 반드시 하이픈이 있어야 한다
<user-card name="Ann">Extra content goes in the slot</user-card>
shadow root 내부의 스타일은 스코프됩니다. 페이지의 CSS가 안으로 들어올 수 없고, 컴포넌트의 CSS가 밖으로 새지 않습니다. 이것은 전역 CSS 문제를 네이티브로 해결합니다.
/* 페이지 CSS */ h2 { color: red; } /* user-card 안의 <h2>에 영향을 주지 않는다 */
connectedCallback() // DOM에 추가됨
disconnectedCallback() // DOM에서 제거됨 (정리)
attributeChangedCallback(name, old, val) // 관찰 중인 attribute가 변경됨
static get observedAttributes() { return ["name"]; }
Web Components는 진짜 스타일/DOM 캡슐화와 함께 어떤 프레임워크에서든(또는 프레임워크 없이) 동작하는 재사용 위젯을 만들게 해줍니다. 서로 다른 스택을 쓰는 팀들이 공유하는 디자인 시스템과 마이크로 프론트엔드에 이상적입니다.
Shoelace 같은 라이브러리가 프레임워크에 구애받지 않는 컴포넌트를 출시하는 방식이기도 합니다.
트레이드오프(장황한 API, SSR/스타일링 복잡성) 때문에 앱 개발자들은 여전히 React/Vue를 선호하는 경우가 많지만, 이 플랫폼 기본 요소는 강력하고 표준에 기반합니다.