Web Components 与 CSS沙箱

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模板):