Web Components

news2024/11/27 21:04:15

1、前期回顾

JavaScript沙箱

1.1、什么是沙箱

在计算机安全中,沙箱(Sandbox)是一种用于隔离正在运行程序的安全机制,通常用于执行未经测试或者不受信任的程序或代码,它会为待执行的程序创建一个独立的执行环境,内部程序的执行不会影响到外部程序的运行。

1.2、常见的JS沙箱实现

要实现一个沙箱,其实就是去制定一套程序执行机制,在这套机制的作用下沙箱内部程序的运行不会影响到外部程序的运行。

  • 基于作用域隔离,例如:function scope、with、
  • 原生浏览器对象模拟,例如:基于Proxy的沙箱机制
  • 天然的优质沙箱iframe

2、CSS 样式隔离

由于在微前端场景下,不同的技术栈的子应用会被集成到同一个运行池中,所以我们必须在框架层确保各个子应用之间不会出现样式互相干扰的问题。

常见的解决方案:

  • 严格的命名约定
  • CSS Module
  • CSS-in-JS
  • shadow DOM

2.1、qiankun样式隔离方案

在CSS隔离上,qiankun 提供了三种样式隔离的功能:宽松模式、严格模式、以及基于属性选择器实现的实验性样式隔离。
在这里插入图片描述

在start API的options中 sandbox 默认为 true 表示 宽松模式({loose:true}),此外他还提供了两个可选项 strictStyleIsolation:严格的样式隔离,experimentalStyleIsolation:实验性的样式隔离

sandbox - boolean | { strictStyleIsolation?: boolean, experimentalStyleIsolation?: boolean } - 可选,是否开启沙箱,默认为 true

默认情况下沙箱可以确保单实例场景子应用之间的样式隔离,但是无法确保主应用跟子应用、或者多实例场景的子应用样式隔离。当配置为 {strictStyleIsolation: true} 时表示开启严格的样式隔离模式。这种模式下 qiankun 会为每个微应用的容器包裹上一个 shadow DOM 节点,从而确保微应用的样式不会对全局造成影响。
除此之外,qiankun 还提供了 experimentStyleIsolation,当其被设置为 true 时,qiankun 会改写子应用所添加的所有样式规则增加一个特殊的选择器规则来限定其影响范围,因此改写后的代码会表达为如下的结构:

/** 假设应用名是 react16 **/
.app-main {
  font-size: 14px;
}

div[data-qiankun-react16] .app-main {
  font-size: 14px;
}

3、Web Components

Web Component 是一组浏览器标准和API,允许你创建可重用的定制元素并且在你的 web 应用中使用它们,旨在解决HTML、CSS和JavaScript的复用问题。它由三项主要技术组成,它们可以一起使用来创建封装功能的定制元素,可以在任何地方重用,不必担心代码冲突。

  • Custom element(自定义元素):一组 JavaScript API,允许你定义 Custom elements 及其行为,然后可以在任何地方按需使用。
  • Shadow DOM(影子DOM):一组 JavaScript API,用于将封装的 Shadow DOM树附加到元素(与主文档DOM分开呈现)并控制其关联的功能。通过这种方式,您可以保持元素的功能私有,这样他们就可以被脚本化和样式化,而不必担心与文档的其他部分发生冲突。
  • HTML template(HTML模板):<template><slot> 元素使您可以在编写不在呈现页面中显示的标记目标。然后他们可以作为自定义元素结构的基础被多次使用。

其有四个生命周期函数:

  • connectedCallback:当自定义元素第一次被挂载到文档DOM时被调用
  • disconnectedCallback:当自定义元素与文档DOM断开连接时调用
  • adoptedCallback:当自定义元素被移动到新文档时被调用
  • attributeChangeCallback:当自定义元素的一个属性被增加、移除或更改时被调用

4、定义一个Web Component

实现 web component 的基本方法通常如下所示:

  1. 创建一个类或函数来指定 Web 组件的功能。
    使用 Element.attachShadow() 方法将一个Shadow DOM 附加到自定义元素上。使用通常的DOM方法向Shadow DOM中添加子元素、事件监听器等等
    注:可以使用 <template><slot>定义一个HTML模板,简化书写。
  2. 使用 CustomElementRegistry.define() 方法注册您的新定义元素,并向其传要定义的元素名称、指定元素功能的类、以及可选的其所继承自的元素。
  3. 像使用常规HTML元素那样在页面任何位置使用自定义元素。

5、Web Components 优点

5.1、原生支持

原生支持意味着可以不需要任何框架即可完成开发,同时也意味着它可以在任何框架中使用。由于其有w3c标准做背书,所以它有更稳定的迭代前景,且其使用方式与原生元素一样。在使用时无需大刀阔斧的颠倒现有的逻辑体系,以及无需依赖组件的依赖库,如:在使用基于React的组件时,需要依赖React库,而使用Web Component自定义元素则无额外依赖项。

5.2、组件隔离

