首页 > 其他分享 >Web Component入门

Web Component入门

时间:2023-05-28 17:02:05浏览次数:48  
标签:Web 入门 DOM Component HTML Components 使用 组件

前言

在我们现在的前端开发中,组件化早已成为主流。Vue、React、Angular等前端框架都贯彻着「组件化」的概念,而这一切「组件化」都是「高内聚、低耦合」思想下的产物。

就当下而言,使用这些框架也会给我们带来一系列问题,例如:

  1. 一个前端团队一半的项目用的 Vue 技术栈,一半的项目用的 React 技术栈,遵循「高内聚、低耦合」的原则,我们为这两套技术栈分别搭建了Vue UI 组件库和React UI 组件库。这两套 UI 组件库的功能几乎毫无差异,但是要由两个团队来维护。适配这两个框架,将要耗费双倍的人力成本。
  2. 即使针对同一个技术栈,在面临版本升级时,旧的组件库也会存在不可用的情况。比如:Vue 从 2.x 升级到 3.x 版本,React从 17版本升级到 18 版本, 之前封装的基础组件和业务组件都在新版本中就不能正常使用。一套组件库在同一个框架不同版本之间存在差异,甚至只能固定在某一个版本中使用,这本身于前端的「组件化」趋势是相违背的。
  3. 随着前端复杂度的增加,项目中使用的框架越来越多,会在不经意间出现样式的冲突。很多框架在组件设计时没有样式进行样式隔,例如:在使用 React 时,React 在书写组件样式时经常出现样式覆盖、错乱的问题,不得不借助其他方案来解决此类问题。
  4. Webpack 盛行的今天,大多数项目使用 Webpack 作为编译工具,这让组件经过 Webpack 编译之后想要在运行时即引即用变得不太现实。
  5. 前端框架的「组件化」并不是真正的「组件化」。虽然书写代码时的确是「组件化」的方法在写,但是编译完之后就不再「组件化」了。
  6. 「组件化」给前端的开发带来了极大的效率提升,随着发展前端「组件化」的框架也因此层出不穷,从最早的 jQuery,再到 React、Vue、Angular、Ratchet、Ionic 等等,几乎每年都有很多新的框架如雨后春笋悄然而生,它们或借鉴或颠覆其他已存在的框架,究其本质这些框架的很大一部分模块在功能上是重合的,但也仅仅在功能层面重合,代码层面确完全不兼容。 为了解决这些问题,各种解决方案层出不穷,其中 Web Components 就是其中关键的一环。

Web Components

Web Components 是一种用于创建可重用组件的新技术,可帮助开发人员在 Web 应用程序中实现更好的代码重用性和封装性。这种技术由 HTML Templates、Custom Elements、Shadow DOM 和 ES Modules 组成,是一种支持跨浏览器、可扩展且可重用的前端组件的标准。

组成

下面是 Web Components 的四个核心组件:

  1. HTML Templates: 一种定义可复用 HTML 结构的机制。

HTML templates 利用 template 进行元素包裹,包裹的元素不会立即渲染,只有在内容有效的时候,才会解析渲染,具有这个属性后,我们可以在自定义标签中按需添加我们需要的模板,并在自定义标签渲染的时候再去解析我们的模板,这样做可以在 HTML 有频繁更改更新任务,或者重写标记的时候非常有用。

  1. Custom Elements: 可用于定义自己的 HTML 元素。

Custom elements 通过 CustomElementRegistry 来自定义可以直接渲染的 html 元素,并提供了组件的生命周期 connectedCallback、disconnectCallback、attributeChangedCallback 等提供给开发者聚合逻辑时使用。

  1. Shadow DOM: 用于在现有 HTML 中创建独立的、封装的 DOM 片段的机制。

Shadow Dom 被称为 影子DOM」 或 「隐式 DOM」,顾名思义,具有隐藏属性,具体的意思就是说,在使用 Shadow DOM 的时候,组件标签内的 CSS 和 HTML 会完全的隐式存在于元素内部,在具体页面中,标签内部的HTML 结构会存在于 #shdaow-root,而不会在真实的 dom 树中出现。其实这个 Shadow Dom并不陌生,在前端开发时使用的很多 HTML 标签中已经将它运用起来。例如常见的 video标签。

  1. ES Modules: 一种用于JavaScript的模块化系统,现已成为Web Components的标准导入机制。

ES Modules(ESM)相信大家非常熟悉了,作为组件的引入方式成为 Web Components 的规范之一。其实早期并不是使用的 ES Modules 作为 Web Components 的导入方式,而是 HTML Imports,可惜 HTML Imports 已经被废弃,如果想正常使用 HTML Imports 代码查看效果,可以安装低版本浏览器。 图片 ES Modules(ESM)使 Web Components 能够以模块化方式开发,这与其他接受的 JavaScript 应用程序开发实现保持一致。您可以在 JS 文件中定义自定义元素的接口,然后将其包含在 type="module" 属性中。

如何使用

使用 Web Components 可以轻松创建自定义元素,这些元素是组件的建筑块,通过自定义元素,开发人员可以为在多个页面和项目中重复使用的元素创建自定义名称,减少重复代码量,同时也可以使用 Shadow DOM 和 ES Modules 等机制来实现良好的封装性。

在实现 Web Components 时,可以使用一些代码库和框架,如 LitElement、Stencil、Hybrids 等。

代码示例

下面是一个使用 LitElement (一个使用 Web Components 标准的库,它可以让你更方便地创建自定义元素。)实现的简单计数器组件:

import { LitElement, html, css } from 'lit-element';

