Web Components 是浏览器原生支持的组件化标准,由 Custom Elements、Shadow DOM 和 HTML Templates 三大技术组成,实现可复用、自治、隔离的 UI 单元;它无需框架即可跨平台运行,支持跨框架使用与 SEO,是补足底层能力的原生组件化方案。
JavaScript 实现组件化,核心是封装可复用、自治、隔离的 UI 单元;Web Components 是浏览器原生支持的一套标准 API,让开发者能创建真正独立的自定义 HTML 元素。
它不是单一技术,而是由三个规范协同工作的组合:
),支持生命周期回调(connectedCallback、disconnectedCallback 等)
HTML Templates( 和 ):声明不立即渲染的 DOM 片段,配合 实现内容分发(类似 Vue 的 slot 或 React 的 children)以下代码定义了一个带默认文本、可接收属性、有自己样式的按钮组件:
class MyButton extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: 'open' });
const template = document.createElement('template');
template.innerHTML = `
`;
shadow.appendChild(template.content.cloneNode(true));
}
static get observedAttributes() {
return ['disabled'];
}
attributeChangedCallback(name, oldValue, newValue) {
if (name === 'disabled') {
this.shadowRoot.querySelector('button').disabled = newValue !== null;
}
}
}
customElements.define('my-button', MyButton);
使用时只需:,它会自动渲染、响应属性变化,且样式不会影响页面其他部分。
不同于 React/Vue 等框架的组件抽象,Web Components 直接运行在浏览器引擎层:
,Vue 项目也能用)纯原生写法略繁琐,推荐结合工具提升体验:
my-company-button)避免命名冲突,便于团队共享组件库基本上就这些。不复杂但容易忽略的是:Web Components 不是替代框架,而是补足底层能力——它让组件真正“可移植”,也让框架更专注上层交互逻辑。