首页 > 其他分享 >qiankun 框架是怎么做的样式隔离

qiankun 框架是怎么做的样式隔离

时间:2023-04-25 14:04:01浏览次数:39  
标签:隔离 自定义 DOM 样式 app qiankun 应用 Shadow

Qiankun 是一个微前端框架,它在技术上采用了 Web Components 技术实现样式隔离。具体来说,Qiankun 利用 Shadow DOM 的特性,在应用程序容器中创建一个隔离的 DOM 树,使得每个子应用都可以拥有自己独立的样式作用域。

在 Qiankun 中,每个子应用都被封装为一个 Custom Element,这个 Custom Element 包含了子应用所需的所有 HTML、CSS 和 JavaScript 代码,并使用 Shadow DOM 将其包裹起来。由于 Shadow DOM 具有隔离性,因此子应用中声明的 CSS 样式只会作用于其内部,不会影响到其他子应用或主应用。

此外,Qiankun 还提供了一些全局 CSS 变量和类名规范,使得子应用之间的样式命名冲突问题得以解决,同时也能够很好地保持各子应用的样式风格一致性。

shadow Dom

Shadow DOM 是一种将 HTML、CSS 和 JavaScript 封装在一个组件中的技术,它使开发者能够创建具有独立作用域的 Web 组件。

使用 Shadow DOM,您可以将 HTML、CSS 和 JavaScript 封装在一个自定义元素内部,从而防止其中的样式和行为影响到文档中的其他元素。这意味着您可以创建可重复使用的组件,而无需担心与其他组件之间的冲突。

若要使用 Shadow DOM,您需要通过以下步骤创建和应用它:

创建一个自定义元素:您可以通过 document.createElement() 方法创建一个自定义元素,并使用 customElements.define() 方法将其注册到文档中。

创建 Shadow DOM:在自定义元素中,使用 element.attachShadow() 方法创建一个 Shadow DOM。该方法返回一个 ShadowRoot 对象,您可以向其中添加 HTML、CSS 和 JavaScript 代码。

编写样式和逻辑:在 Shadow DOM 中编写您想要的样式和逻辑。

插入 Shadow DOM:最后,在自定义元素中使用 element.appendChild() 方法将 Shadow DOM 插入到自定义元素中。

完成以上步骤后,您的自定义元素就可以作为一个独立的 Web 组件使用了。其他开发者可以在其项目中使用该组件,而无需担心与其他组件之间的干扰。

<my-element></my-element>
// 定义一个自定义元素
class MyElement extends HTMLElement {
  constructor() {
    super();

    // 创建一个 Shadow DOM
    const shadow = this.attachShadow({ mode: 'open' });

    // 创建一个段落元素,并设置样式和内容
    const p = document.createElement('p');
    p.textContent = 'Hello, World!';
    p.style.color = 'red';

    // 插入段落元素到 Shadow DOM 中
    shadow.appendChild(p);
  }
}

// 注册自定义元素
customElements.define('my-element', MyElement);

乾坤demo代码

主应用代码:

import { registerMicroApps, start } from 'qiankun';
import styleLoader from './styleLoader';

// 定义子应用列表
const microApps = [
  {
    name: 'sub-app',
    entry: '//localhost:7100',
    container: '#sub-app-container',
    activeRule: '/sub-app',
  },
];

// 注册子应用
registerMicroApps(microApps, {
  // 加载子应用之前,预加载子应用的样式
  beforeLoad: (app) => {
    return styleLoader.load(app);
  },
});

// 启动 Qiankun
start();

styleLoader.js文件代码:

const cache = {};

export default {
  async load(app) {
    if (cache[app.name]) {
      return cache[app.name];
    }

    const cssList = await Promise.all(
      app.css.map((cssFile) => {
        return fetch(cssFile).then((res) => res.text());
      })
    );

    const styleEl = document.createElement('style');
    styleEl.textContent = cssList.join('\n');

    cache[app.name] = styleEl;

    return styleEl;
  },
};

子应用代码:

// 使用 Shadow DOM 渲染内容
const template = `
  <div class="sub-app">
    <h1>Hello, I am sub app!</h1>
    ...
  </div>`;

