精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

微前端如何做樣式隔離?

開發(fā) 前端
樣式隔離實現(xiàn)起來不復(fù)雜,各種方案都有其局限性。目前比較穩(wěn)定的方案還是使用 css Modules 之類的工具配合團(tuán)隊之間協(xié)商好樣式前綴,從樣式命名 & 優(yōu)先級上解決問題。

問題示例

className 命名重復(fù)導(dǎo)致的樣式?jīng)_突

我們先創(chuàng)建一個問題,驗證樣式?jīng)_突的存在:

在主應(yīng)用和子應(yīng)用上分別使用 div 元素插入一段標(biāo)題,兩個 div 元素使用相同的 class 名 title,分別在 class 中設(shè)置文字顏色,主應(yīng)用 color 值為 yellow,子應(yīng)用為 red。

由于子應(yīng)用的樣式晚于主應(yīng)用加載,所以主應(yīng)用的樣式會被覆蓋。

圖片

以上問題在同時加載多個子應(yīng)用時也會存在:各個應(yīng)用之間也可能存在同名的 className 或者給相同條件的選擇器添加了樣式, 那么最終只有優(yōu)先級最高的樣式才會生效。要確保應(yīng)用之間的樣式不會互相影響,就需要對應(yīng)用間的樣式進(jìn)行隔離。

html、body 標(biāo)簽的樣式?jīng)_突

html 、 body 標(biāo)簽, 在各個應(yīng)用中都是唯一的元素,其樣式必然會對主應(yīng)用的樣式產(chǎn)生影響。

圖片

解決方案

為了以上樣式?jīng)_突問題,通常有以下兩種思路:

  • 通過樣式命名 & 樣式優(yōu)先級解決
  • 通過宿主環(huán)境隔離來達(dá)到樣式隔離

樣式命名 & 樣式優(yōu)先級

假設(shè)各個應(yīng)用之間的樣式 className 都是全局唯一的, 那么不同 className 下的樣式就一定不會發(fā)生沖突。

再加上樣式優(yōu)先級來配合解決,就能解決標(biāo)簽選擇器的樣式?jīng)_突:

  • 例如在原 className 、標(biāo)簽選擇器前面再添加一個 selector
  • 標(biāo)簽選擇器 + 屬性選擇器

子應(yīng)用改造

這里需要處理的樣式也分為以下兩種:

UI 組件庫等引入的全局樣式

默認(rèn)情況下,UI 組件庫的 prefixCls 都是相同的,不過它們提供了 ConfigProvider 可以用來修改 UI 組件庫全局樣式的 prefixCls:全局化配置 ConfigProvider - Ant Design[1] 全局配置 ConfigProvider | ArcoDesign[2]

自定義樣式

通過 BEM、CSS Modules、 CSS in JS 等手段來獲得與其他應(yīng)用不同的選擇器名,來規(guī)避樣式?jīng)_突。

圖片

或者直接使用 postcss 的插件,在編譯階段給所有樣式添加 prefix selector。

https://github.com/RadValentin/postcss-prefix-selector

主應(yīng)用在運(yùn)行時統(tǒng)一轉(zhuǎn)換樣式

如果不想或者無法干涉子應(yīng)用的打包配置時,我們也可以通過主應(yīng)用在運(yùn)行時給所有樣式規(guī)則添加 prefix selector,來提升樣式優(yōu)先級。

比如 A 應(yīng)用的類選擇器 .title,在轉(zhuǎn)換后變成 #garfish_app_id_xxx .title,#garfish_app_id_xxx 是子應(yīng)用最外層元素的 id,故保證該應(yīng)用下的樣式優(yōu)先級變高,并讓其只作用在當(dāng)前應(yīng)用下。

圖片

當(dāng)然, 僅使用以上手段并不能解決子應(yīng)用 html、 body 標(biāo)簽給主應(yīng)用帶來的樣式影響,細(xì)心的你可能已經(jīng)發(fā)現(xiàn),garfish 會為每個子應(yīng)用創(chuàng)建一個假的 html 與 body 元素,然后對應(yīng)子元素的 html 、body 樣式都會應(yīng)用到這個假的 html、 body元素上。

