亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

微前端之?js隔離?樣式隔離?元素隔離問題詳解

 更新時間:2022年08月23日 15:36:33   作者:一個不會重復(fù)的id  
這篇文章主要為大家介紹了微前端之?js隔離?樣式隔離?元素隔離問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

WebComponent 介紹

微前端框架中,js隔離、樣式隔離、元素隔離是必須解決的三個問題,下面我們就來分別說說這三個問題是什么?怎么解決?

涉及的核心點(diǎn)是 Proxy,WebComponent,shadowDOM

WebComponent 不在這三個問題中,但是我們做個簡單介紹

瀏覽器默認(rèn)的標(biāo)簽有 div,a,p等等,瀏覽器是會自動識別,并且有默認(rèn)的事件和樣式。

瀏覽器相對于提供了WebComponent,我們可以自定義Html標(biāo)簽,注意規(guī)定自定義標(biāo)簽需要包含橫線,如<user-card>,父類都是HTMLElement

attachShadow 是大多數(shù)標(biāo)簽都支持的,比如 div,p,selection,但是a,ul,li等不支持,如果執(zhí)行attachShadow,那么組件的html結(jié)構(gòu)會掛在shadowRoot下,否則直接掛著組件下。

用法

class UserCard extends HTMLElement {
  static get observedAttributes() {return ['name', 'url']; }
  constructor() {
    super();
    // 可以創(chuàng)Shadom,通過this.shadowRoot獲取
    // this.attachShadow({ mode: 'open' })
  }
  connectedCallback (){
      console.log('鉤子,元素append到ducument觸發(fā)')
  }
  disconnectedCallback (){
      console.log('鉤子,元素從document刪除觸發(fā)')
  }
  // 只有observedAttributes 中監(jiān)聽的屬性name,url變化會觸發(fā)下面回調(diào)
  attributeChangedCallback (attr, oldVal, newVal){
      console.log('鉤子,元素屬性改變時觸發(fā)')
  }
}
window.customElements.define('user-card', UserCard);

更新細(xì)節(jié)查看 web自定義元素

js隔離

問題

主要是很對全局變量window

  • 情況1:都對全局變量賦值

應(yīng)用A,寫 window.r = 1;

然后有應(yīng)用B,又寫 window.r = 2,這就亂套了

  • 情況2:都設(shè)置事件

應(yīng)用A,window.addEventListener('click',()=>console.log('A'));

應(yīng)用B,window.addEventListener('click',()=>console.log('B'));

這就亂套了

解決

對應(yīng)全局對象,各個應(yīng)該要獨(dú)立,怎么實(shí)現(xiàn)呢,有兩種方法

方法一用 Proxy 代理

es2015 Reflect屬于一個靜態(tài)類或者設(shè)置屬性等用法

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')) 包括到自執(zhí)行函數(shù)里面

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)

方法二 用快照

快照隔離有個前提條件是,當(dāng)前還有一個應(yīng)用顯示,不能出現(xiàn)多個應(yīng)用并存顯示在界面上,應(yīng)用A,B切換時,比如當(dāng)前應(yīng)用是A,現(xiàn)在要切入到應(yīng)用B

  • 暫存起來應(yīng)用A的全局變量和事件
  • 恢復(fù)全局變量和事件到應(yīng)用A之前
  • 檢查之前是否保持有應(yīng)用B的全局變量和事件,如果有,則載入

樣式隔離

問題

同理,各個應(yīng)用之前可能相互設(shè)置標(biāo)簽樣式,會相互影響,或者影響全局樣式,比如應(yīng)用A給body設(shè)置樣式,應(yīng)用B也給body設(shè)置樣式

方法一 樣式增加不同前綴

每個應(yīng)用通過前綴獨(dú)立區(qū)分開,京東micro-app默認(rèn)是采用的這個策略,唯一注意的一個小點(diǎn)是,基座樣式會影響子應(yīng)用的樣式,所以需要注意基座中不要寫太多樣式

方法二 ShadawDom

大多數(shù)Html標(biāo)簽都有 attachShadow() 方法給指定的元素掛載一個 Shadow DOM。參數(shù)是open或closed

ShadawDom 樣式絕對隔離,不用加前綴,如下圖

用法

