<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
微前端框架中,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自定義元素
主要是很對全域性變數window
應用A,寫 window.r = 1;
然後有應用B,又寫 window.r = 2,這就亂套了
應用A,window.addEventListener('click',()=>console.log('A'));
應用B,window.addEventListener('click',()=>console.log('B'));
這就亂套了
對應全域性物件,各個應該要獨立,怎麼實現呢,有兩種方法
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給body設定樣式,應用B也給body設定樣式
每個應用通過字首獨立區分開,京東micro-app預設是採用的這個策略,唯一注意的一個小點是,基座樣式會影響子應用的樣式,所以需要注意基座中不要寫太多樣式
大多數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 樣式 元素隔離的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45