什么是CSS Modules?
官方的介紹是:
所有的 class 的名稱和動畫的名稱默認屬於本地作用域的 CSS 文件。所以 CSS Modules 不是一個官方的規范,也不是瀏覽器的一種機制,它是一種構建步驟中的一個進程。(構建通常需要 webpack 或者 browserify 的幫助)。通過構建工具的幫助,可以將 class 的名字或者選擇器的名字作用域化。(類似命名空間化)。
通過構建工具來使指定class達到scope的過程。
css modules優勢
-
解決全局命名沖突問題 css modules只關心組件本身 命名唯一
-
模塊化 可以使用composes來引入自身模塊中的樣式以及另一個模塊的樣式
-
解決嵌套層次過深的問題 使用扁平化的類名
為什么引入CSS Modules?
1)、全局樣式沖突
webpack進行打包時,將所有js文件導入到入口App.js文件中,樣式也會統一加載到入口中,根據css的layout規則,后面的樣式會覆蓋掉前面的樣式聲明,造成全局樣式的覆蓋問題。
2)、嵌套層次過深的選擇器
為了解決全局樣式的沖突問題,不得不引入一些特地命名namespace來區分,但是往往有些namespace命名得不夠清晰,就會造成要想下一個樣式不會覆蓋,就要再加一個新的命名空間來進行區分,最終可能一個元素的顯示樣式嵌套特別深。
嵌套特別深會造成的問題:
- 根據CSS選擇器的解析規則可以知道,層級越深,比較的次數也就越多,影響整個頁面的渲染
- 增加了不必要的字節開銷
- 語義混亂 可擴展性不好,約束越多,擴展性越差
3)、無法共享變量
復雜組件要使用 JS 和 CSS 來共同處理樣式。