Web Components:原生组件化开发新趋势

程序员的月亮
2025-06-24 15:08
阅读 389

开篇:Web Components 是什么,它能做什么?

开篇:Web Components 是什么,它能做什么?

如果你刚开始学习前端开发,可能会听说过一个词叫“组件化”。你可以把它理解为“搭积木”式的编程方式——我们把网页中的各个部分封装成一个个独立的小块(也就是组件),然后像搭积木一样组合起来。

Web Components 就是浏览器原生提供的一套组件化技术。它的特别之处在于:它是浏览器直接支持的功能,不需要依赖任何框架(如 React、Vue 等)就可以实现自定义组件。

这意味着:

  • 你写的组件可以在任意项目中使用(无论是 React 还是 Vue 项目);
  • 没有外部依赖,代码更轻量;
  • 一旦掌握,你将真正理解前端组件化的底层原理。

是不是很酷?那我们就开始入门吧!


环境准备:搭建最简单的开发环境

环境准备:搭建最简单的开发环境

第一步:安装文本编辑器

推荐使用 Visual Studio Code(简称 VS Code)。它免费、功能强大、社区活跃,非常适合初学者。

安装步骤如下:

  1. 打开上面的链接;
  2. 根据你的操作系统下载安装包;
  3. 安装完成后打开它。

第二步:创建一个项目文件夹

在电脑上新建一个空的文件夹,比如叫做 web-components-tutorial

在这个文件夹中,再创建两个文件:

  • index.html
  • main.js

内容暂时为空,后面我们会逐步填充。

第三步:用浏览器运行代码

最简单的做法是:

  1. 在 VS Code 中打开这个文件夹;
  2. 右键点击 index.html 文件,选择“Open with Live Server”;

    如果没有这个选项,请先在 VS Code 的扩展市场搜索并安装 “Live Server” 插件。

  3. 浏览器会自动弹出页面,显示你的网页内容。

这样我们就准备好了一个可以写和运行 Web Components 的基础环境啦!


核心概念:用简单语言解释 Web Components 的三个关键技术

Web Components 不是一个单独的技术,而是由三个主要 API 组合而成的:

1. 自定义元素(Custom Elements)

这是 Web Components 的核心。我们可以用它来自定义 HTML 元素,例如 <my-button>,就像 <button> 一样直接使用。

示例代码:

<!-- index.html -->
<my-button>点我</my-button>
// main.js
class MyButton extends HTMLElement {
  constructor() {
    super();
    
    const button = document.createElement('button');
    button.textContent = this.textContent;

    // 把按钮添加到当前元素内部
    this.appendChild(button);
  }
}

// 注册新标签
customElements.define('my-button', MyButton);

这段代码做了什么?

  • 我们创建了一个类 MyButton,继承了 HTML 原生元素;
  • 在构造函数里,我们创建了一个真实的 <button>
  • 最后注册了这个自定义标签名 my-button

刷新浏览器,你会看到一个按钮,文字是从标签里拿的。是不是很神奇?

✅ 新手提示:

问:为什么要用 class 和 extends? 答:这些是 JavaScript 的面向对象语法,我们是在创建一种新的 HTML 元素类型。虽然看起来有点难,但它其实只是固定写法,照着写就行!


2. Shadow DOM(影子文档对象模型)

Shadow DOM 让你的组件拥有“私有的样式和结构”,不受外部影响,也避免被其他代码干扰。

比如:你在组件内部写的样式,不会影响全局页面;别人写的 CSS 也不会乱改你组件里的样子。

示例代码:

// main.js
class MyButton extends HTMLElement {
  constructor() {
    super();

    // 创建 Shadow DOM
    const shadow = this.attachShadow({ mode: 'open' });

    // 创建按钮元素
    const button = document.createElement('button');
    button.textContent = this.textContent;

    // 添加样式
    const style = document.createElement('style');
    style.textContent = `
      button {
        background-color: #007bff;
        color: white;
        padding: 10px 20px;
        border-radius: 5px;
        border: none;
        cursor: pointer;
      }
    `;

    // 将按钮和样式放入 Shadow DOM 中
    shadow.appendChild(style);
    shadow.appendChild(button);
  }
}

customElements.define('my-button', MyButton);

刷新浏览器后你会发现:

  • 按钮有蓝色背景和白色文字;
  • 即使你之后加了别的 CSS,这个按钮仍然不变样。

这就是 Shadow DOM 的作用,给你组件“独享”的样式空间!


3. HTML 模板(