什么是Web Compnnets
还记得当document.querySelector最开始被广泛的被浏览器支持并且结束了无处不在的JQuery。这最终给我们提供了一个原生的方法,虽然JQuery已经提供了很久。我觉得这同样将会发生在像Angular和React这的前端框架身上。
这些框架可以帮助我们去做一些做不到的事情,比如创建可以复用的前端组件,但是这样需要付出复杂度、专属语法、性能消耗的代价。 但是这些将会得到改变。
现代浏览器的API已经更新到你不需要使用一个框架就可以去创建一个可复用的组件。Custom Element和Shadow DOM都可以让你去创造可复用的组件。
创造一个你定制的HTML标签,它将会继承HTM元素的所有属性,并且你可在任何支持的浏览器中通过简单的引入一个script。所有的HTML、CSS、JavaScript将会在组件内部局部定义。 这个组件在你的浏览器开发工具中显示为一个单独个HTML标签,并且它的样式和行为都是完全在组件内进行,不需要工作区,框架和一些前置的转换。
简言之,通过一种标准化的非侵入的方式封装一个组件;
优势:
1.W3C标准化API(只有HTML、CSS、JAVASCRIPT);
2.易于 继承,无需编译;
3.真正的局部CSS作用域 (以往的scoped 存在穿透)
4.与框架无关(一次开发,避免重复造轮子);
5.可与第三方框架无缝集成(多处使用);
两大利器
使用web 内建的组建模型来定义组件;
将标记结构、样式和行为隐藏起来;
简介清晰的DOM树,隔离代码;
组件生命周期
- connectedCallback:当 custom element首次被插入文档DOM时,被调用。
- disconnectedCallback:当 custom element从文档DOM中删除时,被调用。
- adoptedCallback:当 custom element被移动到新的文档时,被调用。
- attributeChangedCallback: 当 custom element增加、删除、修改自身属性时,被调用。
不得不提的兼容性问题
标准 polyfill支持
可兼容至IE 11;
https://github.com/webcomponents/polyfills/tree/master/packages/webcomponentsjs
第三方框架对Custome Element 的支持情况
除了DIO、Mithril 、Polymer 、React 、Skate w/ Preact外,其他框架均支持良好;
注: (数据来源: https://custom-elements-everywhere.com/)
canius数据
https://www.caniuse.com/#search=web%20components
是否应该抛弃已有第三方框架
Web Components 相关的库
- Hybrids is a UI library for creating Web Components with simple and functional API.
- LitElement uses lit-html to render into the element's Shadow DOM and adds API to help manage element properties and attributes. Polymer provides a set of features for creating custom elements.
- Slim.js is an opensource lightweight web component library that provides data-binding and extended capabilities for components, using es6 native class inheritance.
- Stencil is an opensource compiler that generates standards-compliant web components.
- Tencent Omi 基于web components 的跨端框架
- web-cell 基于Bootstrap的web component(与Vue 相同,使用SnabbDOM 做为虚拟DOM引擎)
没有帐号? 立即注册