一、背景
-
风格不统一:前端框架众多对应组件库也不尽相同,导致构建的应用 UI 风格也不一致。
-
维护成本高:不同技术栈构建的应用都需要点对点进行维护。
-
复杂性高:一般都依赖于第三方库和框架,这可能会增加应用程序的复杂性和维护成本。
-
灵活性受到限制:Web 框架由于其提供了完整的解决方案,因此可能限制了开发者的灵活性。对于某些特定的需求,开发者可能需要适应框架的限制,或者需要寻找第三方插件或扩展。
-
需要学习成本:Web 框架通常需要更多的学习和了解才能熟练使用。不同的框架可能有不同的API和概念,因此切换框架可能需要一定的成本。
二、认识 Web components
Web Components 技术的发展历程非常具有特色。早在2004年,Mozilla基金会就提出了 XUL(XML User interface Language)的概念,旨在使用XML 语言来定义通用的用户界面组件。之后,Google 通过 GWT(Google Web Toolkit)再次推出了 UI 编写框架,其中有关于组件化的一些实践,例如通过UI Binder来实现UI设计与业务逻辑的分离,处理数据绑定等前端开发问题。在此之后,一些流行的Web框架,例如 Angular、React 和 Vue 都提供了自定义组件化的新特性,从而为 Web Components 的实现和推广铺平了道路。
Web Components 目前已经成为Web应用程序开发技术的主流之一,越来越多的开发者开始关注和应用这种技术。虽然在早期的浏览器中并未提供原生支持,但是通过 Web Components 的相关 polyfill 库,开发者可以在任何现代浏览器上实现相同的开发体验。
三、优点与缺点
Web Components 主要优势:
-
可重用、可组合性:Web Components 可以轻松地创建可重用的代码块,这有助于减少重复代码并提高代码的可维护性。
-
灵活性:Web Components 可以轻松地定制 HTML 标签,从而使 HTML 更加灵活和强大。这使得开发者可以创建自定义的标签、组件和属性,以满足特定的需求。
-
跨平台兼容性:Web Components 是 HTML5 的一个重要组成部分,因此它们在所有主流浏览器中都是支持的。这使得开发者可以轻松地编写跨平台的代码,从而提高代码的通用性和可移植性。
-
可测试性:Web 组件是可测试的,这意味着它们可以使用单元测试和集成测试进行测试。这可以帮助开发人员确保他们的 Web 组件是正确的。
-
标准化:Web 组件是基于标准的,这意味着它们可以在任何现代浏览器中运行。这可以帮助开发人员确保他们的 Web 组件可以被广泛使用。
-
组件化和模块化程度高:通过 Shadow DOM,可以将一个组件的 HTML、CSS 和 JavaScript 封装在一起,形成一个独立的模块。避免了样式冲突和命名空间污染,而不会影响到其他元素;将组件的实现细节隐藏起来,只暴露必要的接口,从而保护了组件的完整性和稳定性。
Web Components 缺点:
-
浏览器兼容性:虽然 Web Components 规范得到了 Chrome、Firefox 和 Safari 等主流浏览器的支持,但不同浏览器的实现方式可能存在差异,这可能导致在某些浏览器中出现问题。 -
学习成本:Web Components 技术相对复杂,需要理解 Custom Elements、Shadow DOM、HTML Templates 和 ES Modules 四个技术组成部分的概念和使用方式,可能需要一定的学习成本。
-
开发效率:由于 Web Components 相对比较自由和灵活,开发人员需要自己编写更多的代码来实现功能和样式,这可能会导致开发效率降低。
-
生态发展:尽管 Web Components 技术提供了强大的自定义能力,但目前其生态发展相对较弱,缺乏像 React、Vue 等框架那样丰富的第三方库和组件支持,比如SEO 需要很多额外处理、SSR 方案还不够完善。
四、Web Components 使用
Web Component 使用教程 mdn1。
示例:
// 为这个元素创建类
class MyCustomElement extends HTMLElement {
constructor() {
super();
}
connectedCallback() {
console.log('元素被添加');
}
disconnectedCallback {
console.log('元素被移除');
}
adoptedCallback() {
console.log('元素被移动');
}
attributeChangedCallback(name, oldValue, newValue) {
console.log('属性发生变化');
}
}
// 注册自定义元素
customElements.define("my-custom-element", MyCustomElement);
<!-- 使用自定义元素 -->
<my-custom-element size="100"></my-custom-element>
五、发展现状
Web Components 的标准已经相对成熟,并且在主流浏览器中得到了广泛支持。Web Components 社区正在不断壮大,应用场景变得更加丰富。然而在实际应用中仍然存在一些挑战和问题,例如,Web Components 的性能可能不如原生 HTML 元素,同时其使用门槛也相对较高,需要一定的学习和实践成本。但是,新兴 Web 框架的出现,使得 Web Components 赢来了春天,开发 Web Components 组件可以像现代 web 框架一样如鱼得水,完善的测试套件也在为 Web Components 保驾护航。
新兴框架:
-
Stencil2
- UI 组件库
- Web: ivy-ui
- Mobile:
- UI 组件库
-
Lit3
- UI 组件库
- Web: shoelace一个具有前瞻性的 Web 组件库。
- UI 组件库
-
Quarkc4
- UI 组件库
- Mobile: Quark Design
- UI 组件库
-
Omi5
- UI 组件库
- Web: OMIU
- UI 组件库
-
Atomico 6,受 React Hooks 启发的微型库,专为 Web 组件的创建而设计和优化。
-
Fast7
- UI 组件库
- Web: fast components
- UI 组件库
-
其他
- Catalyst
- Lightning web components
- Skatejs、
- fluentui是一个 Web 组件库
- ofa.js不需要打包的 MVVM JavaScript 框架
-
测试套件8
-
Web Component DevTools9
-
Eslint10
部分内容参考了文章 你不知道的 Web Components - 现状
六、总结展望
未来已来,赶紧上车。
Footnotes
-
Web Components 测试套件——Open Web Components ↩