Web Components:原生组件化开发新趋势(面向零基础初学者)

前端搬砖侠
2025-06-22 19:08
阅读 290

开篇:Web Components 是什么?有什么用?

开篇:Web Components 是什么?有什么用?

你可能听说过一些前端框架,比如 React、Vue、Angular 等等。它们都能帮你快速构建页面,但都需要额外引入一大堆工具和库。

那有没有一种方式,可以让你不依赖这些框架,也能像搭积木一样搭建网页呢?当然有!它就是 Web Components

Web Components 是浏览器原生支持的一种创建可复用 HTML 组件的技术。简单来说,你可以把一个按钮、一个下拉菜单、一段动画效果等,封装成一个独立的组件,然后在任何网页中像使用普通 HTML 标签一样来使用它。

例如,你可以创建自己的 <my-button> 标签,然后这样使用:

<my-button>点我试试</my-button>

是不是很酷?而且这个组件不需要任何框架,只要浏览器支持标准 HTML,就能运行!


环境准备:手把手教你搭建开发环境

环境准备:手把手教你搭建开发环境

✅ 准备工作

开始前,你需要准备以下工具:

  1. 一台电脑(Windows / Mac / Linux 都行)
  2. 浏览器(推荐 Chrome 或 Edge)
  3. 代码编辑器(推荐 VS Code
  4. 无需安装额外插件或依赖库!

🛠️ 步骤一:新建项目文件夹

打开你的电脑,新建一个文件夹,比如叫 web-components-demo

📄 步骤二:创建基础文件结构

在这个文件夹里创建三个文件:

  • index.html —— 页面主文件
  • style.css —— 页面样式文件
  • main.js —— JavaScript 主文件

结构如下:

web-components-demo/
├── index.html
├── style.css
└── main.js

🚀 步骤三:写一点测试代码看看是否正常运行

打开 index.html 文件,输入以下内容:

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8" />
  <title>我的第一个 Web Components 项目</title>
  <script type="module" src="main.js"></script>
</head>
<body>
  <h1>Hello World</h1>
</body>
</html>

打开浏览器,在地址栏输入文件路径(如:file:///C:/path/to/web-components-demo/index.html),看到 “Hello World” 就说明环境没问题了!


核心概念:什么是 Web Components 的三大支柱?

核心概念:什么是 Web Components 的三大支柱?

Web Components 由三项核心技术组成,这三项技术是它的“三大支柱”,也是我们理解它原理的关键。

🔹 1. 自定义元素(Custom Elements)

这是 Web Components 最核心的部分。允许你自定义新的 HTML 元素标签。

举个例子:你想做一个带图标的按钮 <icon-button>,就可以通过 Custom Elements 创建它。

示例代码:定义一个最简单的自定义元素

main.js 中添加如下代码:

class MyButton extends HTMLElement {
  constructor() {
    super();
    
    // 创建一个 button 元素
    const button = document.createElement('button');
    button.textContent = '我是按钮';
    
    // 插入到自定义元素内部
    this.appendChild(button);
  }
}

// 注册组件,名字必须包含短横线
customElements.define('my-button', MyButton);

然后在 index.html 中使用:

<my-button></my-button>

刷新页面,你会看到一个自定义按钮出现啦!

📌 小贴士:自定义元素的名字必须包含短横线 -,比如 my-button,不能只用 button


🔹 2. Shadow DOM(影子 DOM)

Shadow DOM 可以将组件的内容与外界隔离开来,保证样式互不影响,就像一个小黑盒。

比如,你在组件中写了红色字体样式,外面不会受到干扰。

示例代码:为组件添加 Shadow DOM

修改 main.js

class MyButton extends HTMLElement {
  constructor() {
    super();

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

    // 创建 button 和样式
    const button = document.createElement('button');
    button.textContent = '我是 Shadow 按钮';

    const style = document.createElement('style');
    style.textContent = `
      button {
        background-color: lightblue;
        color: darkred;
        padding: 10px 20px;
        border: none;
        border-radius: 5px;
        cursor: pointer;
      }
    `;

    shadow.appendChild(style);
    shadow.appendChild(button);
  }
}

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

刷新页面,现在按钮变成了蓝色背景+红色文字,并且不受外部 CSS 影响。


🔹 3. HTML 模板(Template & Slot)

如果你想给组件传递内容,比如按钮里的文字,可以用 <slot>。HTML Template 则让你提前写好组件结构并延后渲染。

示例代码:使用 template + slot

更新 main.js

// 创建模板
const template = document.createElement('template');
template.innerHTML = `
  <style>
    button {
      background-color: lightgreen;
      color: black;
      padding: 10px 20px;
      border: none;
      border-radius: 5px;
      cursor: pointer;
    }
  </style>
  <button>
    <slot name="text">默认按钮</slot>
  </button>
`;

class MyFancyButton extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'open' });
    shadow.appendChild(template.content.cloneNode(true));
  }
}

