返回顶部
首页 > 资讯 > 前端开发 > JavaScript >微前端之 js隔离 样式隔离 元素隔离问题详解
  • 432
分享到

微前端之 js隔离 样式隔离 元素隔离问题详解

2024-04-02 19:04:59 432人浏览 安东尼
摘要

目录WEBComponent 介绍js隔离问题解决方法一用 Proxy 代理方法二 用快照样式隔离问题方法一 样式增加不同前缀方法二 ShadawDom元素隔离WebComponen

WebComponent 介绍

前端框架中,js隔离、样式隔离、元素隔离是必须解决的三个问题,下面我们就来分别说说这三个问题是什么?怎么解决?

涉及的核心点是 Proxy,WebComponent,shadowDOM

WebComponent 不在这三个问题中,但是我们做个简单介绍

浏览器默认的标签有 div,a,p等等,浏览器是会自动识别,并且有默认的事件和样式。

浏览器相对于提供了WebComponent,我们可以自定义html标签,注意规定自定义标签需要包含横线,如<user-card>,父类都是HTMLElement

attachShadow 是大多数标签都支持的,比如 div,p,selection,但是a,ul,li等不支持,如果执行attachShadow,那么组件的html结构会挂在shadowRoot下,否则直接挂着组件下。

用法

class UserCard extends HTMLElement {
  static get observedAttributes() {return ['name', 'url']; }
  constructor() {
    super();
    // 可以创Shadom,通过this.shadowRoot获取
    // this.attachShadow({ mode: 'open' })
  }
  connectedCallback (){
      console.log('钩子,元素append到ducument触发')
  }
  disconnectedCallback (){
      console.log('钩子,元素从document删除触发')
  }
  // 只有observedAttributes 中监听的属性name,url变化会触发下面回调
  attributeChangedCallback (attr, oldVal, newVal){
      console.log('钩子,元素属性改变时触发')
  }
}
window.customElements.define('user-card', UserCard);

更新细节查看 web自定义元素

js隔离

问题

主要是很对全局变量window

  • 情况1:都对全局变量赋值

应用A,写 window.r = 1;

然后有应用B,又写 window.r = 2,这就乱套了

  • 情况2:都设置事件

应用A,window.addEventListener('click',()=>console.log('A'));

应用B,window.addEventListener('click',()=>console.log('B'));

这就乱套了

解决

对应全局对象,各个应该要独立,怎么实现呢,有两种方法

方法一用 Proxy 代理

es2015 Reflect属于一个静态类或者设置属性等用法

const rawWindow = window
const proxyWindow = new Proxy({},{
    get: (target, key): unknown => {
        // 原 target 上有就返回,否则返回 rawWindow 属性
        return Reflect.has(target, key) ? Reflect.get(target, key) : Reflect.get(rawWindow, key)
    },
    set: (target, key, value): boolean => {
        if(!Object.prototype.hasOwnProperty.call(target, key) && Object.prototype.hasOwnProperty.call(rawWindow, key)){
            const descriptor = Object.getOwnPropertyDescriptor(rawWindow, key)
            const { configurable, enumerable, writable, set } = descriptor!
            // set value because it can be set
            rawDefineProperty(target, key, {
              value,
              configurable,
              enumerable,
              writable: writable ?? !!set,
            })
        } else {
            Reflect.set(target, key, value)
        }
    }
})

将 window.r = 1 和 window.addEventListener('click',()=>console.log('A')) 包括到自执行函数里面

A和B互不干扰

;(function(window){
    window.r = 1
    window.addEventListener('click',()=>console.log('A'))
})(proxyWindowA)
;(function(window){
    window.r = 2
    window.addEventListener('click',()=>console.log('B'))
})(proxyWindowB)

方法二 用快照

快照隔离有个前提条件是,当前还有一个应用显示,不能出现多个应用并存显示在界面上,应用A,B切换时,比如当前应用是A,现在要切入到应用B

  • 暂存起来应用A的全局变量和事件
  • 恢复全局变量和事件到应用A之前
  • 检查之前是否保持有应用B的全局变量和事件,如果有,则载入

样式隔离

问题

同理,各个应用之前可能相互设置标签样式,会相互影响,或者影响全局样式,比如应用A给body设置样式,应用B也给body设置样式

方法一 样式增加不同前缀

每个应用通过前缀独立区分开,京东micro-app默认是采用的这个策略,唯一注意的一个小点是,基座样式会影响子应用的样式,所以需要注意基座中不要写太多样式

方法二 ShadawDom

大多数Html标签都有 attachShadow() 方法给指定的元素挂载一个 Shadow DOM。参数是open或closed

ShadawDom 样式绝对隔离,不用加前缀,如下图

用法

//open 是外界可以访问到Element.shadowRoot再访问到内部元素,closed就是完全不能访问内部元素
var shadowroot = element.attachShadow('open|closed')  

元素隔离