圖片

Garfish

在 garfish 中是以插件來支持運(yùn)行時轉(zhuǎn)換樣式的:

import { GarfishCssScope } from '@garfish/css-scope';
Garfish.run({
plugins: [
GarfishCssScope({
fixBodyGetter: true,
excludes: ['appName'],
}),
],
})

具體的源碼實現(xiàn)在這里:

https://github.com/modern-js-dev/garfish/tree/1f83e8fb35fd2ac12785fc7410015c3cd23c3bd2/packages/css-scope

優(yōu)點

支持大部分樣式隔離需求,能夠同時處理 UI 組件庫的全局樣式與自定義樣式,比較省心。

缺點

運(yùn)行時處理樣式,會有一定性能損耗

如果其他子應(yīng)用或者主應(yīng)用中使用了 !important ...

宿主環(huán)境隔離

Shadow DOM

附加并隱藏在常規(guī) DOM 下的節(jié)點叫做 Shadow DOM —— 它以 Shadow root 節(jié)點為起始根節(jié)點,在這個根節(jié)點的下方,可以是任意元素,就和普通的 DOM 元素一樣,它可以通過方法添加子節(jié)點、設(shè)置屬性,以及為節(jié)點添加自己的樣式,隱藏的 DOM 樣式和其余 DOM 是完全隔離的,類似于 iframe 的樣式隔離效果。

圖片

如何創(chuàng)建

可以使用 shadowHostElement.attachShadow() 方法來將一個 shadow root 附加到調(diào)用方法的元素上。它接受一個配置對象作為參數(shù),該對象有一個 mode 屬性,值可以是 open 或者 closed:

let shadowRoot = shadowHostElement.attachShadow({mode: 'open'});
let shadowRoot = shadowHostElement.attachShadow({mode: 'closed'});

open 表示可以通過頁面內(nèi)的 JavaScript 來獲取 Shadow DOM,例如使用 Element.shadowRoot 屬性:

let shadowRoot = shadowHostElement.shadowRoot;

如果將 mode 設(shè)置為 closed,那么elementRef.shadowRoot 將會返回 null。

瀏覽器中的某些內(nèi)置元素就是如此,例如<video>,就包含了不可訪問的 Shadow DOM。

為 shadow DOM 添加樣式

我們可以通過創(chuàng)建<style> 元素為 Shadow DOM 添加樣式,也可以通過創(chuàng)建<link> 元素引用外部樣式表。

// 使用 style 元素為 shadow DOM 添加樣式
var style = document.createElement('style');
style.textContent = `
.title {
color: blue;
}
`;
shadow.appendChild(style);

// 使用 link 標(biāo)簽為 Shadow DOM 添加樣式
const linkElem = document.createElement('link');
linkElem.setAttribute('rel', 'stylesheet');
linkElem.setAttribute('href', 'style.css');
shadow.appendChild(linkElem);

Shadow DOM 的事件模型

當(dāng)一個事件從 Shadow DOM 中冒泡出來時,事件的 target 屬性就會調(diào)整為 shadow DOM 的宿主。

有些事件甚至不會冒泡到 Shadow DOM 之外。

以下這些事件是會冒泡出去的:

  • Focus Events:blur, focus, focusin, focusout
  • Mouse Events:click, dblclick, mousedown, mouseenter, mousemove, etc.
  • Wheel Events:wheel
  • Input Events:beforeinput, input
  • Keyboard Events:keydown, keyup
  • Composition Events:compositionstart, compositionupdate, compositionend
  • DragEvent:dragstart, drag, dragend, drop, etc.

如果 shadow dom 的模式為 open,調(diào)用event.composedPath()就會返回一個數(shù)組——包含事件冒泡經(jīng)過的所有元素。

Garfish

在 garfish 中使用也非常簡單,只需要一行配置即可開啟:

https://github.com/modern-js-dev/garfish/blob/main/packages/utils/src/container.ts#L37

