侧边栏壁纸
  • 累计撰写 6 篇文章
  • 累计创建 4 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Web Components简介及开发总结

Administrator
2023-05-14 / 0 评论 / 1 点赞 / 1921 阅读 / 0 字

1 Web Components

1.1 什么是Web Components

Web Components是一套不同的技术,允许你创建可重用的定制元素(它们的功能封装在你的代码之外)并且在你的web应用中使用它们[1]。这些可重用的定制元素,即为组件。组件(component)是前端非常重要的内容,组件化允许我们将复杂的用户界面拆分成小而独立的部分,每个部分都有自己的状态和行为。

基于组件化技术可以让开发者发如同堆积木一样开发应用,可以极大提高开发效率。相信使用过一些框架(如Vue、React)及UI组件库(如Element、Antd)的开发者,对此一定深有体会。

1.2 Web Components的优点

Web Components提供了许多优点,使得它成为一种受欢迎的前端技术,现已成为Web标准技术。优点有以下:

1.可重用性:Web Components允许开发人员创建可重用的自定义元素,并在多个Web应用程序中重复使用。这可以提高应用程序的可维护性和可扩展性;

2.封装性:使用影子DOM可以将样式和行为封装在自定义组件内部。这可以避免全局样式的影响,并且使得开发人员可以更容易地维护自定义元素;

3.可组合性:Web Components并不是一种DSL(Domain Specific Language,领域特定语言),它可以与其它Web技术或框架(如React和Vue),甚至是原生JS一起使用,从而提高应用程序的灵活性和可扩展性;

4.标准化:Web Components是一组标准,大多数现代浏览器都支持Web Components标准,包括Google Chrome、Mozilla Firefox、Microsoft Edge、Safari等主流浏览器。这意味着开发人员可以放心地在不同的浏览器中使用Web Components,并获得相同的体验。

1.3 Web Components开发方式

使用Web Components原生API(Application Programming Interface,应用程序接口)开发应用存在一定难度。因此,为了降低开发难度,通常是使用一些库,如LitElement,来进行相关开发。

LitElement是一个Web组件库,它基于Web Components规范构建,提供了一种使用JavaScript编写自定义元素的简单方式[2]。LitElement是一个简单的基类,用于创建可在具有任何框架的任何网页中运行的快速、轻量级Web组件。使用LitElement开发具有以下优点:

1.轻量级:LitElement非常轻量级,压缩后的代码大小只有几KB,因此它可以帮助我们构建快速加载的Web应用程序;

2.响应式:LitElement的模板系统基于模板字面量,可以轻松地使用JavaScript表达式来动态更新组件状态。当组件状态发生变化时,它会自动重新渲染组件;

3.可测试性:LitElement使用Shadow DOM来隔离组件样式和状态。这使得组件可以独立进行单元测试,从而提高了代码的可测试性。

1.4 Web Components三大重要技术

Web Components有三大重要技术:自定义元素(Custom Elements)、影子DOM(Shadow DOM)、HTML模板(HTML Template)。它们的基本含义如下:

1.自定义元素(Custom Elements)

它允许开发人员创建自定义HTML元素,这些元素可以与原生HTML元素一样使用,并且可以在不同的Web应用程序中重复使用。

2.影子DOM(Shadow DOM)

它提供了一种将样式和行为封装在元素内部的方式。这样可以避免全局样式的影响,并且使得开发人员可以更容易地维护自定义元素。

3.HTML模板(HTML Templates)

它提供了一种定义可重用HTML代码块的方式。开发人员可以使用HTML模板来创建自定义元素的模板,这些模板可以在多个Web应用程序中重复使用。

下面将通过使用LitElement构建一个示例Web Components,以对上述三大技术进行说明,代码如下:

image-20230514174404405

在这段代码中,通过render函数渲染模板字符串中的this.message变量,并通过styles方法给p标签添加一个样式。customElements.define方法接受两个参数:自定义元素的名称和元素的定义。元素的定义可以包含自定义元素的属性、事件和方法等。这个方法将MyElement类注册为名为my-element的自定义元素。

在完成my-element的自定义元素后,可以像普通的HTML元素来使用my-element。例如在index页面中使用,如下图所示:

image-20230514174426872

通过启动webpack dev server,引入了my-element组件的index.html最终渲染如下图所示。

image-20230514174439340

图中标注1为my-element组件的渲染内容,对应元素视图中的标注2。在元素视图界面中的标注3可以看出,my-element组件拥有与普通元素不同的子元素—“#shadow-root”,即为一个影子DOM。与此同时,标注4同样为一个p标签元素,颜色并没有受到my-element组件的“污染”,这也体现了Web Components的封装性。

1.5 生命周期函数

