精品一区二区三区在线成人,欧美精产国品一二三区,Ji大巴进入女人66h,亚洲春色在线视频

如何像導(dǎo)入 JS 模塊一樣導(dǎo)入 CSS?

安全
剛剛發(fā)布的 Chrome 93 版本中更新了一項令人興奮的新特性:CSS Module Script,使用它你可以像導(dǎo)入一個 JavaScript 模塊一樣加載 CSS 樣式。

剛剛發(fā)布的 Chrome 93 版本中更新了一項令人興奮的新特性: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è)計的,在 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
  1. // Construct the CSSStyleSheet 
  2. const stylesheet = new CSSStyleSheet(); 
  3.   
  4. // Add some CSS 
  5. stylesheet.replaceSync('body { background: #000 !important; }') 
  6. // OR stylesheet.replace, which returns a Promise instead 
  7.   
  8. // Tell the document to adopt your new stylesheet. 
  9. // Note that this also works with Shadow Roots. 
  10. document.adoptedStyleSheets = [...document.adoptedStyleSheets, stylesheet]; 

使用 CSS Module Script

引入 CSS Module Script 將作用于 document 和 shadow dom,如下:

  1. import sheet from './styles.css' assert { type: 'css' }; 
  2. document.adoptedStyleSheets = [sheet]; 
  3. 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)點:

  • 重復(fù)數(shù)據(jù)刪除:如果從應(yīng)用的多個位置導(dǎo)入相同的 CSS 文件,它仍然只會被提取、實例化和解析一次。
  • 一致的順序:如果導(dǎo)入一個 JavaScript 運行時,它可以依賴于已經(jīng)解析過的樣式表。
  • 安全性:模塊使用 CORS 加載,并且使用嚴(yán)格的 MIME 類型檢查。

導(dǎo)入斷言(assert)是什么?

import 語句的 assert {type: 'css'} 部分是一個 import 斷言,這是必需要聲明的的;如果沒有它,CSS 將被認(rèn)為是一個普通的 JavaScript 模塊,如果導(dǎo)入的文件具有非 JavaScript MIME 類型,則會導(dǎo)入失敗。

  1. import sheet from './styles.css'; // Failed to load module script: 
  2.                                   // Expected a JavaScript module 
  3.                                   // script but the server responded 
  4.                                   // with a MIME type of "text/css". 

樣式表的動態(tài)導(dǎo)入類似于 JavaScript 模塊的動態(tài)導(dǎo)入,你還可以用 dynamic import 導(dǎo)入 CSS 模塊:

  1. const cssModule = await import('./style.css', { 
  2.   assert: { type: 'css' } 
  3. }); 
  4. document.adoptedStyleSheets = [cssModule.default]; 

這里有個坑需要注意,被添加到 adoptedstylesheet 的并不是 cssModule本身,而是 cssModule.default。

@import 的規(guī)則尚未支持

目前,CSS@import 的規(guī)則不適用 于可構(gòu)造樣式表,包括 CSS Module Script。如果 CSS 模塊中含有@import 規(guī)則,則這些規(guī)則將被忽略。

  1. /* atImported.css */ 
  2. div { 
  3.     background-color: blue; 
  1. /* styles.css */ 
  2. @import url('./atImported.css'); /* Ignored in CSS module */ 
  3. div { 
  4.     border: 1em solid green; 
  1. <!-- index.html --> 
  2. <script type="module"> 
  3.     import styles from './styles.css' assert { type: "css" }; 
  4.     document.adoptedStyleSheets = [styles]; 
  5. </script> 
  6. <div>This div will have a green border but no background color.</div> 

目前 Firefox 和 Safari 瀏覽器尚未支持,不過未來可期~

 

責(zé)任編輯:趙寧寧 來源: code秘密花園
相關(guān)推薦

2023-11-01 08:36:07

CSSTailwind

2013-08-22 10:17:51

Google大數(shù)據(jù)業(yè)務(wù)價值

2015-03-16 12:50:44

2023-04-05 14:19:07

FlinkRedisNoSQL

2021-08-12 06:08:15

CSS 技巧組件狀態(tài)

2022-10-21 13:52:56

JS 報錯調(diào)試本地源碼

2017-05-22 10:33:14

PythonJuliaCython

2022-12-13 07:41:43

CSSCSS Houdi

2022-12-21 15:56:23

代碼文檔工具

2013-12-31 09:19:23

Python調(diào)試

2013-12-17 09:02:03

Python調(diào)試

2023-05-23 13:59:41

RustPython程序

2016-10-08 00:24:53

httptcp實時

2013-07-26 10:15:29

云計算大數(shù)據(jù)Hadoop

2020-09-30 17:12:09

人工智能技術(shù)數(shù)據(jù)

2017-11-06 14:18:03

2020-08-25 08:56:55

Pythonawk字符串

2021-06-30 08:00:31

ECMAScriptimport 模塊JavaScript

2021-05-20 08:37:32

multiprocesPython線程

2015-02-05 13:27:02

移動開發(fā)模塊SDK
點贊
收藏

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

主站蜘蛛池模板: 富裕县| 新营市| 白水县| 马山县| 喜德县| 灵石县| 黄冈市| 甘南县| 民县| 噶尔县| 通道| 崇信县| 成安县| 西平县| 滁州市| 江都市| 南靖县| 丰都县| 沾化县| 康保县| 马关县| 昂仁县| 淮阳县| 彩票| 郁南县| 于都县| 秦安县| 电白县| 昌江| 许昌县| 肥乡县| 德州市| 重庆市| 古田县| 洞口县| 焦作市| 龙井市| 磐安县| 襄城县| 宝应县| 依兰县|