一文教你如何像導(dǎo)入JS模塊一樣導(dǎo)入CSS
前言
剛剛發(fā)布的 Chrome 93 版本中更新了一項(xiàng)令人興奮的新特性:CSS Module Script,使用它你可以像導(dǎo)入一個 JavaScript 模塊一樣加載 CSS 樣式。
然后,你可以將 CSS 樣式與可構(gòu)造樣式表(Constructable Stylesheet) 相同的方式作用于 document 和 shadow dom,這比其他加載 CSS 的方式更方便、更高效。
什么是可構(gòu)造樣式表?
在了解 CSS Module Script 之前,我們先來了解下啥是可構(gòu)造樣式表(Constructable Stylesheet)。和表面意思一樣,它是為了 CssStyleSheet 可直接構(gòu)造而設(shè)計(jì)的,在 document 和 shadow dom 下都可以使用。
使用可構(gòu)造樣式表:
- 通過 new CSSStyleSheet() 構(gòu)造一個樣式表
- 改變可構(gòu)造樣式表
- 通過 adoptedStyleSheets 使用可構(gòu)造樣式表
改變可構(gòu)造樣式表有如下API:
- insertRule(rule,index) 往 cssRules 屬性里插入 rule
- deleteRule(rule,index) 從 cssRules 屬性里刪除 rule
- replace(text) 異步替換 cssRules
- replaceSync(text) 同步的 replace
// Construct the CSSStyleSheet
const stylesheet = new CSSStyleSheet();
// Add some CSS
stylesheet.replaceSync('body { background: #000 !important; }')
// OR stylesheet.replace, which returns a Promise instead
// Tell the document to adopt your new stylesheet.
// Note that this also works with Shadow Roots.
document.adoptedStyleSheets = [...document.adoptedStyleSheets, stylesheet];
使用 CSS Module Script
引入 CSS Module Script 將作用于 document 和 shadow dom,如下:
import sheet from './styles.css' assert { type: 'css' };
document.adoptedStyleSheets = [sheet];
shadowRoot.adoptedStyleSheets = [sheet];
CSS Module Script 默認(rèn)導(dǎo)出的是一個 可構(gòu)造樣式表 ,與任何其他 可構(gòu)造樣式表 一樣,它使用 adoptedstylesheet 作用于 document 和 shadow dom。

和其他使用 JavaScript 引入 CSS 的方式不同,你無需創(chuàng)建一個 <script> 標(biāo)簽,也不需要把 CSS 插入混淆后的 JavaScript 中。
CSS Module 也有像 JavaScript Module 一樣的優(yōu)點(diǎn):
- 重復(fù)數(shù)據(jù)刪除:如果從應(yīng)用的多個位置導(dǎo)入相同的 CSS 文件,它仍然只會被提取、實(shí)例化和解析一次。
- 一致的順序:如果導(dǎo)入一個 JavaScript 運(yùn)行時,它可以依賴于已經(jīng)解析過的樣式表。
- 安全性:模塊使用 CORS 加載,并且使用嚴(yán)格的 MIME 類型檢查。
導(dǎo)入斷言(assert)是什么?
import 語句的 assert {type: 'css'} 部分是一個 import 斷言,這是必需要聲明的的;如果沒有它,CSS 將被認(rèn)為是一個普通的 JavaScript 模塊,如果導(dǎo)入的文件具有非 JavaScript MIME 類型,則會導(dǎo)入失敗。
import sheet from './styles.css'; // Failed to load module script:
// Expected a JavaScript module
// script but the server responded
// with a MIME type of "text/css".
樣式表的動態(tài)導(dǎo)入
類似于 JavaScript 模塊的動態(tài)導(dǎo)入,你還可以用 dynamic import 導(dǎo)入 CSS 模塊:
const cssModule = await import('./style.css', {
assert: { type: 'css' }
});
document.adoptedStyleSheets = [cssModule.default];
這里有個坑需要注意,被添加到 adoptedstylesheet 的并不是 cssModule本身,而是 cssModule.default。
@import 的規(guī)則尚未支持
目前,CSS@import 的規(guī)則不適用 于可構(gòu)造樣式表,包括 CSS Module Script。如果 CSS 模塊中含有@import 規(guī)則,則這些規(guī)則將被忽略。
/* atImported.css */
div {
background-color: blue;
}
/* styles.css */
@import url('./atImported.css'); /* Ignored in CSS module */
div {
border: 1em solid green;
}
<!-- index.html -->
<script type="module">
import styles from './styles.css' assert { type: "css" };
document.adoptedStyleSheets = [styles];
</script>
<div>This div will have a green border but no background color.</div>
目前 Firefox 和 Safari 瀏覽器尚未支持,不過未來可期~
總結(jié)
到此這篇關(guān)于如何像導(dǎo)入JS模塊一樣導(dǎo)入CSS的文章就介紹到這了,更多相關(guān)像導(dǎo)入JS模塊導(dǎo)入CSS內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實(shí)現(xiàn)動態(tài)網(wǎng)頁時鐘
這篇文章主要介紹了JavaScript實(shí)現(xiàn)動態(tài)網(wǎng)頁時鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
html2canvas+jspdf實(shí)現(xiàn)下載pdf文件并添加水印
這篇文章主要為大家詳細(xì)介紹了如何使用html2canvas + jspdf進(jìn)行下載pdf文件添加水印,以及echarts圖片防止截?cái)嗵幚?有需要的小伙伴可以了解下2024-10-10
微信小程序 網(wǎng)絡(luò)通信實(shí)現(xiàn)詳解
這篇文章主要介紹了微信小程序 網(wǎng)絡(luò)通信實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
JS動態(tài)獲取當(dāng)前時間,并寫到特定的區(qū)域
JS動態(tài)獲取當(dāng)前時間,并寫到特定的區(qū)域,需要的朋友可以參考一下2013-05-05
xmlplus組件設(shè)計(jì)系列之圖標(biāo)(ICON)(1)
這篇文章主要為大家詳細(xì)介紹了xmlplus組件設(shè)計(jì)系列之圖標(biāo)ICON的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
前端如何判斷多個請求完畢的實(shí)戰(zhàn)及常見問題
在前端開發(fā)中,判斷多個請求完畢是一個常見需求,這篇文章主要介紹了前端如何判斷多個請求完畢實(shí)戰(zhàn)及常見問題的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
javascript 實(shí)現(xiàn)的類似hao123的多郵箱登錄效果
javascript 實(shí)現(xiàn)的類似hao123的多郵箱登錄效果...2007-08-08
符合W3C網(wǎng)頁標(biāo)準(zhǔn)的iframe標(biāo)簽的使用方法
符合W3C網(wǎng)頁標(biāo)準(zhǔn)的iframe標(biāo)簽的使用方法...2007-07-07
JS使用eval()動態(tài)創(chuàng)建變量的方法
這篇文章主要介紹了JS使用eval()動態(tài)創(chuàng)建變量的方法,詳細(xì)分析了eval函數(shù)的功能及使用eval函數(shù)實(shí)現(xiàn)動態(tài)創(chuàng)建變量的步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-06-06

