简介:iframe 沙箱+WebComponent 容器

前言

HTML 内联框架元素 (<iframe>) 表示嵌套的browsing context。它能够将另一个 HTML 页面嵌入到当前页面中。

每个嵌入的浏览上下文(embedded browsing context)都有自己的会话历史记录 (session history)和DOM 树。包含嵌入内容的浏览上下文称为父级浏览上下文。顶级浏览上下文(没有父级)通常是由 Window 对象表示的浏览器窗口。

页面上的每个<iframe>都需要增加内存和其他计算资源,这是因为每个浏览上下文都拥有完整的文档环境。虽然理论上来说你能够在代码中写出来无限多的<iframe>,但是你最好还是先看看这么做会不会导致某些性能问题。

在复用和组件化的潮流中 HTML 也不是那么的格格不入,毕竟时下最流行的 Vue,React,Ng 都是实现自定义 HTML 组件强有力框架。然而框架各自为阵,语法和使用方式不同,学习成本不同。

Web Components 是 W3C 推动的一项标准,旨在丰富 HTML 的 DOM 特性,让 HTML 有更强大的复用能力。目前它包含三项主要技术,它们可以一起使用来创建封装功能的定制元素,可以在你喜欢的任何地方重用,不必担心代码冲突。

这三项技术分别为:

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

微前端是什么?​

在过去的15年里,我作为一名软件开发人员参与了许多项目。在这段时间里,我有多次机会观察到一种在整个行业重复出现的模式:与少数人合作一个新项目感觉好极了。每个开发人员都对所有功能有一个概述。功能构建迅速。与同事讨论话题很简单。当项目范围和团队规模增加时,这种情况会发生变化。突然间,一个开发人员无法再了解系统的每一个边缘。团队内部会出现知识孤岛。复杂性上升——对系统的一部分进行更改可能会对其他部分产生意想不到的影响。团队内部的讨论更加繁琐。之前,团队成员在咖啡机上做决定。现在,你需要召开正式会议,让每个人都站在同一立场上。弗雷德里克·布鲁克斯在1975年出版的《神话人月》一书中描述了这一点。在某些情况下,向团队中添加新的开发人员并不能提高生产力。

为了减轻这种影响,项目通常被分为多个部分。通过技术划分软件,从而划分团队结构,成为一种时尚。我们引入了一个前端团队和一个或多个后端团队的水平层。Micro前端描述了一种替代方法。它将应用程序划分为垂直切片。每个切片都是从数据库到用户界面构建的,并由一个专门的团队运行。不同的团队前端集成在客户的浏览器中,形成最终页面。这种方法与微服务架构有关。但主要区别在于,服务还包括其用户界面。这种服务的扩展消除了对中央前端团队的需求。以下是公司采用微前端架构的三个主要原因:

1、优化功能开发--一个团队包括开发功能所需的所有技能。不需要单独的前端和后端团队之间进行协调。

2、让前端升级更容易——每个团队都拥有从前端到数据库的完整堆栈。团队可以决定独立更新或切换其前端技术。

3、提高对客户的关注度--每个团队都将其功能直接交付给客户。不存在纯粹的API团队或运营团队。

在本章中,您将了解微前端解决了哪些问题,以及何时使用它们是有意义的。

微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。

Techniques, strategies and recipes for building a modern web app with multiple teams that can ship features independently. -- Micro Frontends

通俗来说,就是在一个web应用中可以独立的运行另一个web应用。

微前端有什么使用场景呢?

举例

  • 比如制作一个企业管理平台,把已有的采购系统和财务系统统一接入这个平台;

  • 比如有一个巨大的应用,为了降低开发和维护成本,分拆成多个小应用进行开发和部署,然后用一个平台将这些小应用集成起来;

  • 又比如一个应用使用vue框架开发,其中有一个比较独立的模块,开发者想尝试使用react框架来开发,等模块单独开发部署完,再把这个模块应用接回去。

一个完善的的微前端框架应该具备哪些能力呢?