元素隔离是 基座应用和子应用都有一个元素<div id='root'></div>,此时子应用通过document.querySelector('#root'),因为js隔离已经做了代理,此时document.querySelector只是子应用本身了

以上就是微前端之 js隔离 样式隔离 元素隔离问题详解的详细内容,更多关于微前端js 样式 元素隔离的资料请关注编程网其它相关文章!

--结束END--

本文标题: 微前端之 js隔离 样式隔离 元素隔离问题详解

本文链接: https://lsjlt.com/news/165795.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 微前端之 js隔离 样式隔离 元素隔离问题详解
    目录WebComponent 介绍js隔离问题解决方法一用 Proxy 代理方法二 用快照样式隔离问题方法一 样式增加不同前缀方法二 ShadawDom元素隔离WebComponen...
    99+
    2024-04-02
  • 微前端框架qiankun隔离方法怎么使用
    本文小编为大家详细介绍“微前端框架qiankun隔离方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“微前端框架qiankun隔离方法怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。沙箱隔离在基于...
    99+
    2023-07-05
  • virtualenv隔离Python环境的问题解析
    目录virtualenv介绍virtualenv应用virtualenv介绍 virtualenv为应用提供了隔离的Python运行环境,解决了不同应用间多版本的冲突问题。virtu...
    99+
    2024-04-02
  • angular怎么进行样式隔离?实现机制详解
    总结我们首先介绍了css 的属性选择器和后代选择器。通过分析angular 生成的html 和css 代码,发现angular 的样式隔离功能,完全是基于这两个内容实现的。接下来,分析了::ng-deep 有时候生效,有时候有不生效的原因。...
    99+
    2023-05-14
    Angular
  • Qiankun原理详解JS沙箱是如何做隔离
    目录前言复习一下沙箱SanpshotSandboxLegacySandboxProxySandbox隔离原理XXX is undefined总结前言 相信大家也知道 qiankun ...
    99+
    2024-04-02
  • Java设计模式之接口隔离原则精解
    1.什么是接口隔离原则? 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口范围上。 2.对应代码 上面这张图呢,就违反了接口隔离原则。它对应的代码如下:...
    99+
    2024-04-02
  • MySql学习笔记之事务隔离级别详解
    背景 说的事务,大家应该都不陌生,开发用到 MySql 数据库的时候,通常会用到事务。其中比较经典的例子就是转账,比如你要给小明转 50 块钱,而此时你的银行卡也就只有 50 块钱...
    99+
    2024-04-02
  • Java设计模式七大原则之接口隔离原则详解
    目录定义案例需求方案一方案二对比分析总结小知识点相同点不同点定义 接口隔离原则(Interface Segregation Principle),又称为ISP原则,官方定义为 1.客...
    99+
    2024-04-02
  • MySQL的事务隔离级别可以解决什么问题
    下面讲讲关于MySQL的事务隔离级别可以解决什么问题,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完MySQL的事务隔离级别可以解决什么问题这篇文章你一定会有所受益。 ...
    99+
    2024-04-02
  • 解决MySql8.0 查看事务隔离级别报错的问题
    目录MySql8.0 查看事务隔离级别报错问题命令更改为MySQL的事务隔离级别(包含mysql8.0+设置与查看)一、事务的基本要素(ACID)二、事务的并发问题三、MySQL事务...
    99+
    2024-04-02
  • 深入理解Mysql事务隔离级别与锁机制问题
    概述 数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能导致脏读、脏写、不可重复度和幻读。这些问题的本质都是数据库的多事务并发问题,为了解决事...
    99+
    2024-04-02
  • java面向对象设计原则之接口隔离原则示例详解
    目录概念实现拓展概念 小接口原则,即每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。如下图所示定义了一个接口,包含了5个方法,实现类A用到了3个方法、实现类B用...
    99+
    2024-04-02
  • 怎样解决MySQL数据库在RR隔离级别下容易产生幻读的问题
    这篇文章将为大家详细讲解有关怎样解决MySQL数据库在RR隔离级别下容易产生幻读的问题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的...
    99+
    2024-04-02
  • 数据库事务隔离级别常见问题解答:帮你轻松理解数据库事务机制
    1. 数据库事务隔离级别有哪些? 数据库事务隔离级别通常包括以下四种: 未提交读(Read Uncommitted):事务可以读取其他事务未提交的数据,但这些数据可能最终不会被提交,因此存在脏读的风险。未提交读通常用于对数据一致性要求...
    99+
    2024-02-10
    数据库 事务 隔离级别 并发控制 ACID
  • 前后端分离和跨域问题的详细解决方案(CORS的原理)
    目录前后端分离前后端分离的好处个人理解上存在两种解释跨域问题存在的原因跨域问题的解决方案修改浏览器配置解决跨域使用jsonp解决跨域CORS解决跨域 服务软件实现跨域基于A...
    99+
    2023-02-15
    前后端分离跨域解决方案 前后端分离 跨域 跨域解决方案前端
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作