Web Components:原生组件化开发新趋势
💡 适合谁看:想了解Web组件、零基础入门前端开发的小伙伴。通过这篇教程,你将掌握什么是Web Components,并用它做出属于自己的第一个组件!
一、开篇:Web Components 究竟是个啥?

想象一下,你在乐高玩具店买了几套积木,每一块积木都有自己的形状和功能,你可以把它们随意组合成你想做的模型——房子、汽车、机器人……是不是很方便?
Web Components 就是网页世界的“乐高积木”。
它有什么用?
- 可以创建自定义的HTML标签(比如
<my-button>) - 组件封装好后,随时复用
- 在任何前端框架中都能使用,不依赖Vue/React/Angular等库
简而言之:Web Components = 原生+可复用的UI组件
二、环境准备:搭建你的第一台“组件工厂”

我们不需要安装复杂工具,只需要一个文本编辑器和浏览器就可以了!
🧰 工具推荐
- 文本编辑器:VS Code(免费又强大)
- 浏览器:Chrome / Edge(最好带开发者工具)
✅ 搭建步骤:
新建一个文件夹:比如叫
web-components-demo里面新建三个文件:
index.html—— 页面入口style.css—— 样式文件components.js—— 放我们写的组件代码
编辑
index.html内容如下:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>我的第一个 Web Component</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- 后面我们会在这里插入组件 -->
<h1>欢迎来到组件世界!</h1>
<script type="module" src="components.js"></script>
</body>
</html>
- 打开浏览器,双击打开
index.html或者用 VS Code 的 Live Server 插件预览页面。
✅ 到这里,你的“组件工厂”已经准备好了!
三、核心概念:三大神器帮你打造组件世界

要使用 Web Components,主要用到以下三项技术:
🔹 自定义元素(Custom Elements)
这是 Web Components 的核心:可以自定义 HTML 标签。
比如我们可以写一个按钮组件 <my-button>,然后在页面上直接使用:
<my-button>点我试试</my-button>
实现方式:
我们要继承 HTMLElement 类并注册我们的组件。
// components.js
class MyButton extends HTMLElement {
constructor() {
super();
// 创建一个按钮元素
const button = document.createElement('button');
button.textContent = this.getAttribute('text') || '默认文字'; // 支持传入 text 属性
button.style.padding = '10px 20px';
button.style.background = '#4CAF50';
button.style.color = 'white';
button.style.border = 'none';
button.style.cursor = 'pointer';
// 点击事件
button.addEventListener('click', () => {
alert('你点击了按钮!');
});
// 添加到组件中
this.attachShadow({ mode: 'open' }); // 创建影子 DOM
this.shadowRoot.appendChild(button);
}
}
// 注册组件
customElements.define('my-button', MyButton);
使用方法:
<!-- index.html 中 -->
<my-button text="绿色按钮"></my-button>
✅ 效果:会显示一个绿色按钮,点击后弹出提示框!
🔹 影子DOM(Shadow DOM)
影子DOM就像是组件自己的小世界。它不会受到外界样式影响,也不会影响外部文档。
比如我们给按钮设置了背景色为绿色,即使整个页面用了一个红色主题CSS,这个按钮的颜色也不会被改掉。
✨ 技术关键词:
this.attachShadow({ mode: 'open' })
🔹 HTML模板(Template)
有时候我们需要多个结构相似的组件,就可以使用 <template> 标签来预先定义内容。
举个例子,我们写一个新闻卡片组件:
<!-- index.html -->
<template id="news-card-template">
<div class="card">
<h3>标题:科技新闻</h3>
<p>内容:AI正改变我们的生活。</p>
</div>
</template>
然后在 JS 中调用它:
// components.js
class NewsCard extends HTMLElement {
constructor() {
super();
const template = document.getElementById('news-card-template').content;
const shadowRoot = this.attachShadow({ mode: 'open' });
shadowRoot.appendChild(template.cloneNode(true));
}
}
customElements.define('news-card', NewsCard);
在 HTML 中使用:
<news-card></news-card>
🎉 看!是不是出现了一个小小的新闻卡片?
四、实战项目:制作一个“点赞按钮”组件
我们将做一个简单的交互组件:点击按钮,显示点赞数。
步骤 1:写 JavaScript 创建组件
// components.js
class LikeButton extends HTMLElement {
constructor() {
super();
this.likeCount = 0;
const button = document.createElement('button');
button.textContent = '👍 点赞 (' + this.likeCount + ')';
button.style.margin = '10px';
button.style.fontSize = '16px';
button.addEventListener('click', () => {
this.likeCount++;
button.textContent = '👍 点赞 (' + this.likeCount + ')';
});
this.attachShadow({ mode: 'open' });
this.shadowRoot.appendChild(button);
}
}
customElements.define('like-button', LikeButton);
步骤 2:在 HTML 中使用
<!-- index.html -->
<like-button></like-button>
🎉 运行效果:每次点击按钮,点赞数增加!
五、常见问题解答 🤔
Q1:为什么用 Web Components 而不是 Vue/React?
- Web Components 是原生支持的技术,兼容性好,适用于各种框架或无框架项目。
- 如果你不想引入大型框架,或者希望组件能跨项目复用,这是一个很好的选择。
Q2:组件样式会不会影响全局?
✅ 不会!因为用了 Shadow DOM,组件内部的 CSS 只作用于组件自身,不会污染全局。
Q3:能不能用 ES6+ 特性?
当然可以!只要你用的是现代浏览器,并且脚本类型设为 type="module"。
Q4:能不能传数据进来?
可以!可以用 attributes、props 或者 slot 来传递信息。
例如:
<my-button text="提交" color="#f44336"></my-button>
六、学习建议:下一步往哪走?
学会了基本的 Web Components 后,你可以深入以下几个方向:
✅ 1. 学习使用 slot 插槽
让你的组件更灵活,可以插入任意内容。
✅ 2. 掌握生命周期方法
如 connectedCallback(),disconnectedCallback() 等,用于处理组件挂载、销毁逻辑。
✅ 3. 结合模块化开发
学会用 import/export 方式组织组件结构。
✅ 4. 与主流框架结合使用
尝试在 Vue、React 中使用你定义的 Web Components。
总结一下 📌
| 技术 | 用途 |
|---|---|
| Custom Elements | 创建自定义 HTML 标签 |
| Shadow DOM | 组件样式的隔离 |
| Template 标签 | 预定义内容结构 |
通过这篇文章,你应该学会了:
- 什么是 Web Components
- 如何创建一个组件
- 如何让它在页面上工作起来
- 解决了一些新手常见的疑问
现在是时候动手去创造你自己的“网页乐高”啦!
🎯 小目标挑战:试着用 Web Components 做一个输入框验证组件吧!
别忘了:边学边实践才是成长最快的路 😊

评论 0