能力

  • 子应用的加载和卸载能力

    页面需要从一个子应用切换到另一个子应用,框架必须具备加载、渲染、切换的能力。

  • 子应用独立运行的能力

    子应用运行会污染全局的 window 对象,样式会污染其他应用,必须有效的隔离起来。

  • 子应用路由状态保持能力

    激活子应用后,浏览器刷新、前进、后退子应用的路由都应该可以正常工作。

  • 应用间通信的能力

    应用间可以方便、快捷的通信。

使用微前端有什么收益呢?(@reference 乾坤)

收益

  • 技术栈无关

    主框架不限制接入应用的技术栈,微应用具备完全自主权。

  • 独立开发、独立部署

    微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新。

  • 增量升级

    在面对各种复杂场景时,我们通常很难对一个已经存在的系统做全量的技术栈升级或重构,而微前端是一种非常好的实施渐进式重构的手段和策略。

  • 独立运行时

    每个微应用之间状态隔离,运行时状态不共享。

可能有人会有疑问直接使用iframe不就可以做到吗?

基于浏览器的软件很快就会变得复杂且难以维护,尤其是当它被实现为大型单页应用程序时。通过采用微前端方法并将web应用程序设计为功能系统,您可以提供更快的功能开发、更容易的升级,并选择您在堆栈中使用的技术。Micro Frontends in Action是您简化笨重前端的指南,它由定义良好的小单元组成。

iframe 方案​

采用iframe的方案确实可以做到,而且优点非常明显。

优点

  • 非常简单,使用没有任何心智负担。
  • web应用隔离的非常完美,无论是jscssdom都完全隔离开来。

由于其隔离的太完美导致缺点也非常明显。

缺点

  • 路由状态丢失,刷新一下,iframeurl状态就丢失了。
  • dom割裂严重,弹窗只能在iframe内部展示,无法覆盖全局。
  • web应用之间通信非常困难。
  • 每次打开白屏时间太长,对于SPA 应用来说无法接受。

single-spa 方案​

single-spa是一个目前主流的微前端技术方案,其主要实现思路:

  • 预先注册子应用(激活路由、子应用资源、生命周期函数)。
  • 监听路由的变化,匹配到了激活的路由则加载子应用资源,顺序调用生命周期函数并最终渲染到容器。

乾坤微前端架构则进一步对single-spa方案进行完善,主要的完善点:

  • 子应用资源由 js 列表修改进为一个url,大大减轻注册子应用的复杂度。
  • 实现应用隔离,完成js隔离方案 window工厂) 和css隔离方案 (类vuescoped)。
  • 增加资源预加载能力,预先子应用htmljscss资源缓存下来,加快子应用的打开速度。

总结一下方案的优缺点:

优点

  • 监听路由自动的加载、卸载当前路由对应的子应用。
  • 完备的沙箱方案,js沙箱做了SnapshotSandboxLegacySandboxProxySandbox三套渐进增强方案,css沙箱做了两套strictStyleIsolationexperimentalStyleIsolation两套适用不同场景的方案。
  • 路由保持,浏览器刷新、前进、后退,都可以作用到子应用。
  • 应用间通信简单,全局注入。

缺点

  • 基于路由匹配,无法同时激活多个子应用,也不支持子应用保活。
  • 改造成本较大,从 webpack、代码、路由等等都要做一系列的适配。
  • css 沙箱无法绝对的隔离,js 沙箱在某些场景下执行性能下降严重。
  • 无法支持 vite 等 ESM 脚本运行。

无界方案​

在乾坤的issue中一个议题非常有意思,有个开发者提出能否利用iframe来实现js沙箱能力,这个idea启发了无界方案,应用加载机制和 js 沙箱机制。​

将子应用的js注入主应用同域的iframe中运行,iframe是一个原生的window沙箱,内部有完整的historylocation接口,子应用实例instance运行在iframe中,路由也彻底和主应用解耦,可以直接在业务组件里面启动应用。

Quarkd方案

Quarkd(Quark design缩写)是一种全新的组件库,底层基于Web Components,不同于传统组件框架(如Antd, Vant),需要浏览器中需要做大量前置工作。Quarkd则将这些工作放到构建应用程序的编译时来处理。组件的数据更新响应由浏览器自身API处理,更简单,更高效!