shadowDom.innerHTML += template;

// 将样式加入到 Shadow DOM 中
const shadowDom = document.querySelector('.sub-app-container').attachShadow({ mode: 'open' });
shadowDom.appendChild(styleEl);

以上代码中,主应用使用 styleLoader.js 加载子应用的 CSS 文件,并将样式加入到 Shadow DOM 中,从而实现样式隔离。子应用则使用 Shadow DOM 渲染内容,确保不会受到主应用的样式影响。

标签:隔离,自定义,DOM,样式,app,qiankun,应用,Shadow
From: https://www.cnblogs.com/shiazhen/p/17352397.html

相关文章

  • Echarts4.0 迁徙图模拟Echarts2.0样式
     由于公司业务需求做Echarts4.0的迁徙图,但是Echarts4.0默认的迁徙图的飞行轨迹和迁徙线的颜色都是一样的,比较单调,现在模拟Echarts2.0的样式模拟了一个demo,虽然没有全部相同,但大体相近。备忘一下letminigrateChart=echarts.init(document.getElementById("MinigrateChart"));......
  • 答题积分小程序云开发实战-界面交互篇:注册登录页布局样式与逻辑交互开发
    微信小程序云开发实战-答题积分赛小程序界面交互篇:注册登录页布局样式与逻辑交互开发写在前面-开发调试小技巧模拟器通常默认展示的页面是首页,那么如果我们想切换到其他页面呢,那怎么办?我这里教给初学者三种方式,方便大家在搭建页面过程中,进行开发调试。点击事件跳转给页面按钮添加一......
  • Element 级联选择器(Cascader)点击文字(或者一行)选中样式回显
    预览图实现的效果1、选中最后一级,下拉框收缩2、下拉框的每一行点击都可以选中3、点击radio,也能实现选中最后一级,下拉框收缩组件代码<el-cascaderref="cascaderHandleRef"v-model="languageIds"class="width-260":options="languageList":props="{check......
  • 基于原生alert或者confirm的样式修改
    <style>#alertModel{position:fixed;top:0;left:0;width:100%;height:100%;z-index:99999;background:rgba(0,0,0,0.6);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-alig......
  • 通过 css 控制 window.print 的样式
    打印页面隐藏打印按钮在button按钮加一个class样式class="print-button-container"调用window.print方法的页面加以下css<stylescopelang="scss">@mediaprint{.table-print-disable{display:none;}@page{/*纵向打印*/size:p......
  • 你真的掌握样式优先级和选择器优先级吗?
    css选择器以及优先级1.样式优先级最近的祖先样式比其他祖先样式优先级高"直接样式"比"祖先样式"优先级高选择器优先级内联样式>id选择器>类选择器=属性选择器=伪类选择器>标签选择器=伪元素选择器组合选择符分类后代选择符.a.b{}子选择符.a>.......
  • el-table设置表格表头和内容的对齐方式及样式
    在el-table标签上加上以下代码即可为表头和表格设置统一对齐方式和样式:header-cell-style="{'text-align':'center','background':'#f7f8fa'}":cell-style="{'text-align':'center'}" 在el-table-column标签......
  • el-button实现点击按钮更换背景色并自动回显原来的样式
    场景:点击按钮的会更改背景色会自动回显默认样式点击之前:点击之后自动又恢复点击前样式 实现:我用得是element-ui的el-button组件实现,代码如下在template中设置一个id<el-buttonclass="downloadBtn"id="resetFormBtn"@click="downloadBtn">报表下载</el-button> 在m......
  • 基于HTML5的移动Web应用——Bootstrap 样式案例
     需求说明使用container、row等栅格系统的知识布局网页结构使用表单元素制作登录页面使用btn-success制作“搜索”按钮,用btn-danger制作“登录”按钮运行效果新梦想技术分享参考代码<!DOCTYPEhtml><html><headlang="en"><metacharset="UTF-8"><metaname="view......
  • 组件的样式(含三元表达式)
    04-组件的样式import'../css/01.css'//导入样式functionApp(){varmyname="lucax"varobj={background:"red",fontSize:"40px"//font-size所有样式的-都改为用驼峰写法去替代}return(<div>......