class MyCounter extends LitElement {
static get styles() {
return css`
.counter {
font-size: 2em;
font-weight: bold;
background-color: #f7f7f7;
padding: 10px;
display: inline-block;
}
.button {
margin: 5px;
padding: 5px 10px;
background-color: #ddd;
border: none;
cursor: pointer;
}
`;
}
static get properties() {
return {
count: { type: Number }
};
}
constructor() {
super();
this.count = 0;
}
increment() {
this.count++;
this.requestUpdate();
}
decrement() {
this.count--;
this.requestUpdate();
}
render() {
return html`
<div class="counter">
<button class="button" @click="${this.decrement}">-</button>
<span>${this.count}</span>
<button class="button" @click="${this.increment}">+</button>
</div>
`;
}
}

customElements.define('my-counter', MyCounter);

这个组件使用了 LitElement 的封装机制,将模板、样式和行为都组合在了一起。

优势

Web Components 的优势包括:

  1. 可重用性:通过 Web Components,可以创建多次使用的自定义元素来减少代码的重复。
  2. 封装性:使用 Shadow DOM 可以封装所有 DOM 和样式,并限制对其的访问。
  3. 可组合性:使用 Custom Elements 可以创建组件,从而可以轻松地组合现有元素。
  4. 标准化:使用 ES Modules 作为 Web Components 的标准导入机制,使 Web Components 更加统一和稳定。

缺点

Web Components 目前的一些缺点是:

  1. 兼容性:一些老版本的浏览器不支持 Web Components。
  2. 性能:Web Components 优化起来比较困难,与其他代码库或框架一起使用可能会降低性能。
  3. 学习成本:使用 Web Components 需要掌握多种技术,包括 HTML Templates、Custom Elements、Shadow DOM 和 ES Modules。

总结

Web Components可以使开发人员创建可重用和封装的组件,以减少代码的重复和提高代码的可读性和可维护性。虽然它存在一些缺点,但是随着浏览器对其的支持日益增加,它将会成为未来 Web 应用程序开发的一种重要技术。

标签:Web,入门,DOM,Component,HTML,Components,使用,组件
From: https://blog.51cto.com/u_16139800/6365557

相关文章

  • 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/
     第一个错误 刷新后出现第二个 org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.admin.adminFace_jsp 解决方法:1.1检查WEB-INF下的lib文件夹里是否导入了写jstl-1.2.jar(jstl.jar),standard1.1.jar(standard.jar)如果没有......
  • WEB漏洞—SQL注入之Oracle,MongoDB等注入
     1.明确注入数据库类型、权限2.明确提交方法、参数类型等高权限可以执行文件读取,低权限就老老实实获取数据,最终目的都是获取网站权限 常见数据库类型mysql,access,mssql,mongoDB,postgresql,sqlite,oracle,sybase等1、Access注入Access与mysql结构,除access之外,其他数据库结......
  • 一年web网站测试的总结
    1.页面链接检查每一个链接是否都有对应的页面,并且页面之间切换正确。可以使用一些工具,如LinkBotPro、File-AIDCS、HTMLLinkValidater、Xenu等工具。LinkBotPro不支持中文,中文字符显示为乱码;HTMLLinkValidater只能测试以Html或者htm结尾的网页链接;Xenu无需安装,支持asp、do......
  • WEB漏洞—SQL注入之类型及提交注入
    本章包含所有sqli-labs-master测试,所以内容较少,更多内容在测试里GET,参考sqli-labs-matser(LESS-1到5)POST,参考sqli-labs-matser(LESS-11) COOKIE数据提交注入测试(sqli-labs-masterLESS-20)cookie注入原理:对get传递来的参数进行了过滤,但是忽略了cookie也可以传递参数。通过数......
  • 图像入门3
    图像识别30.序章​ 从本章起,我们的OpenCV将会插入一段美好而虚空的幻想故事……请各位勇士进入幻境,开始你们的学习之旅。1.大纲1、处理OpenCV中鼠标事件2、学习以鼠标作为画笔,如cv.setMouseCallback()函数2.使用鼠标作为画笔1)鼠标回调函数​ 在遥远的圣彼得堡,住着一......
  • web漏洞扫描器——AWVS
        ......
  • TS 从入门到深度掌握,晋级TypeScript高手
    TS从入门到深度掌握,晋级TypeScript高手download:3wzxit666comRN从0到1系统精讲Part1:环境搭建ReactNative是一种基于React的开源框架,可以用JavaScript来编写原生移动应用程序。本文将详细介绍如何从零开始学习和使用ReactNative。安装必要软件首先,我们需要安装Node.js和npm......
  • WPF入门教程系列二十六——DataGrid使用示例(3)
    WPF入门教程系列目录WPF入门教程系列二——Application介绍WPF入门教程系列三——Application介绍(续)WPF入门教程系列四——Dispatcher介绍WPF入门教程系列五——Window介绍WPF入门教程系列十一——依赖属性(一)WPF入门教程系列十五——WPF中的数据绑定(一) 五、DataGr......
  • k8s-Pod调度策略(入门攻略)
    首先在k8s中,k8s会根据每个work节点的配置,负载差异,自动生成优选函数,根据优选函数,当master节点分配下来任务时,将pod分配带最适合运行的node节点上。之外我们技术人员还有以下三种方式去影响我们的pod调度,node节点调度器亲和性调度污点容忍度区别和实例操作一.node节点调度是最直接的......
  • Rust Web 全栈开发之自建TCP、HTTP Server
    RustWeb全栈开发之自建TCP、HTTPServer课程简介预备知识Rust编程语言入门https://www.bilibili.com/video/BV1hp4y1k7SV课程主要内容WebService服务器端WebApp客户端WebApp(WebAssembly)Web框架:Actix数据库:PostgreSQL数据库连接:SQLx全部使用纯Rust编写!一......