qiankun方案

qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。

参见:

<iframe> - HTML(超文本标记语言) | MDN

Web Component - Web API 接口参考 | MDN

webcomponents.org - Discuss & share web components

Web Component Essentials - Video Course and EBook - Cory Rylan

Micro Frontends - extending the microservice idea to frontend development

Micro Frontends in Action

qiankun - qiankun

无界 | 极致的微前端框架

Quarkd(Quark design) - 下一代浏览器原生组件库,它可以同时在任意框架或无框架中使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【史上最全面arduino esp32教程】SPI层次结构SPI协议与SPI控制器结构

文章目录 前言一、SPI 程序层次1.1 硬件原理图1.2 硬件框图1.3 软件层次 二、SPI协议2.1 硬件连线2.2 如何访问SPI设备2.3 SPI 框图 总结 前言 欢迎阅读本篇文章&#xff0c;将为您介绍Arduino ESP32上的SPI通信协议。SPI&#xff08;Serial Peripheral Interface&#xff09;…

Matlab快捷键与函数

注释&#xff1a;注释对于代码的重要性我们就不做过多的解释了。不做注释的代码不是好代码。选中要注释的语句&#xff0c;按快捷键CtrlR,或者在命令行窗口上面的注释地方可以进行注释。当然也可以直接在语句前面“%”就可以&#xff08;注意&#xff1a;一定要用英文符号&…

Matlab与高光谱遥感:环境监测的新时代

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

Windows10安装SSH

Linux运维工具-ywtool 目录 1. 打开设置2. 应用3.管理可选功能4.添加功能5.安装OpenSSH服务器6.测试是否安装成功 1. 打开设置 windows桌面按下"win l"键调出"设置"2. 应用 点击"应用"3.管理可选功能 点击"管理可选功能"4.添加功能…

定制红酒:品质与口感,双重保障

在葡萄酒的世界里&#xff0c;云仓酒庄的洒派定制红酒以其卓着的品质和迷人的口感&#xff0c;成为了无数品鉴者的心头好。这款红酒&#xff0c;不仅是对品质的追求&#xff0c;更是对生活的热爱和品味的体现。 云仓酒庄深知品质是红酒的灵魂&#xff0c;因此对洒派定制红酒的品…

SQL日期函数

文章目录 1.获取日期时间函数1.1 获取当前日期时间1.2 获取当前日期1.3 获取当前时间 2.日期格式化★★★2.1 日期转指定格式字符串2.2 字符串转日期 3.日期间隔3.1 增加日期间隔 ★★★3.2 减去一个时间间隔★★★3.3 日期相差天数&#xff08;天&#xff09;3.4 相差时间&…

【Linux】信号的处理{信号处理的时机/了解寄存器/内核态与用户态/信号操作函数}

文章目录 0.对于信号捕捉的理解1.信号处理的时机1.1 何时处理信号&#xff1f;1.2 内核态和用户态1.3 内核态和用户态的切换 2.了解寄存器3.信号捕捉的原理4.信号操作函数4.1sighandler_t signal(int signum, sighandler_t handler);4.2int sigaction(int signum, const struct…

网工内推 | 数通工程师,IE认证优先,五险一金,绩效奖

01 星网信通 招聘岗位&#xff1a;数通产品经理 职责描述&#xff1a; 1、售前技术支持&#xff1a;技术交流、产品选型报价、方案制作等工作&#xff1b; 2、招投标支持&#xff1a;项目招标参数撰写、标书质疑、应标文件技术部分撰写及资质文件归纳准备、现场讲标及技术澄清…

Prometheus(四):VMware Vsphere监控及数据展示

目录 1 vmware exporter安装配置1.1 vmware exporter介绍1.2 安装 - 使用kubernetes部署1、下载2、修改配置文件3、执行安装4、查看 1.3 安装-使用docker的方式1.4 Prometheus配置1.5 Grafana配置&#xff08;模板页面还需要修改&#xff09; 总结 1 vmware exporter安装配置 …

