摘要:但是最終,我們會(huì)為模塊化帶來的好處而開心模塊將作用域限制于組件中,從而避免了全局作用域的問題。但這是因?yàn)槟K將樣式和組件相綁定,從而不會(huì)發(fā)生全局樣式的沖突。先從版本的模塊化開始。我認(rèn)為模塊化背后的思想是正確的。
原文鏈接: https://www.sitepoint.com/und...
在瞬息萬變的前端開發(fā)世界中,很難找到一個(gè)真正有意義的概念,并且將其清晰明了的向廣大人民群眾普及。
把目光投向CSS,一個(gè)重大轉(zhuǎn)折就是CSS預(yù)處理器的出現(xiàn)(在工具方面來看),其中, Sass應(yīng)該是最為著名的一個(gè)。此外,還有 PostCSS,它和Sass略有不同,但是殊途同歸——都是用瀏覽器不能解析的語法編寫,并且最終編譯成瀏覽器能夠理解的語法。
現(xiàn)在,又有一位新的成員出現(xiàn)了,它就是CSS模塊。本文就將介紹CSS模塊化的諸多優(yōu)點(diǎn),以及如何編寫模塊化的CSS。
什么是CSS模塊
首先,讓我們從官方文檔入手:
A CSS Module is a CSS file in which all class names and animation names are scoped locally by default. CSS模塊就是所有的類名都只有局部作用域的CSS文件。
事實(shí)稍微有一些復(fù)雜。由于類名需要默認(rèn)具有局部作用域,這就涉及到一些初始設(shè)置、一個(gè)編譯過程,以及其他一些難以琢磨的東西。
但是最終,我們會(huì)為CSS模塊化帶來的好處而開心:CCS模塊將作用域限制于組件中,從而避免了全局作用域的問題。我們?cè)僖膊挥貌傩臑榻M件尋找一個(gè)好的命名了,因?yàn)榫幾g過程已經(jīng)幫你完成了這個(gè)任務(wù)。
它是如何工作的
CSS模塊需要在構(gòu)建步驟進(jìn)行管道化,這也就是說,它不是自動(dòng)驅(qū)動(dòng)的。它可以看成是webpack 或 Browserify的一個(gè)插件。其基本工作方式是:當(dāng)你在一個(gè)JavaScript模塊中導(dǎo)入一個(gè)CSS文件時(shí)(例如,在一個(gè) React 組件中),CSS模塊將會(huì)定義一個(gè)對(duì)象,將文件中類的名字動(dòng)態(tài)的映射為JavaScript作用域中可以使用的字符串。舉個(gè)具體的例子:
如下是一個(gè)簡單的CSS文件。其中,.base類名不需要是工程中唯一的,因?yàn)樗鼘⒉粫?huì)是真正被解析的類名。它可以看成是在JavaScript模塊中使用的類在樣式表中的別名。
.base { color: deeppink; max-width: 42em; margin: 0 auto; }
下面是該CSS類在JavaScript組件中的使用方式:
import styles from "./styles.css"; element.innerHTML = `CSS Modules are fun.`;
最終,它將生成下面這個(gè)東西(當(dāng)使用webpack的默認(rèn)步驟時(shí)):
`CSS Modules are fun.` ._20WEds96_Ee1ra54-24ePy { color: deeppink; max-width: 42em; margin: 0 auto; }
當(dāng)然,生成的類名可以通過配置,使得它的長度更短或者遵循一些特定的模式。當(dāng)然了,這些最終都不重要(雖然短的類名意味著更短的樣式表),重點(diǎn)在于這些類名是動(dòng)態(tài)生成的、唯一的且和正確的樣式表一一對(duì)應(yīng)的。
一些需要注意的地方
這就是CSS模塊工作的方式了。這時(shí),你可能會(huì)想,“這到底是個(gè)什么玩意兒,我甚至。。。”。OK,停下!我知道你想說什么。現(xiàn)在就讓我一一解答你可能有的疑慮。
這看起來太丑了
確實(shí)如此。但是類名并不要求一定要長的好看對(duì)不對(duì)?只要可以將樣式正確的應(yīng)用于元素就可以了嘛。而CSS模塊化方法完成的非常好,所以我覺得,這不是一個(gè)問題。
這非常難debug啊
由于需要有一個(gè)編譯的步驟,所以直接debug是非常困難的。其實(shí),像Sass直接debug也是相當(dāng)不容易的,所以我們才有了 sourcemaps。對(duì)于CSS模塊,我們也可以設(shè)置sourcemap。
其實(shí),我還想說的是,雖然在模塊中,類的名字是自動(dòng)生成而不可預(yù)知的,但是對(duì)于模塊來說,它還是比樣式表更容易debug的。只要你知道當(dāng)前在開發(fā)者工具中查看的樣式屬于哪個(gè)模塊,在相應(yīng)的樣式表中也是很容易定位。
這使得樣式不容易復(fù)用啦!
這句話既對(duì)也不對(duì)。一方面來說,確實(shí)如此。但這是因?yàn)槟K將CSS樣式和組件相綁定,從而不會(huì)發(fā)生全局樣式的沖突。這其實(shí)是一件好事,我相信你也會(huì)同意的對(duì)不對(duì)。
另一方面,要定義全局樣式也是可以的,只要使用:global()就好了。比如,作者需要保留的全局輔助樣式。
:global(.clearfix::after) { content: ""; clear: both; display: table; }
CSS模塊還可以從其他模塊中繼承樣式,這和Sass中的@extend方法其實(shí)是一樣的。它不會(huì)拷貝樣式,只是將選擇器連接到繼承的樣式中。
.base { composes: appearance from "../AnoherModule/styles.css"; }
它需要webpack,Browserify或者其他工具!
這和Sass需要將.scss文件編譯成CSS文件,PostCSS需要將樣式表處理成瀏覽器能夠識(shí)別的樣式其實(shí)是一樣的。無論如何,都需要一個(gè)構(gòu)建步驟。
我們究竟為什么要討論這個(gè)東西?
其實(shí),我甚至不確定CSS模塊在未來到底會(huì)不會(huì)繼續(xù)存在,不過,我確定這是一種編寫樣式的正確方式。試想,在拆分成許多細(xì)小組件的龐大站點(diǎn)中,卻擁有一個(gè)臃腫的全局樣式表,這肯定是不合適的。
CSS統(tǒng)一的名空間使得它既強(qiáng)大又脆弱。而CSS模塊化或者未來延續(xù)這個(gè)思想的其他工具可以在支持樣式復(fù)用的同時(shí),避免命名沖突,這是一個(gè)雙贏的選擇。
入門
如前面所說的,你需要有webpack或者Browserify來實(shí)現(xiàn)CSS模塊化。
Webpack
先從webpack版本的模塊化開始。在webpack.config.js中,加上如下配置,使得webpack將CSS文件作為CSS模塊來看待:
{ test: /.css$/, loader: "style-loader!css-loader?modules" }
這時(shí),它將把樣式注入到頁面中的``元素中。這可能不是我們想要的,使用extract text plugin for webpack,我們可以很方便的抽取出樣式表:
{ test: /.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader?modules") }
對(duì)于webpack,要講的就是這么多了。
Browserify
我只在命令行中用過Browserify,所以我猜使用起來會(huì)更復(fù)雜一些。在package.json文件中,加入 npm script :
{ "scripts": { "build": "browserify -p [ css-modulesify -o dist/main.css ] -o dist/index.js src/index.js" } }
這條命令告訴Browserify運(yùn)行src/index.js,返回dist/index.js,并且使用 css-modulesify將樣式表編譯至dist/main.css。如果你想再加上Autoprefixer,那么命令可以寫成這樣:
{ "scripts": { "build": "browserify -p [ css-modulesify --after autoprefixer -o dist/main.css ] -o dist/index.js src/index.js" } }
如你所見,使用--after選項(xiàng)可以在編譯完成樣式表時(shí)候,繼續(xù)對(duì)它進(jìn)行處理。
總結(jié)
從今天看來,CSS模塊化系統(tǒng)和生態(tài)確實(shí)有些原始了,從Browserify中的配置就能看出來。不過,我確信CSS模塊化將變得更好,并且越來越多的人將意識(shí)到不管對(duì)小項(xiàng)目還是大項(xiàng)目來說,這都是一個(gè)很好的方法。
我認(rèn)為CSS模塊化背后的思想是正確的。當(dāng)然,我不是說這個(gè)庫就是最佳解決方案,但是,它確實(shí)包含了一些CSS應(yīng)該采用的寫法:模塊化、作用域隔離、同時(shí)支持復(fù)用。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/111634.html
摘要:什么是可以引用官網(wǎng)的一幅圖解釋,我們可以看到,可以分析各個(gè)模塊的依賴關(guān)系,最終打包成我們常見的靜態(tài)文件,。我們暫時(shí)把通過傳文件路徑能返回文件信息的這個(gè)函數(shù)叫。 什么是webpack 可以引用官網(wǎng)的一幅圖解釋,我們可以看到webpack,可以分析各個(gè)模塊的依賴關(guān)系,最終打包成我們常見的靜態(tài)文件,.js 、 .css 、 .jpg 、.png。今天我們先不弄那么復(fù)雜,我們就介紹webpac...
摘要:但高度封裝的帶來方便的同時(shí),很多人卻很少去關(guān)注輪子的內(nèi)部結(jié)構(gòu),以至于當(dāng)使用需要手動(dòng)配置一些東西如編譯實(shí)現(xiàn)代碼壓縮,移動(dòng)端適配等配置的時(shí)候往往無從下手。廢話不多說,下面我們來看看如何基于模仿實(shí)現(xiàn)項(xiàng)目工程化。 從零搭建vue-cli 原創(chuàng)不易,如需轉(zhuǎn)載請(qǐng)聯(lián)系作者并注明出處 vue-cli的出現(xiàn)為vue工程化前端開發(fā)工作流提供了開箱即用的構(gòu)建配置,減輕了煩人的webpack配置流程。但高度封...
稍微整理了一下自己平時(shí)看到的前端學(xué)習(xí)資源,分享給大家。 html MDN:Mozilla開發(fā)者網(wǎng)絡(luò) SEO:前端開發(fā)中的SEO css 張鑫旭:張鑫旭的博客 css精靈圖:css精靈圖實(shí)踐 柵格系統(tǒng):詳解CSS中的柵格系統(tǒng) 媒體查詢:css媒體查詢用法 rem布局:手機(jī)端頁面自適應(yīng)布局 移動(dòng)前端開發(fā)之viewport的深入理解:深入理解viewport 淘寶前端布局:手機(jī)淘寶移動(dòng)端布局 fl...
摘要:兩個(gè)獨(dú)立的層即使這種技術(shù)風(fēng)靡全球之后,前端工程師的主要工作也都是局限于瀏覽器窗口之內(nèi)的。這是目前最主流的一種前后端分工方式帶來的改變一發(fā)布,立刻在前端工程師中引起了軒然大波,前端工程師們幾乎立刻對(duì)這一項(xiàng)技術(shù)表露出了相當(dāng)大的熱情和期待。 轉(zhuǎn)載自:http://www.w3ctech.com/topic/37 原 文: https://www.nczonline.net/blog/201...
摘要:官方的文檔模塊受到影響的選項(xiàng)。官方文檔通過注入標(biāo)簽將添加到。官方文檔這兩者一般都是配合在一起用的。代表圖片打包限制,這個(gè)限制并不是說超過了就不能打包,而是指當(dāng)圖片大小小于限制時(shí)會(huì)自動(dòng)轉(zhuǎn)成碼引用。不過它的放后面。 第一篇講了Webpack的安裝,以及配置文件的 entry,devtool,output,resolve。這篇接著說配置文件的 module。想看看第一篇的朋友可以點(diǎn) 這里。 ...
閱讀 3717·2021-10-11 10:59
閱讀 1301·2019-08-30 15:44
閱讀 3479·2019-08-29 16:39
閱讀 2888·2019-08-29 16:29
閱讀 1800·2019-08-29 15:24
閱讀 808·2019-08-29 15:05
閱讀 1264·2019-08-29 12:34
閱讀 2302·2019-08-29 12:19