customElements.define('my-fancy-button', MyFancyButton);

index.html 中使用:

<my-fancy-button><span slot="text">点击这里</span></my-fancy-button>

效果是:一个绿色按钮,里面显示“点击这里”。


实战项目:做一个“点赞按钮”组件

让我们动手做一个实用的小组件吧!目标是做一个带有计数的点赞按钮,每次点击数字加一。

🧩 第一步:写基本结构

继续用之前的文件结构,在 main.js 中写组件逻辑:

const likeTemplate = document.createElement('template');
likeTemplate.innerHTML = `
  <style>
    .like-btn {
      background-color: #ff4081;
      color: white;
      padding: 10px 20px;
      border: none;
      border-radius: 5px;
      cursor: pointer;
      font-size: 16px;
    }
  </style>
  <button class="like-btn">👍 点赞 (<span id="count">0</span>)</button>
`;

class LikeButton extends HTMLElement {
  #count = 0;

  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'open' });
    shadow.appendChild(likeTemplate.content.cloneNode(true));

    this.button = shadow.querySelector('.like-btn');
    this.countSpan = shadow.querySelector('#count');

    this.button.addEventListener('click', () => {
      this.#count++;
      this.countSpan.textContent = this.#count;
    });
  }
}

customElements.define('like-button', LikeButton);

index.html 中调用组件:

<like-button></like-button>

刷新浏览器,点击按钮,数字会不断加一!

🎉 成功实现了一个可复用的点赞按钮!


常见问题:新手容易遇到的问题及解决方法

❓ 为什么我的自定义组件不显示?

✅ 确保:

  • 组件名称含有短横线(如 my-component)
  • 用了 customElements.define() 注册
  • 使用了正确的 HTML 标签闭合(如 <my-button></my-button>

❓ 组件的样式被全局样式影响了怎么办?

✅ 加上 Shadow DOM,让组件内的样式与外界隔离。

❓ 怎么调试 Shadow DOM 里的内容?

✅ 在浏览器开发者工具中找到组件,展开 #shadow-root 即可查看结构。


学习建议:下一步学习路线

恭喜你完成本次入门教程!接下来你可以沿着以下几个方向继续学习:

📌 1. 深入理解 Shadow DOM

  • 探索更多关于样式隔离和 DOM 结构的知识
  • 尝试使用多个 <slot> 实现更复杂的布局

📌 2. 使用 Web Components 构建完整网站组件库

  • 像 Element Plus / Ant Design 一样制作一套 UI 库
  • 使用 Web Components + JavaScript 实现交互效果

📌 3. 结合现代前端架构使用 Web Components

  • Web Components 可以和 React、Vue 一起使用
  • 用于跨项目复用组件,提升团队协作效率

📌 4. 进阶学习资源推荐


结语:拥抱原生的力量,开启组件化新旅程!

JavaScript框架对比-1

Web Components 不需要复杂的构建工具、不用安装框架,只要你了解基本的 HTML/CSS/JS,就可以立刻开始构建属于自己的组件世界。

无论你是刚入门的新手,还是希望摆脱框架依赖的开发者,Web Components 都是一个值得投入学习的新方向!

💡 动手去写一个属于你自己的组件吧,越早实践,收获越大!


🔚 本教程完 | 字数约 2479 字

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