快速将第三方私有协议视频源接入GB28181系统

一.管理平台与视频接入网关架构 视频监控中的各类视频源可能存在不同厂商&#xff0c;不同协议&#xff0c;不同版本的情况&#xff0c;那么如何将众多这样的视频源统一接入到标准的视频管理平台呢&#xff1f; 视跃的视频综合管理平台通过内置一个视频接入网关的模式&#xff…

虚拟机修改工具箱

虚拟机修改工具箱&#xff0c;内含各种虚拟机修改工具&#xff0c;过检测工具&#xff0c;显卡驱动等一系列虚拟机常用资源&#xff01; 上图 关注我&#xff0c;要下载地址&#xff01;

如何做时间管理?

前言 本篇是最近学习工作提效系列课程的第一篇&#xff0c;如何做时间管理&#xff1f;关于时间管理的内容老生常谈了&#xff0c;我自己之前也分享过针对时间管理的一些思考&#xff0c;比如 近期对「时间管理」的一些思考&#xff0c; 还有高效能人士的七个习惯的分享【读书…

MYSQL 同步到ES 如何设计架构保持一致性

简单使用某个组件很容易&#xff0c;但是一旦要搬到生产上就要考虑各种各样的异常&#xff0c;保证你方案的可靠性&#xff0c;可恢复性就是我们需要思考的问题。今天来聊聊我们部门在 MYSQL 同步到ES的方案设计。 在面对复杂条件查询时&#xff0c;MYSQL往往显得力不从心&…

总结Dubbo开源RPC框架

一、分布式系统 1.1 集群和分布式 集群&#xff1a;多个机器提供一样的服务&#xff08;实现高性能、高可用、 可伸缩、高可扩展 &#xff09; 分布式&#xff1a;多个机器提供不同的服务&#xff0c;合起来为一个大服务 1.2 架构 二、Dubbo dubbo是一个高性能、轻量级的开…

模拟B\S服务器(扩展知识点)

3.2 模拟B\S服务器(扩展知识点) 模拟网站服务器&#xff0c;使用浏览器访问自己编写的服务端程序&#xff0c;查看网页效果。 案例分析 准备页面数据&#xff0c;web文件夹。 复制到我们Module中&#xff0c;比如复制到day08中 我们模拟服务器端&#xff0c;ServerSocket类…

Linux环境JMeter脚本性能测试、easyNmon生成监控报告

一、下载JMeter安装包 Jmeter是Java开发的&#xff0c;需要依赖JDK环境&#xff0c;因此我们需提前安装好JDK。 Jmeter是开源的工具&#xff0c;我们直接到官网下载即可。 最新版本下载地址&#xff1a;Apache JMeter - Download Apache JMeter 二、安装JMeter #新建jmete…

关于Java对接网络验证+实践小例子,简单易懂

一个简单的网络验证小例子&#xff0c;各位大佬勿喷 突发奇想&#xff0c;如果一位A友找你拿一份 Working Fruits&#xff0c;但是你不想这位A友把你辛苦劳作、熬夜加点写出的代码分享他或她的另外一位朋友B友&#xff0c;也许并不是很有价值的一个小作业而已&#xff0c;但是就…

draw.io 去除箭头

问题 draw.io 去除箭头 详细问题 笔者使用draw.io绘制流程图&#xff0c;需要没有箭头的连接器&#xff0c;但是General所提供的连接器添加了尾部箭头&#xff0c;如何取消尾部箭头? 解决方案 1、点击选中选择连接器&#xff08;箭头1&#xff09;。在格式面板的“Style…

45.i++和++i

目录 一.基本概念 二.区别 三.总结 四.视频教程 一.基本概念 i和i两者的作用都是自增加1。单独使用的话&#xff0c;i和i&#xff0c;效果都是一样的&#xff0c;就是ii1。 int main() {int i 0;i; } int main() {int i 0;i; } 最后的结果都是1。 二.区别 如上单独使…

操作系统系列学习——内存使用与分段

文章目录 前言内存使用与分段 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【哈工…