当软件技术达到一定规模,必然会引入生命周期相关的技术。生命周期函数的一个简单理解是:在一定的时期内,做一些必要的事情。Web Components也不例外,如constructor、connectedCallback、attributeChangedCallback。LitElement在原生Web Components的基础上,扩展了一些好用的生命周期函数,其中比较重要的更新组件的生命周期函数,如下图[3]所示:

image-20230514174453112

在进行Web Components相关开发时,需要重点关注上图中的四个标注生命周期。在标注1中的attributeChangedCallback用于“拦截”组件绑定的动态属性更改时,可以做一些处理,但这里需要注意的是监听到的值都是字符串类型,需要手动进行转换到所需的数据类型。从图中不难看出,在attributeChangedCallback更改的数据会自动触发requestUpdate(请求更新)函数,即图中标注2。图中标注3则会渲染html模板里的内容。图中标注4则用于第一次更新完可以进行一些操作,可以执行一些需要在元素首次渲染之后才能进行的操作,例如获取元素的子元素或者在Shadow DOM树中查找元素等等。

限于篇幅,上面仅对比较重要的生命周期函数进行介绍。如需要了解更多生命周期函数相关资源,可以通过官网(引用3)进一步学习。

2 在GMU中使用LitElement开发总结

GMU(取自“积木”谐音)作为Light云平台推出的移动终端开发平台,致力于简化开发流程,能够让开发者搭积木似的快速搭建自己的终端,从而提升产品交付效率,实现快速迭代[4]。

GMU小程序框架采用了LitElement库实现了一些Web Components组件。有同和h5在命名上差别不大的组件,如image、input。但事实上,GMU在原生标签的基础上增强了许多能力,如使用image组件可以直接支持懒加载(只需开启lazy-load属性,并设置为true),而不用在业务侧另外写相关逻辑;使用input输入组件则可以调用支持加密的安全键盘。

使用LitElement开发一个完整的组件,还需要注意很多细节。下面将以picker(选择器)为例说明使用LitElement开发Web Components比较通用的开发流程。

2.1 了解组件的使用及交互

理解需求所描述的交互,下图为LitElement开发的一个可以支持级联操作的多列选择选择器,如将第一列的“无脊椎动物”滑动至“脊椎动物”,那么第二列和第三列的数据将同步更新至脊椎动物下的分类。

image-20230514174612161

当使用组件时,需要给picker组件指定一些必要的attribute(属性),如下图所示。

image-20230514174619116

这些attribute作用如下:

mode: “multiSelector”,用于指定选择器类型,"multiSelector"为多列选择器;

bindchange="bindMultiPickerChange"用于指定点击“确定”按钮的回调事件;

bindcolumnchange=“bindMultiPickerColumnChange”,用于指定更改列时触发的回调事件;

value=“{{multiIndex}}”,用于指定选择器被选中的下标;

range=“{{multiArray}}”,用于指定选择器的数据来源。

2.2 开发和实现组件

对使用picker组件的开发者而言,实现这个级联选择的多列选择器的思路并不复杂。只需要在借助bindMultiPickerColumnChange事件即可轻松实现,该事件对象会包含一个类似{column: x; value: y}的对象,用于确定最后滑动的是哪一列及该列的哪一项。然后,动态更改picker已经绑定好的数据来源—multiArray即可。

而使用LitElement开发picker,则需要做很多大量且必要的工作,如监听range更改而更新视图的一些列操作,即响应式;对attribute的一些数据进行校验;事件处理及派发;边界及异常处理。这些步骤贯穿LitElement的多个生命周期函数,如一些边界处理需要在attributeChangedCallback生命周期函数中完成。

一种较为通用的使用Lit Element开发Web Componets组件的思路为:1.从业务侧的组件获取数据;2.处理数据;3.界面渲染;4.事件派发。基于源码保密,下面仅对实现picker的重要过程进行说明,上述思路对应图中的标注,如下图所示:

image-20230514174711327

借助picker可以实现级联操作这个思路,可以在业务侧实现很多有用的功能,比如省市选择器。

更多组件可以访问GMU网站[5]进一步了解。

3 总结

本文第一节先介绍了Web Compoents及其优点,再介绍了Web Components的开发方式,然后使用一个示例对Web Components的三大重要技术进行说明,最后介绍了在使用LitElement开发中比较重要的生命周期函数。第二节对使用LitElement在GMU中开发Web Components组件的通用开发方式进行了总结。

本文引用和借鉴了一些官网文档,这些文档是最权威的“一手”资料,一些技术博客可以作为很好的补充。值得一提的是,引用2中的官网提供了演练场,这样可以减少本地搭建环境的步骤。

参考资料

[1]. https://developer.mozilla.org/zh-CN/docs/Web/Web_Components

[2]. https://lit.dev/docs/v1/

[3]. https://lit.dev/docs/components/lifecycle/

[4]. https://zhuanlan.zhihu.com/p/396980302

[5]. https://iknow.hs.net/portal/docLibView/25

1
博主关闭了所有页面的评论