//open 是外界可以訪問到Element.shadowRoot再訪問到內(nèi)部元素,closed就是完全不能訪問內(nèi)部元素
var shadowroot = element.attachShadow('open|closed')  

元素隔離

元素隔離是 基座應(yīng)用和子應(yīng)用都有一個元素<div id='root'></div>,此時子應(yīng)用通過document.querySelector('#root'),因?yàn)閖s隔離已經(jīng)做了代理,此時document.querySelector只是子應(yīng)用本身了

以上就是微前端之 js隔離 樣式隔離 元素隔離問題詳解的詳細(xì)內(nèi)容,更多關(guān)于微前端js 樣式 元素隔離的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Proxy Facade設(shè)計模式簡化系統(tǒng)訪問的強(qiáng)大工具原理詳解

    Proxy Facade設(shè)計模式簡化系統(tǒng)訪問的強(qiáng)大工具原理詳解

    這篇文章主要為大家介紹了 Proxy Facade設(shè)計模式簡化系統(tǒng)訪問的強(qiáng)大工具原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 微信小程序 action-sheet 反饋上拉菜單簡單實(shí)例

    微信小程序 action-sheet 反饋上拉菜單簡單實(shí)例

    這篇文章主要介紹了微信小程序 action-sheet 反饋上拉菜單簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 微信小程序 時間格式化(util.formatTime(new Date))詳解

    微信小程序 時間格式化(util.formatTime(new Date))詳解

    這篇文章主要介紹了微信小程序 時間格式化(util.formatTime(new Date))詳解的相關(guān)資料,這里附實(shí)例,一目了然很容易解決,需要的朋友可以參考下
    2016-11-11
  • 類和原型的設(shè)計模式之復(fù)制與委托差異

    類和原型的設(shè)計模式之復(fù)制與委托差異

    這篇文章主要為大家介紹了類和原型的設(shè)計模式之復(fù)制與委托差異詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • JavaScript前端迭代器Iterator與生成器Generator講解

    JavaScript前端迭代器Iterator與生成器Generator講解

    這篇文章主要為大家介紹了JavaScript前端迭代器Iterator與生成器Generator講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 微信小程序(二十二)action-sheet組件詳細(xì)介紹

    微信小程序(二十二)action-sheet組件詳細(xì)介紹

    這篇文章主要介紹了微信小程序action-sheet組件詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • JS創(chuàng)建對象的四種方式

    JS創(chuàng)建對象的四種方式

    這篇文章主要給大家分享JS創(chuàng)建對象的四種方式,分別是字面量的方式去創(chuàng)建對象、使用new字符創(chuàng)建對象、自定義構(gòu)造函數(shù)、工廠模式創(chuàng)建對象,更多詳細(xì)內(nèi)容,請參考下面文章的具體內(nèi)容
    2021-11-11
  • 8個JS的reduce使用實(shí)例和reduce操作方式

    8個JS的reduce使用實(shí)例和reduce操作方式

    reduce方法是JavaScript中一個比較強(qiáng)大的方法,可能在平時開發(fā)中,有人根本沒用過,通過下面的8個例子,學(xué)會reduce的用法以及它的常用場景,需要的朋友可以參考一下
    2021-09-09
  • js 數(shù)組 fill() 填充方法

    js 數(shù)組 fill() 填充方法

    這篇文章主要介紹了js 數(shù)組 fill() 的填充方法,初始化數(shù)組的方法,但是初始化數(shù)組之后,數(shù)組中的每一項(xiàng)元素默認(rèn)為 empty 空位占位,如何對數(shù)組這些空位添加默認(rèn)的元素,ES6提供了 fill() 方法實(shí)現(xiàn)這一操作。本文總結(jié)數(shù)組 fill() 方法的詳細(xì)使用,需要的朋友可以參考一下
    2021-10-10
  • JavaScript兩張圖搞懂原型鏈

    JavaScript兩張圖搞懂原型鏈

    這篇文章主要分享JavaScript的兩張原型鏈圖,我們上一篇文章介紹了JavaScript中的原型,為什么不將原型鏈一起介紹了呢?因?yàn)镴avaScript中的原型鏈?zhǔn)且粋€難點(diǎn),也是一個面試必問的考點(diǎn),現(xiàn)在就來學(xué)習(xí)一下具體內(nèi)容吧
    2021-12-12

最新評論