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