Web Components:原生组件化开发新趋势(零基础教程)
开篇:Web Components 是什么?

在前端开发中,组件化是一个非常重要的概念。你可以把它想象成“乐高积木”——每一个组件就像一块积木,可以被多次使用、组合,来构建出完整的网页。
而 Web Components 就是浏览器原生提供的一套标准,让我们可以用纯 HTML、CSS 和 JavaScript 来创建“自定义的、可复用的网页组件”。
换句话说:
你不再依赖 React、Vue 或 Angular 也能写出结构清晰、易于维护的组件。
听起来是不是很酷?而且 Web Components 是浏览器内置支持的技术,这意味着:
✅ 可以不依赖任何框架使用
✅ 跨项目、跨框架复用性强
✅ 更贴近原生 Web 标准
接下来,我们就开始从零开始学习它吧!
环境准备:搭建你的第一个 Web Components 开发环境

新手友好提醒:这一部分虽然看着技术性较强,但其实非常简单,跟着操作就行 😊
步骤一:安装 VS Code(推荐代码编辑器)
- 打开浏览器,访问 https://code.visualstudio.com
- 下载对应系统的版本并安装
- 安装完成后打开 VS Code(不需要写代码,先配置开发环境)
步骤二:准备一个本地服务器
因为 Web Components 中某些功能需要通过服务器运行才能看到效果(比如 <template> 的加载),所以我们需要一个简单的本地服务器。
最简单的方式是使用 Live Server 插件:
- 在 VS Code 中,点击左侧“扩展”按钮(或按下
Ctrl + Shift + X) - 搜索 “Live Server”
- 安装插件
- 创建一个项目文件夹(比如命名为
my-components),然后在其中新建index.html - 编写一点测试内容:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>Hello Web Components</title>
</head>
<body>
<h1>你好,这是我的第一个 Web Components 页面!</h1>
</body>
</html>
- 右键点击页面 → “Open with Live Server”,这样就启动了一个小型服务器,浏览器自动打开页面。
🎉 成功了!你的 Web Components 开发环境已经准备好啦!
核心概念:用通俗的语言解释关键技术

为了让大家更好地理解 Web Components,我们需要认识几个核心概念:
1. Custom Elements(自定义元素)
这个就像是你自己定义的一种新的 HTML 标签。例如你可以创建一个:
<my-button>点击我</my-button>
而不是传统的写法:
<button class="my-btn">点击我</button>
💡 自定义标签必须包含一个短横线 -,比如 custom-component 这样的命名规则是为了避免与未来的新 HTML 标签冲突。
✅ 示例:创建一个最基本的自定义组件
class MyButton extends HTMLElement {
constructor() {
super();
this.innerHTML = `
<button style="padding: 10px; background: #4CAF50; color: white;">
${this.textContent}
</button>
`;
}
}
customElements.define('my-button', MyButton);
然后在 HTML 中使用:
<my-button>提交数据</my-button>
👉 结果:浏览器会显示一个绿色背景的按钮。
2. Shadow DOM(影子 DOM)
Shadow DOM 是一种将 HTML 元素封装起来的方法,让它们样式和结构不被外界干扰。
举个例子:如果你写了个组件,并且在里面加了 <style>, 你希望它的样式只对组件自己有效,不想影响全局页面。
✨ 那 Shadow DOM 就帮你做到这一点!
✅ 示例:使用 Shadow DOM 给组件加样式
class MyCard extends HTMLElement {
constructor() {
super();
// 创建一个 shadow root
const shadow = this.attachShadow({ mode: 'open' });
// 创建组件内部的内容
const div = document.createElement('div');
div.innerHTML = `
<style>
div {
border: 1px solid #ccc;
padding: 20px;
margin: 10px 0;
background: #f9f9f9;
}
</style>
<div>${this.textContent}</div>
`;
// 把内容添加到 shadow root 中
shadow.appendChild(div);
}
}
customElements.define('my-card', MyCard);
HTML 使用:
<my-card>这是一个卡片内容</my-card>
👉 结果:你会看到一个带样式的小卡片,并且它的样式不会影响其他部分。
3. HTML Templates(模板标签)
HTML 中有一个特殊的标签叫 <template>,它是用来存放一段不会立即渲染的内容。
你可以把组件的结构写在这里面,等到需要用的时候再拿出来渲染。
这有点像“预制菜”,你想吃时拿去热一下就行了 😄
✅ 示例:结合 <template> 和组件
<template id="hello-template">
<p style="color: blue;">Hello from template!</p>
</template>
<script>
class HelloComponent extends HTMLElement {
constructor() {
super();
const template = document.getElementById('hello-template').content;
const clone = document.importNode(template, true);
this.attachShadow({ mode: 'open' }).appendChild(clone);
}
}