Garfish.run({
sandbox: {
strictIsolation: true,
},
});

圖片

優(yōu)點

完全隔離 CSS 樣式。

缺點

  • 在使用一些 antd Select 組件的時候(很多情況下都是將 open 后的元素默認(rèn)添加到了 document.body 上 )這個時候它就跳過了陰影邊界,逃逸到主應(yīng)用里面,導(dǎo)致樣式丟失,這時候就需要去子應(yīng)用中手動修正該彈出元素的掛載節(jié)點(例如使用 antd select 的 getPopupContainer)。

圖片

圖片

  • 會與 react v17 之前的事件代理機(jī)制產(chǎn)生沖突[3]

React v16 會各種事件處理函數(shù)代理到 document ,但是根據(jù) Shadow DOM 的事件模型,從 Shadow DOM 中冒泡出來的事件 target 都會被調(diào)整成 shadow host, 導(dǎo)致 react v16 無法通過 event.target 找到對應(yīng)的元素并觸發(fā)事件。

garfish 源碼中的這部分就是在做 retarget:

https://github.com/modern-js-dev/garfish/blob/main/packages/utils/src/container.ts#L42

https://github.com/modern-js-dev/garfish/blob/1f83e8fb35fd2ac12785fc7410015c3cd23c3bd2/packages/utils/src/dispatchEvents.ts#L74

React v17 不再將事件代理到 document 上,而是將事件代理到了 root Element 上,從而規(guī)避了這個問題( root element 也還在 shadow tree 中 )。

圖片

關(guān)于 react v17 事件代理的更多內(nèi)容可以看看下面的文章:

https://reactjs.org/blog/2020/08/10/react-v17-rc.html#changes-to-event-delegation

  • 兼容性[4]還行,需要考慮
  • Iconfont fontface
  • ..

總結(jié)

樣式隔離實現(xiàn)起來不復(fù)雜,各種方案都有其局限性。目前比較穩(wěn)定的方案還是使用 css Modules 之類的工具配合團(tuán)隊之間協(xié)商好樣式前綴,從樣式命名 & 優(yōu)先級上解決問題。

(主應(yīng)用的樣式依然可以影響到子應(yīng)用,優(yōu)先級也可能會被 !important 等操作被破壞,不過大多數(shù)場景下足夠了)

但從長期來看,通過 Shadow DOM 完全隔離樣式還是很香的,也希望 Shadow DOM 與其他框架、組件庫結(jié)合使用的暗坑早日被填補(bǔ)完畢。

責(zé)任編輯:武曉燕 來源: ELab團(tuán)隊
相關(guān)推薦

2024-05-28 09:05:31

2019-01-17 10:58:37

2015-03-18 11:44:28

微信營銷

2024-03-13 13:07:36

移動端樣式適配

2024-01-04 08:49:03

Vuescope限制

2022-08-29 08:08:58

SQLOracleCPU

2022-08-03 09:11:31

React性能優(yōu)化

2015-07-30 11:21:16

代碼審查

2022-02-17 13:18:58

定價模型營銷AHP

2012-03-12 16:42:54

測試

2023-12-29 10:04:47

數(shù)據(jù)分析

2013-07-24 10:01:24

產(chǎn)品設(shè)計產(chǎn)品經(jīng)理新手做產(chǎn)品

2021-04-25 09:19:22

騰訊Code Reviewleader

2023-11-06 07:33:01

推薦策略數(shù)據(jù)分析

2012-05-07 08:49:57

Clojure

2018-05-15 15:33:07

Leader前端團(tuán)隊

2024-07-16 11:26:35

微前端代碼JS

2017-11-02 08:54:13

數(shù)據(jù)存儲架構(gòu)

2018-05-18 09:18:00

數(shù)據(jù)分析報告數(shù)據(jù)收集

2018-07-18 14:39:29

點贊
收藏

51CTO技術(shù)棧公眾號

