当前位置: 首页 > 科技观察

2022WebComponents趋势解读与展望

时间:2023-03-14 18:38:26 科技观察

WebComponents是一种用于创建适用于多种用途的HTML元素的Web技术。对于这种现象存在不同的态度:虽然一些人相信WebComponents的革命性潜力(尽管它们于2011年首次推出),但其他人仍然持怀疑态度并继续使用React。许多开发人员似乎对WebComponents将消灭前端框架的想法感到威胁。但这不会发生,因为它们是为解决不同的问题而创建的。背景为什么我们需要WebComponents?使用Web组件的原因,我们可以从三个方面来看这个问题,一是趋势,一是技术本身,三是业务成本。让我们从趋势开始:趋势尽管对WebComponents有一些普遍的保留意见,但仍有相当多的大公司在充分利用该技术。以下是其中的一些:1.HeadcaseTwitter:EmbeddedTweetYouTube:该站点是使用WebComponentsElectronicArts构建的:该站点也是使用WebComponentsAdob??eSpectrum构建的:该站点是基于WebComponentsFramework产品的UI维基百科,可口可乐、麦当劳、IBM和通用电气也使用基于Web组件的技术和框架。2.整体数据除上述案例外,还有大部分案例未说明。下图显示了至少调用一次customElements.define的页面加载百分比(在Chrome中)。使用CustomElementRegistryDefine的页面加载百分比(在Chrome中)(来源:https://chromestatus.com/metrics/feature/timeline/popularity/1689)我们可以看到,在Chrome中查看的所有网站中,超过15%的网站具有至少注册了一个自定义元素。相比之下,根据w3techs.com的数据,只有2.3%的网站使用React。还有一个数据可以反映WebComponents的流行程度。下图显示了历年在Chrome浏览器中查看的所有网站中WebComponents的增长趋势。使用CustomElementRegistryDefine历年(在Chrome中)的页面趋势我们可以看到,web组件的增长趋势非常可观。技术优势1.原生支持原生支持意味着无需任何框架即可完成开发,也意味着这将有更好的用户体验,更低的网络请求,更稳定的迭代前景。而我们一直都在使用这个技术,比如input、video、select等等,其实都是标准的native组件,但是现在我们也可以用这个技术来创建这些组件。2.无排他性这是对原生支持的扩展,因为浏览器的原生支持意味着它可以在任何环境中使用,例如在React、Angular和Vue中使用它们。同时也意味着对WebComponents的支持不需要对现有的逻辑体系进行大刀阔斧的颠覆,可以从局部改造入手。3.无依赖这也是对原生支持的扩展,通过提供连接特定Web组件的选项,而无需将框架的依赖项导入项目,您可以比流行的框架更具优势。让我们想象一个场景:如果你喜欢一个用React创建的小部件,并且你想将它包含在你的项目中,那么你必须先包含整个React库,然后才能导入你喜欢的小部件。相反,如果您选择使用通过Web组件创建的小部件,您可以立即将其插入到您的项目中——这一切都归功于该技术的原生特性。4.性能优势——优先级逻辑非阻塞WebComponents的优势在于可以在页面网络请求时开始自定义组件的注册,当然自定义组件的注册也可以在加载完成后完成,可以理解为组件是异步执行和渲染的,也可以结合ES6Module轻松完成组件的按需加载。我们以React组件的WebComponents为例。一个普通的React组件在第一次执行时,需要一次性完成所有必要的节点逻辑,而这些逻辑的执行是同步占用在js的主线程上的。那么当你的页面足够复杂的时候,一些非核心逻辑就会阻塞后续核心逻辑的执行。比如第一次加载的时候,你的页面中有一个复杂的交互组件,交互组件包含N多逻辑和按钮等小组件。这时候,页面的第一次加载不应该优先执行这些细节逻辑,而是最优先的应该是优先渲染整体框架或者核心元素,然后完善那些不需要完成的细节第一次。比如有些图片处理的很复杂,但是你不需要一开始就加载它们。当我们使用WebComponents来优化React时,执行过程会变得简单很多。比如我们注册一个复杂的逻辑组件,我们在React执行的时候只执行一条createElement语句,创建它只需要1-2次。可以在微秒级内完成,真正的逻辑并不是同时执行,而是等到“核心任务”执行完了再执行,你甚至可以让它在合适的时候执行。document.createElement('my-element')我们也可以简单的理解为后面执行了一部分逻辑然后渲染到指定id的div中,那为什么传统的组件做不到呢?那么WebComponents呢?那么就不得不提一下它包含的另一个技术特性:ShadowDOM。它使得每个组件都有自己的根节点,因此可以对主DOM不具有攻击性,所以相对来说异步执行不会造成性能损失,而且相对于混合React也可以降低Diff成本。5、性能优势——组件隔离(ShadowDom)ShadowDOM为自定义组件提供包括CSS和事件在内的有效隔离,不再担心不同组件之间的样式和事件污染。这相当于为自定义组件提供了一个天然有效的保护伞。ShadowDOM其实是一个独立的子DOMTree,通过有限的接口作用于外部。我们都知道,页面中DOM节点的数量越多,运行时性能就越差,因为DOM节点的交互往往会在大量的Frame关系被关联和触发时触发重绘(Repaint)和回流(reflow)。计算。CSS的隔离也会加快选择器的匹配速度。哪怕可能是微秒级的提升,在极端性能情况下仍然是一种有效的手段。6、性能优势——TaggedTemplateVSjsxES6中的template+taggedtemplate也是WebComponents的标准特性之一。作为浏览器的原生支持,与JSX相比,它不仅不需要预编译和预处理,而且具有更强的扩展性。能力。在性能方面,原生支持具有更好的处理性能。而JSX每次渲染都需要完全构造一个虚拟DOM,还需要JSS将CSS-in-JS转换成样式表。因此,同样功能的JSX会占用更多的CPU运算。以下是在MotoG4手机上的React页面和混合页面(React+WebComponents)上运行的网页测试的平均运行重复视图结果。可以看到类似的趋势,React页面中的脚本比混合页面占用更多的CPU。ReactPage和WebComponentPage在PC上的性能比较下面的火焰图显示了ReactPage和WebComponentPage的脚本、布局和绘制时间的CPU模式。React页面火焰图Web组件页面火焰图专项性能分析参考:https://medium.com/@spkamboj/web-components-basics-and-performance-benefits-f7537c908075与Web组件页面相比,React页面在.JS花费了7倍多的CPU时间。在React页面上,额外的CPU成本来自JS包的编译、React在其协调步骤中花费在虚拟DOM比较上的时间、JSS将CSS-in-JS转换为CSS样式表并将它们插入文档的时间。WebComponents实现不会产生任何框架包编译成本、虚拟DOM协调成本或任何CSS-in-JS转换成本。与React页面相比,CPU成本较低的WebComponents页面将变得交互更快,响应使用操作的速度更快。由于使用了Template技术,模板节点操作的对象是一个DocumentFragement,并不是真正DOM的一部分。与JSX生成的JS栈相比,它的内存占用更小。尤其是当VDOM很大的时候,性能边界特别明显。与taggedtemplate相比,large-volumeVDOM可能要差1-2个数量级。7.性能优势——原生生命周期控制WebComponents具有原生组件生命周期回调支持,在连接和断开文档时不需要额外的外部状态标记,这使得组件移动或移除等场景更容易可以无需钩子函数即可获取,无需VDOM处理Diff元素变化。即归于纯,胜于演。8、可靠性更高WebComponents更符合OO思想,也优化了开发者对开闭原则的应用。强约束将使组件实现足够的独立功能和扩展,从而改变开发人员松散的设计习惯,使生产的产品更加可靠和稳定。我们常常把代码约束理解为不方便,这也是阻碍WebComponents越来越流行的原因之一,但我们要知道性能和可靠性确实需要成本,而且这个成本与可靠性相比必须是值得的。9.可读性好使用WebComponents的另一大优势是项目代码的组织和调试。例如,当您尝试在DOM中查找使用React制作的组件时,您在DOM中看到了什么?Div、div、div……我的**头在哪里?因此,在DOM中查找JSX代码的反射是一件令人头疼的事情。对于Web组件,如果您定义my-super-header**,您将直接在DOM中看到您的组件。非常方便调试。业务成本优势1.供应商锁定供应商锁定是指切换到不同供应商的成本如此之高,以至于人们基本上被锁定在原始供应商中的情况。众所周知,软件行业是发展最快、变化最快的行业之一。这伴随着软件工程的许多变化和创新。假设有人在明年发布最终的前端框架,它将使任何现有框架黯然失色。同时越来越多的开发者正在采用新的框架。而且切换到新框架的成本会非常昂贵,因为你必须将每个前端组件都迁移到新框架,而且它可能会破坏业务运营。假设React不再高效,寻找优秀的React开发人员将变得更加复杂和昂贵。2.安全成本如果你有特定的原因,你可能会选择WebComponents。比如适合安全性要求高的项目(比如金融行业的产品),所以不能使用第三方库,必须使用原生技术,对导入库的整个内容进行控制。对于像React这样的大型库,很难持续审计从一个版本到另一个版本的所有库错误和漏洞。总之,你肯定有不想依赖第三方框架或者外部库的情况。3.其他工具可以负担得起HTML如果您打算使用来自其他非Web原生编程语言(例如Java或Kotlin)的HTML,Web组件尤其有用。4.协同作用AndrewCampbell等人。(2000)在《战略协同》一书中说:“通俗地说,协同作用是‘搭便车’。当从公司的一个部门积累的资源可以同时且无成本地使用时,当公司的其他部门参与进来时,就会产生协同效应。”2021年,除了最火的元界,Web3.0也将是一场时代革命。我们需要看到的是,互联网诞生的首要原则是什么?——“数据共享”。现在的互联网数据都集中在少数寡头手中,这完全违背了互联网的初衷,所以Web3.0带着这样的使命诞生了。同样,WebComponents的使命也是一样的。如果我们可以在一个统一的网络中共享我们的网络组件,那不是很好吗?我们可以选择最好的UI组件而不用关心框架。这将使我们独立于JavaScript框架。使用WebComponents将大大降低它们之间转换的成本。能够回归Web的第一性原理,将共享化为跨越式的能力,不仅会增加行业本身的收入,甚至会对全球各行各业的收入产生积极的影响。最后的积极影响。再次重申,WebComponents并不是为了完全取代现有的任何框架而诞生的,它实际上是一套技术的应用,旨在解决Web组件的复用和共享问题,保持Web生态系统的持续开放和统一。虽然它并不完美,但在该领域确实具有无可比拟的优势,尤其是对于高度可重用的基于Web的组件应用程序,使用WebComponents是最好的选择。