我为什么使用 Web 组件 - 我的用例

2025-05-26

我为什么使用 Web 组件 - 我的用例

首先声明,我不是博主,也不是任何技术的倡导者,也不会在活动或会议上发言。所以请谅解我首次尝试写作。希望我表达清晰。

我想谈论一些实际的用例和场景,在这些用例和场景中我发现 Web 组件是最好的解决方案。

每当我看到关于 Web 组件的讨论时,通常都会转向 API 设计和与框架的比较。我不会为这个 API 辩护,因为它不是我写的。我也不会批评它,因为其他人在这方面做得更好

问题解决了吗?

人们常说组件是一个已解决的问题——看看所有这些有宗教信仰的框架!

现在,如果你正在开发一个应用程序,比如一个图书推荐应用程序——你应该用任何你熟悉的框架来编写它。或者只用 Web 组件,或者用 2000 年左右的 HTML + JavaScript 编写。都可以。你可以使用任何你想要的组件系统,只要它符合你的目标。

但是,如果你想编写一个真正可共享的富组件,没有其他可用的模型。你不能在 Svelte 中使用 React 组件,也不能在 React、Vue 或 Nimbus3000 中使用 Svelte 模块。

我的用例

我将讨论一些我认为使用 WebComponents 是正确的实际场景。这里的核心主题是可共享跨框架

1.可嵌入前端(MicroFrontends?)

我帮助许多网站提升网站的互动性和各种花哨的功能。这些网站并非由那些高大上的开发者维护——比如博主、艺术家、内容创作者或小型企业。其中一些网站流量巨大(每月 1 亿页面)。我们有一个数据引擎,可以扫描和监控他们网站上的数据,并将这些数据反馈到可嵌入的前端,从而提升网站的互动性。以下是一些示例:

  • 根据用户定制的实时搜索
  • 启动与用户感兴趣的内容相关的动态游戏
  • 相关内容的无限列表

可嵌入前端示例

这些网站大多基于 WordPress、Squarespace 以及使用 React 和 Vue 渲染的框架。我们的前端以 WebComponents 的形式注入。
发布者可以随意添加组件。无需 npm 或复杂的构建流程。

将其置于 Web 组件中,可以屏蔽其内容,不受其所使用的主题或系统上运行的其他框架的影响。其中一些组件会与主页面上的其他内容进行交互。它们必须具备高性能和小巧的尺寸。

这些发布者通常具备基本的 HTML 知识,他们将其添加到他们的内容中,就像添加图像或视频一样。

2. 复杂的小部件

上面的例子是一个非常定制的解决方案,但也有一些开发人员创建了通用的小部件。

<model-viewer>就是一个很好的例子。它被广泛使用,比如 NASA 和 Shopify。我不知道 Shopify 用的是什么框架(而且它可能和 NASA 不一样),但有了模型查看器这个 Web 组件,他们找到了解决方案。

所谓的“设计系统”也是如此。例如, Ionic 的组件最初是作为 Web 组件开发的,后来也被包装到不同的框架中,例如 React、Vue。

3. 不断发展的 HTML

HTML5 规范中添加了各种各样的新标签,比如<video>。它永远不会添加任何新标签吗?一种观点认为 DOM 很糟糕,所有新元素都应该定义一个全新的组件格式。或者更现实的说法是,它可能会添加更多标签——人们已经知道如何使用标签了。

正在考虑的新标签之一是switch。为了测试可能的实现,Chrome 将其作为 Web 组件发布<std-switch>,因为它本质上扩展了内置元素。当不在 Chrome 上使用时,Web 组件可以作为后备模块加载。扩展现有的底层元素模型有其价值。

此类别中的个人故事:我研究生院的一个朋友尝试在某个网页上使用 MathML。(他们不是开发者。)Chrome 目前不支持 MathML。他们可以使用某种库来渲染它。我把MathML 实现为 Web 组件,这是一个有趣的项目,他们只需稍加修改就可以在 Chrome 中使用。

MathML 示例

造型

从某种程度上来说,该平台中并没有 Web 组件。目前有一些独立的规范,例如自定义元素和 ShadowDom,它们是主要的规范。此外,还有更多用于导入 CSS、HTML 和 JSON 的规范正在开发中。

在开发者看来,所有这些单独的规范都有其自身的优点,也存在各自的设计缺陷。它们可以单独使用,不必全部都变成Web 组件

组件中不在 ShadowDOM 内的部分可以使用全局样式表进行样式设置,而 ShadowDOM 内的部分则被隔离。这在我重点讨论的可共享组件场景中尤其有用。

影子 DOM

开发者体验

人们对 WC 的一个常见抱怨是它们代码太冗长。它没有绑定之类的。就像我之前说的,我不想讨论现有 API 和 DX 的优缺点。

我确实认为,如果你想的话,使用框架和库是合理的。我的意思是,你已经在用了,有时甚至会编译。有些人认为他们应该完全不使用外部库,这是一个很好的目标,值得努力。但事实上,对于大多数开发者来说,使用库要容易得多。所以,不要再把 DOM API 和可以编译成 DOM API 的框架 API 进行比较了。我认为辅助库非常棒。我们已经在许多其他 Web 技术中使用它,例如 Web RTC、Workers 等等。

如果你需要的话,有一些很棒的辅助库可以帮助你处理 WC。例如:Lit ElementStencilHaunted(如果你喜欢 Hooks)。

使用 LitElement 的示例:

@customElement('my-counter')
class Counter extends LitElement {
  @property({ type: Number }) count = 0;

  render() {
    return html`
      <div>${this.count}</div>
      <button @click="${() => this.count++}">Increment</button>
    `;
  }
}
Enter fullscreen mode Exit fullscreen mode

使用 Haunted 的示例:

function Counter() {
  const [count, setCount] = useState(0);
  return html`
      <div id="count">${count}</div>
      <button type="button" @click=${() => setCount(count + 1)}>Increment</button>
  `;
}
customElements.define('my-counter', component(Counter));
Enter fullscreen mode Exit fullscreen mode

不是你的用例

我的用例和你的用例不一样。这些对你来说可能毫无意义,但我想你可能有兴趣从不同的角度听听我的观点。

文章来源:https://dev.to/shihn/why-i-use-web-components-my-use-cases-1nip
PREV
每个开发者都喜欢的 10 大 Chrome 扩展程序 1.Octotree 2. Dark Reader 3. SourceGraph 4. Web Developer 5. ColorPick Eyedropper 6. Ghostery 7. Session Manager 8. JSONView 9. Page Ruler 10. Wappalyzer Refined GitHub
NEXT
使用 Ollama 在笔记本电脑上运行 DeepSeek-R1