Shadow DOM 为自定义元素提供了包括 CSS、事件的有效隔离,不再担心不同的组件之间的样式、事件污染了。这相当于为自定义组件提供了一个天然有效的保护伞。
Shadow DOM 实际上是一个独立的子 DOM tree,通过有限的接口和外部发生作用,即它是游离在主 DOM 树之外的节点树。所以 Web Components 中的样式计算不会跨越 Shadow DOM 范围,仅在单个的 Web Component 中进行,而不是在整个页面的 DOM 树上进行。我们都知道页面中的 DOM 节点数量越多,运行时性能将会越差,以及对 CSS 的隔离也将加快选择器的匹配速度。

6、Web Components 劣势

  • Web Components 和其他原生元素一样,偏向于 UI 层面,与现在的主流前端框架的数据驱动不符,和现在的组件库能力上相比功能会比较弱。
  • 兼容性有待提升,一是浏览器兼容性;二是框架兼容性。(qiankun 和 micro-app 中都提到了如果开启 Shadow DOM 会有兼容性问题)。
  • 开发成本较高,使用原生方式书写,且为命令式编程。

7、基于 Web Components 的微前端框架 - mirco-app

在 micro-app 之前,业内已经有一些开源的微前端框架,比较流行的有2个:single-spa 和 qiankun。
在这里插入图片描述

single-spa 是通过监听 url change 事件,在路由变化时匹配到渲染的子应用并进行渲染,这个思路也是目前实现微前端的主流方式。同时single-spa 要求子应用修改渲染逻辑并暴露出三个方法:bootstrap、mount、unmount,分别对应初始化、渲染和卸载,这也导致子应用需要对入口文件进行修改。因为 qiankun 是基于 single-spa 进行封装,所以这些特点也被 qiankun 继承下来,并且需要对 webpack 配置进行一些修改。

micro-app 并没有沿袭 single-spa 的思路,而是借鉴了 WebComponent 的思想,通过 CustomElement 结合自定义的ShadowDom,将微前端封装成一个类 WebComponent 组件,从而实现微前端的组件化渲染。并且由于自定义 ShadowDom 的隔离特性,micro-app 不需要像 single-spa 和 qiankun 一样要求子应用修改渲染逻辑并暴露出方法,也不需要修改 webpack 配置,是目前市面上接入微前端成本最低的方案。

参考:
Web Components MDN 介绍
Web Components MDN 例子
micro-app 官网
qiankun 官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图解LeetCode——206. 反转链表

一、题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 二、示例 2.1> 示例 1&#xff1a; 【输入】head [1,2,3,4,5] 【输出】[5,4,3,2,1] 2.2> 示例 2&#xff1a; 【输入】head [1,2] 【输出】[2,1] 2.3> 示例 3&#…

六级备考32天|CET-6|分数分布|题型分布|翻译·贴春联·CCTV·印章|16:30~17:47

目录 英语六级总分&#xff1a;710分 一、英语六级作文 二、听力部分 248.5分 三、阅读理解35% 248.5分 四、翻译部分 汉译英 15% 106.5分 五、做题技巧 写作和翻译需要重点强化练习&#xff01; 六、积累 英语六级总分&#xff1a;710分 一、英语六级作文 说明&…

HTTP第13讲——HTTP的实体数据

数据类型与编码 在 TCP/IP 协议栈里&#xff0c;传输数据基本上都是“headerbody”的格式。但 TCP、UDP 因为是传输层的协议&#xff0c;它们不会关心 body 数据是什么&#xff0c;只要把数据发送到对方就算是完成了任务。 而 HTTP 协议则不同&#xff0c;它是应用层的协议&am…

pytorch实战11:基于pytorch简单实现DCGAN

基于pytorch简单实现DCGAN 前言 ​ 最近会把一些简单的CV领域的架构进行复现&#xff0c;完整的代码在最后。 本系列必须的基础 ​ python基础知识、CNN原理知识、pytorch基础知识 本系列的目的 ​ 一是帮助自己巩固知识点&#xff1b; ​ 二是自己实现一次&#xff0c;可以发…

ZED使用指南(五)Camera Controls

六、其他 1、相机控制 &#xff08;1&#xff09;选择视频模式 左右视频帧同步&#xff0c;以并排格式作为单个未压缩视频帧流式传输。 在ZED Explorer或者使用API可以改变视频的分辨率和帧率。 &#xff08;2&#xff09;选择输出视图 ZED能以不同的格式输出图像&#xf…

Android系统原理性问题分析 - Android Native程序的结构设计方式

Android核心原理 5.3 声明 在Android系统中经常会遇到一些系统原理性的问题&#xff0c;在此专栏中集中来讨论下。Android系统主要由Java和C/C两个世界构成&#xff0c;此篇分析处于Java世界和C/C世界的两个进程如何实现进程间通信的问题。此篇参考一些博客和书籍&#xff0c…

Go程序设计语言翻译问题(goroutine)