customElements.define('hello-component', HelloComponent);
</script>
HTML 使用:
<hello-component></hello-component>
👉 结果:页面上出现了一段蓝色的文字。
4. ES Modules(模块化编程)
在现代网页中,我们可以使用 import/export 来组织 JS 文件,这叫做 ES Modules。这对于大型项目来说非常重要。
但在本地直接使用 ES Modules 时需要注意文件协议不是 http://,所以建议你在服务器环境下运行,如上面提到的 Live Server。
✅ 示例:使用模块化方式导入组件
假设我们在项目目录下有两个文件:
components/my-button.jsindex.html
// components/my-button.js
class MyButton extends HTMLElement {
constructor() {
super();
this.innerHTML = `<button>${this.textContent}</button>`;
}
}
customElements.define('my-button', MyButton);
<!-- index.html -->
<script type="module">
import './components/my-button.js';
</script>
<my-button>点击我</my-button>
只要运行在服务器上,就会正常显示按钮 👍
实战项目:做个天气组件练手
现在我们来实战做一个小项目:天气信息展示组件
第一步:创建模板 HTML
在 index.html 里写一个空壳页面:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>天气组件示例</title>
</head>
<body>
<weather-card city="上海" temperature="22°C"></weather-card>
<script type="module" src="components/weather-card.js"></script>
</body>
</html>
第二步:编写组件逻辑
创建文件 components/weather-card.js:
class WeatherCard extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: 'open' });
// 获取属性
const city = this.getAttribute('city') || '未知城市';
const temp = this.getAttribute('temperature') || '未知温度';
// 构造 HTML
const template = `
<style>
.card {
border: 1px solid #ddd;
padding: 20px;
width: 200px;
font-family: sans-serif;
}
.title {
font-weight: bold;
}
.temp {
color: #2e7d32;
}
</style>
<div class="card">
<div class="title">${city}</div>
<div class="temp">${temp}</div>
</div>
`;
shadow.innerHTML = template;
}
}
customElements.define('weather-card', WeatherCard);
刷新页面后,你应该会看到一个绿色字体的卡片,写着“上海”和“22°C”。
🎉 恭喜你完成了第一个真正可用的 Web Components!
常见问题解答(FAQ)
🧠 Q1:为什么自定义标签名要加短横线?
答:这是为了避免和现有或未来的 HTML 标签发生冲突。例如如果你写了一个叫 <list> 的组件,万一未来 HTML 新增了 <list> 标签,就可能冲突了。所以规范要求必须使用至少一个短横线 -,比如 <my-list>。
🧠 Q2:Shadow DOM 和普通 DOM 有什么区别?
答:Shadow DOM 是隔离的作用域,里面的东西不会影响外部,也不会被外部样式污染。非常适合做组件封装。而普通 DOM 是公开的,样式、JavaScript 都能修改。
🧠 Q3:能否在 React/Vue 项目里使用 Web Components?
答:当然可以!Web Components 是平台标准,React、Vue、Angular 都支持使用。只不过如果你想创建一个完全独立于框架的组件,那就可以试试 Web Components 啦!
🧠 Q4:是否支持所有浏览器?
答:目前主流浏览器都支持 Web Components 标准,包括 Chrome、Firefox、Edge、Safari。如果你要兼容老旧 IE 浏览器(比如 IE11),就需要借助 Polyfill 来兼容。
学习建议:下一步怎么学?
掌握了 Web Components 的基础之后,以下是一些进阶方向:
✅ 学习资源推荐
- MDN Web Docs:
- YouTube 教程:
- 搜索 "Web Components Tutorial"
- GitHub 项目:
- 查看开源组件库,如:lit.dev
✅ 推荐进阶知识点
- 使用 Lit 库简化开发流程(谷歌出品)
- 深入了解 Slot 插槽机制,实现内容投影
- 使用 CSS Shadow Parts 实现更灵活的样式控制
- 学习如何与 Vue、React 集成使用
总结

在这篇文章中,我们一起了解了:
- 什么是 Web Components
- 如何搭建一个适合开发的环境
- 四个核心概念:自定义元素、Shadow DOM、HTML Template、模块化
- 亲手做了第一个组件:天气卡片
- 解答了一些常见问题
- 给出了下一步的学习建议
相信你现在已经对 Web Components 有了一个基本的认识。尽管它看起来不像 React、Vue 那样“火爆”,但作为一个原生标准,它具有极强的通用性和持久的生命力。
🌟 记住一句话:
学会了 Web Components,你就掌握了一种“无需框架也能打造优雅组件”的能力!
继续加油,前端世界还有更多好玩的东西等着你去探索 ❤️
📌 如果你觉得这篇教程对你有帮助,请收藏 + 分享给更多想入门 Web Components 的小伙伴吧~

评论 0