摘要:能最大化地結合現有生態預處理器后處理器等和模塊化能力,幾乎零學習成本。編碼相關的所有樣式上例中打印的結果是注意到是按照自動生成的名。實踐手動引用渲染結果使用可以實現使用屬性自動加載模塊。
文章同步于Github Pines-Cheng/blog
隨著前端這幾年的風生水起,CSS作為前端的三劍客之一,各種技術方案也是層出不窮。從CSS prepocessor(SASS、LESS、Stylus)到后來的后起之秀 PostCSS,再到 CSS Modules、Styled-Component 等。有人維護了一份完整的 CSS in JS 技術方案的對比,里面已經有將近50種技術方案。CSS Modules就是其中一種。
CSS Modules 介紹要弄懂CSS Modules是什么,可以先看官方介紹:GitHub – css-modules/css-modules: Documentation about css-modules。
通過上面介紹可以看出,CSS Modules既不是官方標準,也不是瀏覽器的特性,而是在構建步驟(例如使用Webpack或Browserify)中對CSS類名選擇器限定作用域的一種方式(通過hash實現類似于命名空間的方法)。例如我們在buttons.js里引入buttons.css文件,并使用.btn的樣式,在其他組件里是不會被.btn影響的,除非它也引入了buttons.css.
CSS模塊化JS已經全面實現了模塊化,但是css還處于探索階段。為什么我們需要css模塊化?主要由一下幾個原因。
CSS全局作用域問題CSS的規則都是全局的,任何一個組件的樣式規則,都對整個頁面有效。現在的前端工程大多是基于組件開發,隨著工程的頁面數量好復雜度的提升,相信寫css的人都會遇到樣式沖突(污染)的問題。一般我們會采用一下幾種方法:
class命名寫長一點吧,降低沖突的幾率
加個父元素的選擇器,限制范圍
重新命名個class吧,比較保險
可是以上方案只是降低了全局沖突的概率,并不能徹底解決全局沖突的問題。并且,實現方式也不夠優雅,還增加了代碼的復雜和冗余。
我們的追求面向組件開發 : 處理 UI 復雜性的最佳實踐就是將 UI 分割成一個個的小組件,React 就鼓勵高度組件化和分割。我們希望有一個 CSS 架構去匹配。
沙箱化(Sandboxed) : 如果一個組件的樣式會對其他組件產生不必要以及意想不到的影響,那么將 UI 分割成組件并沒有什么用。就這方面而言,CSS的全局作用域會給你造成負擔。
方便 :不會增加開發的負擔和代碼的冗余。
方案CSS 模塊化的解決方案有很多,但主要有三類。
CSS 命名約定規范化CSS的模塊化解決方案(比如BEM BEM — Block Element Modifier ,OOCSS,AMCSS,SMACSS,SUITCSS)
但存在以下問題:
JS CSS之間依然沒有打通變量和選擇器等
復雜的命名
CSS in JS徹底拋棄 CSS,用 JavaScript 寫 CSS 規則,并內聯樣式。styled-components 就是其中代表。styled-components可以讓CSS真正意義地寫到JS里面,同時讓標簽更具有語意化,這跟HTML5新標簽思想相同;該框架讓樣式也具備組件化思想,讓前端完全面向組件化編程,就像java的包裝類型。
但存在以下問題:
樣式代碼也會出現大量重復。
不能利用成熟的 CSS 預處理器(或后處理器)
使用 JS 來管理樣式模塊使用JS編譯原生的CSS文件,使其具備模塊化的能力,代表是 CSS Modules。
CSS Module還是JS和CSS分離的寫法,不會改變大家的書寫習慣,CSS Module只需修改構建代碼和使用模塊依賴引入className的方式即可使用,且支持less和sass的語法,
使用CSS Modules可以讓組件className控制權轉交給JS,我們不會去關心命名沖突污染等問題,同時可以靈活控制生成的命名,樣式代碼不用修改即可讓使用CSS語法的舊項目零成本接入。
CSS Modules 能最大化地結合現有 CSS 生態(預處理器/后處理器等)和 JS 模塊化能力,幾乎零學習成本。只要你使用 Webpack,可以在任何項目中使用。是目前最好的 CSS 模塊化解決方案。
使用 配置CSS Modules配置非常簡單,如果你使用webpack,只需要在配置文件中改動一行即可。
// webpack.config.js css?modules&localIdentName=[name]__[local]-[hash:base64:5]
加上 modules 即為啟用,localIdentName 是設置生成樣式的命名規則。
編碼css
/* components/Button.css */ .normal { /* normal 相關的所有樣式 */ }
js
// components/Button.js import styles from "./Button.css"; console.log(styles); buttonElem.outerHTML = ``
上例中 console 打印styles的結果是:
Object { normal: "button--normal-abc53", disabled: "button--disabled-def886", }
注意到 button--normal-abc53 是 CSS Modules 按照 localIdentName 自動生成的 class 名。其中的 abc53 是按照給定算法生成的序列碼。經過這樣混淆處理后,class 名基本就是唯一的,大大降低了項目中樣式覆蓋的幾率。同時在生產環境下修改規則,生成更短的 class 名,可以提高 CSS 的壓縮率。
CSS Modules 對 CSS 中的 class 名都做了處理,使用對象來保存原 class 和混淆后 class 的對應關系。
React實踐 手動引用import React from "react"; import styles from "./table.css"; export default class Table extends React.Component { render () { return; } }
渲染結果:
使用babel-plugin-react-css-modules
babel-plugin-react-css-modules 可以實現使用styleName屬性自動加載CSS模塊。只需要把className換成styleName即可獲得CSS局部作用域的能力,babel插件來自動進行語法樹解析并最終生成className。改動成本極小,不會增加JSX的復雜度,也不會給項目帶來額外的負擔。
import React from "react"; import styles from "./table.css"; class Table extends React.Component { render () { return; } } export default Table;
CSS Modules 很好的解決了 CSS 目前面臨的模塊化難題。支持與 CSS處理器搭配使用,能充分利用現有技術積累。如果你的產品中正好遇到類似問題,非常值得一試。
參考CSS Modules 入門及 React 中實踐
CSS Modules 用法教程
Styled Components:讓樣式也成為組件
精讀《請停止 css-in-js 的行為》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/112299.html
摘要:上例中打印的結果是對中的名都做了處理,使用對象來保存原和混淆后的對應關系。結合實踐在處直接使用中名即可。如因為只會轉變類選擇器,所以這里的屬性選擇器不需要添加。 showImg(http://gtms01.alicdn.com/tps/i1/TB15w0HLpXXXXbdaXXXjhvsIVXX-600-364.png); CSS 是前端領域中進化最慢的一塊。由于 ES2015/201...
摘要:一切樣式都是全局,產生的各種命名的痛苦,等命名規則能解決一部分問題,但當你使用三方插件時卻無法避免命名沖突。這一解決法的優雅在于,全局的可以正常使用,只有帶后綴的才會被化使用的模板字符串,在文件里寫純粹的。 前言團隊在使用react時,不斷探索,使用了很多不同的css實現方式,此篇blog總結了,react項目中常見的幾種css解決方案:inline-style/radium/styl...
摘要:按需引入在入口文件中引入全局的如果僅僅是這樣的話,我們加載組件是全部加載的,這時候我們要在的中配置這樣之后就可以按照的官網來使用里的組件了。啦,這樣一個簡單的開發環境就搭建好了。 github 1、創建基本目錄結構 npm init 創建src文件夾,再其中新建index.html 安裝webpack依賴:npm install webpack webpack-cli webpack...
摘要:這里要介紹的是工作流中的一種很普遍的代碼加工流程正常的業務邏輯開發流程需要經過預處理器如或,然后再經過后處理器如進行深加工。 還未看的,可以點擊查看上兩篇文章喲:Webpack 最佳實踐總結(一)、Webpack 最佳實踐總結(二) 好了,這篇是第三篇,也是完結篇,我感覺這一篇是最亂的一篇,湊合著看吧,不會讓你失望的 整合 CSS 加工流 有時候,前端項目中除了 JavaScript ...
摘要:這里要介紹的是工作流中的一種很普遍的代碼加工流程正常的業務邏輯開發流程需要經過預處理器如或,然后再經過后處理器如進行深加工。 還未看的,可以點擊查看上兩篇文章喲:Webpack 最佳實踐總結(一)、Webpack 最佳實踐總結(二) 好了,這篇是第三篇,也是完結篇,我感覺這一篇是最亂的一篇,湊合著看吧,不會讓你失望的 整合 CSS 加工流 有時候,前端項目中除了 JavaScript ...
閱讀 3209·2021-11-12 10:36
閱讀 1258·2019-08-30 15:56
閱讀 2442·2019-08-30 11:26
閱讀 551·2019-08-29 13:00
閱讀 3608·2019-08-28 18:08
閱讀 2749·2019-08-26 17:18
閱讀 1892·2019-08-26 13:26
閱讀 2431·2019-08-26 11:39