中文&#xff1a;Go程序设计语言 2017.1 英文&#xff1a;The Go Programming Language 2016 8.4.2. Pipelines 8.4.2管道章节 修正&#xff1a; 第一个管道应该改成通道&#xff0c;cannel是概念词汇 重要概念词汇不能混淆 来自chatGPT3.5&#xff1a; Go Pipelines和channel…

(kubernetes yaml文件|--dry-run导出yaml文件

kubernetes yaml文件|--dry-run导出yaml文件 YAML 语法格式&#xff1a;二 查看 api 资源版本标签三 写一个nignx.yaml文件demo四、编写service服务的资源清单详解k8s中的port五 用–dry-run命令生成yaml资源清单六 将现有的资源生成模板导出写yaml太累怎么办&#xff1f; YAML…

【Linux】1. Linux常见指令

专栏导读 &#x1f341;作者简介&#xff1a;余悸&#xff0c;在读本科生一枚&#xff0c;致力于 C方向学习。 &#x1f341;收录于 C 专栏&#xff0c;本专栏主要内容为 C 初阶、 C 进阶、 STL 详解等&#xff0c;持续更新中&#xff01; &#x1f341;相关专栏推荐&#xff1…

社会关系抽取赛题提交指南

社会关系抽取赛题提交指南 一、赛题背景 本次主要为大家介绍社会科学计算大赛的赛题之一---社会关系抽取。 1.技术发展 关系抽取(Relationship Extraction, RE)是信息抽取的一个重要任务,其目标是从文本中抽取实体之间的关系。RE技术发展历程主要有以下几个阶段:1. 规则与模…

初窥机器视觉与卷积神经网络

文章目录 1. 什么是卷积神经网络2. 卷积运算3. 池化层4. 卷积神经网络的整体架构 1. 什么是卷积神经网络 卷积神经网络(convolutional neural network&#xff0c;CNN)主要用于计算机视觉相关任务&#xff0c;但处理对象并不局限于图像&#xff0c;CNN在序列和语音等上的应用也…

2023年陕西省《网络建设与运维》技能大赛试题

项目简介: 某集团公司原在北京建立了总公司,后在成都建立了分公司,广东设立了办事处。集团设有产品、营销、法务、财务、人力5个部门,全网采用OSPF、RIP、ISIS、BGP路由协议进行互联互通。集团在北京建立两个数据中心,贵州建立异地灾备数据中心。 公司网络拓扑如图1所示,…

功能要进阶自动化测试,你必须要了解的十大自动化测试框架

什么是自动化测试框架&#xff1f; 自动化测试框架&#xff0c;即是应用于自动化测试所用的框架。按照框架的定义&#xff0c;自动化测试框架要么是提供可重用的基础自动化测试模块&#xff0c;如&#xff1a;selenium 、watir等&#xff0c;它们主要提供最基础的自动化测试…

【Python入门篇】——Python中循环语句(while循环的嵌套应用,嵌套案例)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

监控系统经典架构详解

要了解一个监控系统那么我们就先要了解他的架构&#xff0c;看看监控系统是由哪些模块组成&#xff0c;各个模块是如何相互协调。我们将众多主流监控系统架构进行逻辑抽象和概括。 典型架构 从上图&#xff08;监控系统经典架构图&#xff09;来看&#xff0c;从左往右&#x…

Android RecyclerView实现吸顶动态效果

文章目录 一、ItemDecoration二、实现RecyclerView吸顶效果1、实现一个简单的RecyclerView2、通过ItemDecoration画分割线3、画出每个分组的组名4、实现吸顶效果 完整demo 链接:https://download.csdn.net/download/JasonXu94/87786702 一、ItemDecoration ItemDecoration 允…

python实现学生成绩管理程序,包含各科成绩的录入,计算各个学生的总分和平均分,统计各个科目的最高分、最低分和平均分。

一、编程题目 编程题目&#xff1a;使用python实现学生各科成绩的录入&#xff0c;计算各个学生的总分和平均分&#xff0c;统计各个科目的最高分、最低分和平均分。其中学生人数通过输入来决定&#xff0c;科目包括语文、数学和英语这三门课程。&#xff08;保留一位小数&…

JavaEE 5 (4/28)

1.wait() 和notify() 调用wait后做的三件事 1.释放锁 2.等待其他线程通知 3.收到通知后重新上锁,继续执行 要想实用wait和notify就得搭配synchronized 获取锁 wait哪个对象就要针对哪个对象加锁 Java中线程是随机抢占式执行的,实际上线程的执行我们一定要有一个顺序. join可以…

阿里云服务器可以做什么?十大使用场景举例说明

使用阿里云服务器可以做什么&#xff1f;阿里云百科分享使用阿里云服务器常用的十大使用场景&#xff0c;说是十大场景实际上用途有很多&#xff0c;阿里云百科分享常见的云服务器使用场景&#xff0c;如本地搭建ChatGPT、个人网站或博客、运维测试、学习Linux、跑Python、小程…

【2023秋招】2023华为od-4.20三道题

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…