亚洲国产高清自拍| 国产日韩在线不卡| 久久久噜噜噜久噜久久| 熟妇人妻久久中文字幕| 校园春色亚洲色图| 成人免费在线观看入口| 国产精品久久久久免费| 色综合av综合无码综合网站| 国产精品国产三级国产普通话对白| 久久久久久久久国产一区| 欧美v日韩v国产v| 黄色高清无遮挡| 直接在线观看的三级网址| www.视频一区| 亚洲精品免费在线视频| 黑人一级大毛片| 亚洲激情中文| 亚洲视频综合网| 在线观看一区二区三区视频| 性高爱久久久久久久久| 一区二区三区小说| 日韩精品第一页| 手机看片福利在线| 国内成+人亚洲+欧美+综合在线| 91精品国产91久久久久久不卡| 色哟哟一一国产精品| 台湾色综合娱乐中文网| 日韩视频在线你懂得| 免费无码国产v片在线观看| 麻豆视频在线观看免费| 蜜臀久久99精品久久久久久9| 欧美日韩国产成人高清视频| 日本黄色激情视频| 久久99免费视频| 在线观看欧美日本| 黄色一级视频在线播放| 中文字幕有码在线观看| 综合中文字幕亚洲| 神马影院一区二区三区| 欧美色18zzzzxxxxx| 成人综合婷婷国产精品久久蜜臀 | 蜜桃精品在线观看| 茄子视频成人在线| 91美女免费看| 国产精品v欧美精品v日本精品动漫| 精品国产一区二区三区在线观看| 国产精品高清无码在线观看| 亚洲区小说区| 亚洲欧美日韩网| 一二三不卡视频| 日韩理论电影中文字幕| 亚洲成人动漫在线播放| 国产a级片视频| 成人自拍在线| 亚洲国产精品免费| 无码中文字幕色专区| 超碰在线caoporn| 成人成人成人在线视频| 91视频网页| 超碰免费在线97| 国产成人激情av| 国产精品一区二区a| www.国产三级| 成人免费的视频| 国产一区二区自拍| 日本福利片在线| 久久久蜜臀国产一区二区| 欧美在线播放一区| 九色网友自拍视频手机在线| 国产亲近乱来精品视频| 97国产超碰| 亚洲av无码乱码国产精品| 东方aⅴ免费观看久久av| 国产日韩欧美一区二区三区四区 | 不卡的av在线播放| 久久精品日产第一区二区三区| 四虎在线视频| 国产精品99精品久久免费| 91手机在线视频| 免费观看a视频| 91视频免费观看| 日韩精品极品视频在线观看免费| 欧美高清视频| 亚洲午夜电影网| 妞干网在线免费视频| 久久99国产精品二区高清软件| 亚洲国产一区视频| av免费观看网| 国内欧美日韩| 精品精品国产高清a毛片牛牛| 欧美深性狂猛ⅹxxx深喉| 色狠狠一区二区三区| 欧美放荡的少妇| 亚洲图片综合网| 成人3d动漫在线观看| 国产一区二区黄| 欧美精品色哟哟| 日韩精品成人一区二区三区| 1卡2卡3卡精品视频| 日本在线视频1区| 亚洲色图另类专区| 欧美在线观看成人| 亚洲午夜国产成人| 日韩精品免费视频| 亚洲一级生活片| 国产精品一二| 99热在线播放| 午夜精品久久久久久久99| 久久嫩草精品久久久久| 日韩国产精品毛片| 老司机2019福利精品视频导航| 91精品在线免费观看| 天天躁日日躁aaaa视频| 国产精品激情电影| 成人a视频在线观看| 日本a一级在线免费播放| 亚洲精品老司机| 五月婷婷激情久久| 岳的好大精品一区二区三区| 欧美成人一二三| 亚洲特级黄色片| 精品亚洲成a人| 欧美精品一区二区视频| 污视频在线免费观看网站| 欧美日韩精品是欧美日韩精品| 亚洲天堂2024| 欧美激情1区2区| 国产精品亚洲自拍| 一本色道久久综合亚洲| 99精品久久只有精品| 日本三日本三级少妇三级66| 日本精品另类| 亚洲欧美日韩在线高清直播| 日韩精品久久久久久久| 国产丶欧美丶日本不卡视频| 影音先锋欧美资源| 91九色综合| 国产午夜精品美女视频明星a级| 日本亚洲色大成网站www久久| 国产又粗又猛又爽又黄91精品| 亚洲春色综合另类校园电影| 欧美日韩亚洲国产| 亚洲视频在线观看免费| 丰满人妻老熟妇伦人精品| 成人av在线网| av免费观看国产| 亚洲精品一区国产| 久久久久久久久久久网站| 亚洲精品国产片| 一区二区三区四区不卡在线| 能看毛片的网站| 欧美黄色一区二区| ts人妖另类在线| 欧美videos另类精品| 欧美成人性福生活免费看| 真实国产乱子伦对白在线| 国产精品1区2区| www.日本三级| 国产人妖ts一区二区| 9.1国产丝袜在线观看| 亚洲AV第二区国产精品| 欧美性xxxx18| 手机在线视频一区| 在线精品小视频| 超碰97人人在线| а√天堂中文资源在线bt| 亚洲剧情一区二区| 中文在线免费观看| 亚洲人成网站色在线观看| 精品国产aⅴ一区二区三区东京热| 欧美午夜不卡| 久久国产精品-国产精品| 久久野战av| 337p日本欧洲亚洲大胆精品| 日韩 欧美 综合| 久久久久99精品一区| 亚洲精品手机在线观看| 欧美精品午夜| 欧美xxxx黑人又粗又长精品| 久久久成人av毛片免费观看| 久久伊人精品天天| 蜜桃av噜噜一区二区三区麻豆| 色婷婷激情综合| 国产美女久久久久久| 成人av高清在线| 一本久道中文无码字幕av| 香蕉国产精品| 久久久一本精品99久久精品| 国产极品一区| 国内自拍欧美激情| 成黄免费在线| 欧美刺激午夜性久久久久久久| 国产精品第5页| 亚洲人成亚洲人成在线观看图片| 亚洲天堂资源在线| 久久99精品视频| 奇米精品一区二区三区| 色爱综合网欧美| 精品国产乱码久久久久软件| 韩日精品一区| 国语自产精品视频在免费| av在线资源站| 亚洲黄色在线看| 91成品人影院| 色综合久久中文字幕| 2021亚洲天堂| 国产精品网友自拍| 丰满少妇在线观看资源站| 国产一区高清在线| 天天天干夜夜夜操| 亚洲区国产区| 国产综合色一区二区三区| 一区在线影院| 91成人国产在线观看| 污污片在线免费视频| 色七七影院综合| 日韩av资源| 亚洲激情在线观看视频免费| av免费在线观看不卡| 欧美性欧美巨大黑白大战| 国产午夜小视频| 亚洲另类中文字| 999这里有精品| 久久久成人网| 欧美老熟妇喷水| 伊人久久大香线蕉av超碰演员| 99热一区二区三区| 精品香蕉视频| 欧美亚州在线观看| 美女福利一区| 国产伦精品一区二区三区照片 | 亚洲性视频h| 成年人三级视频| 我不卡手机影院| av动漫免费观看| 天天超碰亚洲| 中文字幕一区二区三区5566| 青青草原综合久久大伊人精品| 欧美精品成人一区二区在线观看 | 成人福利av| 97成人精品区在线播放| 波多野结衣乳巨码无在线观看| 欧美久久久精品| 在线网址91| 久久99热这里只有精品国产| 18加网站在线| 欧美丰满少妇xxxxx| 超碰在线免费公开| 欧美高清在线播放| 欧美黑人猛交的在线视频| 色综合久久久久久中文网| 丝袜在线视频| 国内揄拍国内精品少妇国语| 中文字幕影音在线| 欧洲美女免费图片一区| 国产一区二区三区影视| 国产一区红桃视频| 国产偷倩在线播放| 97高清免费视频| 伊人免费在线| 日韩中文字幕免费| av片哪里在线观看| 国外色69视频在线观看| xxxxx性欧美特大| 国产精品久久久久9999| 久久精品国产福利| 亚洲专区国产精品| 嫩草国产精品入口| 日韩精品一区二区三区丰满| 日本成人小视频| 色婷婷777777仙踪林| 国产日韩欧美一区二区三区| 亚洲欧美日韩不卡一区二区三区| 婷婷综合社区| 精品少妇在线视频| 视频一区在线视频| www插插插无码视频网站| 亚洲精品欧美| 99热这里只有精品在线播放| 国产精一品亚洲二区在线视频| 亚洲v在线观看| 国产亚洲美州欧州综合国| 中文字幕美女视频| 亚洲va国产天堂va久久en| 午夜精品久久久久久久蜜桃| 69av一区二区三区| 神马久久久久久久久久| 色哟哟网站入口亚洲精品| 污视频免费在线观看| 日韩av手机在线| 日本免费精品| 亚洲一区二区少妇| 麻豆精品少妇| av磁力番号网| 日日摸夜夜添夜夜添国产精品 | 色天天色综合| 欧美亚洲视频一区| 久久aⅴ国产紧身牛仔裤| 天天操精品视频| 91欧美一区二区| 国产波霸爆乳一区二区| 在线亚洲+欧美+日本专区| 免费观看国产精品| 久久精品一区中文字幕| 国产精品粉嫩| av资源站久久亚洲| 日韩在线高清| 欧美亚洲国产成人| 国产精品99久久久久久有的能看 | 国产 日韩 欧美 精品| 国产亚洲精品一区二区| heyzo在线播放| 91久久国产婷婷一区二区| 西野翔中文久久精品字幕| 国产制服91一区二区三区制服| 日韩国产在线一| 玖草视频在线观看| 亚洲一区二区精品视频| 一区二区三区午夜| 国产亚洲欧洲在线| 热三久草你在线| 国产精品yjizz| 欧美国产91| 手机免费av片| 国产精品欧美极品| 国产一级片免费在线观看| 精品调教chinesegay| 日本三级在线观看网站| 成人高清视频观看www| 精品日产免费二区日产免费二区 | 久久爱www久久做| 国产精品毛片一区二区| 精品福利樱桃av导航| 国产77777| 欧美精品www| 国产精品久久久久久久久久白浆| 国产日韩欧美大片| 国产一区二区电影| 亚洲天堂一级片| 91精品视频网| h视频在线免费观看| 成人国内精品久久久久一区| 欧美独立站高清久久| 亚洲综合欧美在线| 国产精品久久久久久福利一牛影视| 黄色录像一级片| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 91免费视频播放| 中文字幕亚洲天堂| 亚洲ww精品| aaa免费在线观看| 国产综合久久久久久鬼色| 欧美特黄一级片| 日韩免费观看高清完整版| 国产桃色电影在线播放| 国产在线一区二| 久久久xxx| 亚洲色图日韩精品| 777午夜精品免费视频| 日韩经典av| 精品网站在线看| 首页综合国产亚洲丝袜| 久久日免费视频| 制服丝袜激情欧洲亚洲| av大片在线| 国内精品二区| 久久性色av| 国产又粗又长又黄的视频| 欧美一区二区三级| aa视频在线观看| 欧美一区2区三区4区公司二百| 日本中文在线一区| jizz亚洲少妇| 亚洲国产欧美一区| 亚洲成人av观看| 大地资源网在线观看免费官网| 成人午夜视频网站| av毛片在线免费观看| 精品久久国产97色综合| 亚洲综合电影| 精品一区二区成人免费视频| 懂色av中文字幕一区二区三区| 欧美一级特黄视频| 日韩在线观看免费| 精品久久97| 91看片破解版| 天天射综合影视| 九七电影韩国女主播在线观看| 成人av免费在线看| 日韩精品成人一区二区在线| 国产亚洲精品久久777777| 一本一道久久a久久精品逆3p | 成人深夜福利| 丁香六月激情婷婷| 中文在线一区二区 | 99久久精品国产毛片| 中文字幕在线观看国产| 久久久久久久久久久人体| 97精品中文字幕| 国产精品三级在线观看无码|