理解CSS 模塊化

2021-01-08 CSDN

在瞬息萬變的前端開發世界中,很難找到一個真正有意義的概念,並且將其清晰明了的向廣大人民群眾普及。

把目光投向CSS,一個重大轉折就是CSS預處理器的出現(在工具方面來看),其中,Sass應該是最為著名的一個。此外,還有 PostCSS,它和Sass略有不同,但是殊途同歸——都是用瀏覽器不能解析的語法編寫,並且最終編譯成瀏覽器能夠理解的語法。

現在,又有一位新的成員出現了,它就是CSS模塊。本文就將介紹CSS模塊化的諸多優點,以及如何編寫模塊化的CSS。

什麼是CSS模塊

首先,讓我們從官方文檔入手:

A CSS Module is a CSS file in which all class names and animation names are scoped locally by default. CSS模塊就是所有的類名都只有局部作用域的CSS文件。

事實稍微有一些複雜。由於類名需要默認具有局部作用域,這就涉及到一些初始設置、一個編譯過程,以及其他一些難以琢磨的東西。

但是最終,我們會為CSS模塊化帶來的好處而開心:CCS模塊將作用域限制於組件中,從而避免了全局作用域的問題。我們再也不用操心為組件尋找一個好的命名了,因為編譯過程已經幫你完成了這個任務。

它是如何工作的

CSS模塊需要在構建步驟進行管道化,這也就是說,它不是自動驅動的。它可以看成是webpack 或 Browserify的一個插件。其基本工作方式是:當你在一個JavaScript模塊中導入一個CSS文件時(例如,在一個 React 組件中),CSS模塊將會定義一個對象,將文件中類的名字動態的映射為JavaScript作用域中可以使用的字符串。舉個具體的例子:

如下是一個簡單的CSS文件。其中,.base類名不需要是工程中唯一的,因為它將不會是真正被解析的類名。它可以看成是在JavaScript模塊中使用的類在樣式表中的別名。

.base { color: deeppink; max-width: 42em; margin: 0 auto; }

下面是該CSS類在JavaScript組件中的使用方式:

import styles from './styles.css'; element.innerHTML = `<div> CSS Modules are fun. </div>`;

最終,它將生成下面這個東西(當使用webpack的默認步驟時):

`<div>CSS Modules are fun.</div>` ._20WEds96_Ee1ra54-24ePy { color: deeppink; max-width: 42em; margin: 0 auto; }

當然,生成的類名可以通過配置,使得它的長度更短或者遵循一些特定的模式。當然了,這些最終都不重要(雖然短的類名意味著更短的樣式表),重點在於這些類名是動態生成的、唯一的且和正確的樣式表一一對應的。

(web前端學習交流群:328058344 禁止閒聊,非喜勿進!)

一些需要注意的地方

這就是CSS模塊工作的方式了。這時,你可能會想,「這到底是個什麼玩意兒,我甚至。。。」。OK,停下!我知道你想說什麼。現在就讓我一一解答你可能有的疑慮。

這看起來太醜了

確實如此。但是類名並不要求一定要長的好看對不對?只要可以將樣式正確的應用於元素就可以了嘛。而CSS模塊化方法完成的非常好,所以我覺得,這不是一個問題。

這非常難debug啊

由於需要有一個編譯的步驟,所以直接debug是非常困難的。其實,像Sass直接debug也是相當不容易的,所以我們才有了 sourcemaps。對於CSS模塊,我們也可以設置sourcemap。

其實,我還想說的是,雖然在模塊中,類的名字是自動生成而不可預知的,但是對於模塊來說,它還是比樣式表更容易debug的。只要你知道當前在開發者工具中查看的樣式屬於哪個模塊,在相應的樣式表中也是很容易定位。

這使得樣式不容易復用啦!

這句話既對也不對。一方面來說,確實如此。但這是因為模塊將CSS樣式和組件相綁定,從而不會發生全局樣式的衝突。這其實是一件好事,我相信你也會同意的對不對。

另一方面,要定義全局樣式也是可以的,只要使用:global()就好了。比如,作者需要保留的全局輔助樣式。

:global(.clearfix::after) { content: ''; clear: both; display: table; }

CSS模塊還可以從其他模塊中繼承樣式,這和Sass中的@extend方法其實是一樣的。它不會拷貝樣式,只是將選擇器連接到繼承的樣式中。

.base { composes: appearance from '../AnoherModule/styles.css'; }

它需要webpack,Browserify或者其他工具!

這和Sass需要將.scss文件編譯成CSS文件,PostCSS需要將樣式表處理成瀏覽器能夠識別的樣式其實是一樣的。無論如何,都需要一個構建步驟。

我們究竟為什麼要討論這個東西?

其實,我甚至不確定CSS模塊在未來到底會不會繼續存在,不過,我確定這是一種編寫樣式的正確方式。試想,在拆分成許多細小組件的龐大站點中,卻擁有一個臃腫的全局樣式表,這肯定是不合適的。

CSS統一的名空間使得它既強大又脆弱。而CSS模塊化或者未來延續這個思想的其他工具可以在支持樣式復用的同時,避免命名衝突,這是一個雙贏的選擇。

入門

如前面所說的,你需要有webpack或者Browserify來實現CSS模塊化。

Webpack

先從webpack版本的模塊化開始。在webpack.config.js中,加上如下配置,使得webpack將CSS文件作為CSS模塊來看待:

{ test: /\.css$/, loader: 'style-loader!css-loader?modules' }

這時,它將把樣式注入到頁面中的元素中。這可能不是我們想要的,使用extract text plugin for webpack,我們可以很方便的抽取出樣式表:

{ test: /\.css$/, loader: ExtractTextPlugin.extract('style-loader', 'css-loader?modules') }

對於webpack,要講的就是這麼多了。

Browserify

我只在命令行中用過Browserify,所以我猜使用起來會更複雜一些。在package.json文件中,加入 npm script :

{ "scripts": { "build": "browserify -p [ css-modulesify -o dist/main.css ] -o dist/index.js src/index.js" } }

這條命令告訴Browserify運行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選項可以在編譯完成樣式表時候,繼續對它進行處理。

總結

從今天看來,CSS模塊化系統和生態確實有些原始了,從Browserify中的配置就能看出來。不過,我確信CSS模塊化將變得更好,並且越來越多的人將意識到不管對小項目還是大項目來說,這都是一個很好的方法。

我認為CSS模塊化背後的思想是正確的。當然,我不是說這個庫就是最佳解決方案,但是,它確實包含了一些CSS應該採用的寫法:模塊化、作用域隔離、同時支持復用。

相關焦點

  • Css技巧:模塊化編碼
    當然有, 那便是模塊化編碼。Css的模塊化,我們可以理解成(抑或本身就是)OOP思想, 重用性、靈活性、可擴展性便是它終極的目標, 「類」便是它的核心, OOP的多用組合少用繼承一樣是它的基本原則。 Css模塊化是一個新穎高效的Css編碼方式, 若有接觸過YUI Css的朋友肯定對這種方式有所了解。如何Css模塊化, 我想這才是大家真正關心的。
  • 前端工程化(ES6模塊化和webpack打包css,less,scss,圖片,字體...
    模塊化規範傳統開發模式主要問題/* 1. 命名衝突 2. 文件依賴*/通過模塊化解決上述問題/* 模塊化就是把單獨的一個功能封裝在一個模塊(文件)中,模塊之間相互隔離, 但是可以通過特定的接口公開內部成員,也可以依賴別的模塊.
  • 大前端進階之Babel、模塊化、webpack
    模塊化隨著網際網路的發展,許多網站也一步步的網際網路化了,這使得項目中的js代碼也越來越多了,變得十分複雜。我們都知道Java中可以在一個類中使用import關鍵字導入其他類進行調用,這樣很好的實現了模塊化開發。那麼js是否也可以進行模塊化開發呢?
  • css寫進js太好用了,快來試試吧!
    css-in-js是什麼?當大家聽到這個詞或許能猜到是在js裡面寫編寫css樣式,可我們以前在都是html內或引用外部css文件樣式,為什麼現在可以在js裡編寫css樣式呢?html、css、js三部分獨立通俗的理解,css-in-js就是把css寫進js。
  • 推薦10 款 CSS 框架,網頁設計就是這麼簡單
    TC (」ThinkCSS」) 是一個 (X)HTML/CSS 框架 ,它的目的是減少你的css開發時間。它提供一個可靠的css基礎去創建你的項目,能夠用於網站的快速設計,通過重設和重建瀏覽器標準,可以讓每個網站防 止枯燥的跨瀏覽器兼容性測試。你可以將他理解成一套模板,裡面包含了大多數站點中所需要的那些css類。他很小,只有四個文件而已。總共不到6KB。 EZ-CSS 是一個非常輕量級的(只有1K)的CSS框架,用來簡化創建各種頁面排版和效果。
  • 深入理解CSS盒子模型
    首頁 > 教程 > 關鍵詞 > CSS最新資訊 > 正文 深入理解CSS盒子模型
  • CSS進階:提高你前端水平的4個技巧
    為了闡述什麼是一個良好的類名,請看這個簡化了的 Medium 網站的 CSS 例子。語義豐富的 CSS 代碼容易理解,更便於維護。 若果你想進一步了解語義相關的內容,看看 《怎麼富有語義的為類命名》、《CSS 命名不簡單》 和 《富有語義和容易識別(的代碼命名)》,再看 《關於 HTML 命名和前端架構》。 模塊化 在這個充滿了組件庫(以 React 為例)的時代,模塊化就是王者。組件就是由已經解構了的接口創建的可組合的模塊。
  • Vue實戰049:引入Normalize.css樣式初始化
    Normalize.css就是一個這樣的CSS樣式文件,它的作用就是讓HTML元素更好的實現跨瀏覽器一致性。Normalize.css 特點標準化的樣式,適用於大部分HTML元素;保留有用的瀏覽器默認樣式,而不是全部樣式「重置」;修復了瀏覽器BUG並保證瀏覽器樣式的一致性;優化了CSS樣式提高了易用性;獨立模塊化開發,支持樣式自定義;支持大部分主流瀏覽器,如Chrome、Firefox、Opera 、Safari
  • Css語法特點是什麼?Css和html、javascript的關係是什麼?
    CSS是英文Cascading Style Sheets首字母的簡寫,翻譯成中文是層疊樣式表,簡單理解它是html語言的一個應用,css可以修飾各種動態和靜態頁面,對頁面中的元素進行精準控制(是像素為單位的),css的誕生是為了解決html的顯示功能,它解決了html顯示雜亂和臃腫的問題,Css
  • Java9新特性系列(深入理解模塊化)
    前兩篇文章介紹了Java9新特性系列JDK與JRE以及模塊化系統: Jigsaw->Modularity,本篇我們將深入理解模塊化。模塊化如何體現?如下圖所示,Jdk8與Jdk9的目錄結構,這個在之前的jdk與jre的文章已經提及。
  • php學習之div+css標準化布局(一)
    1.div+css布局說明:在網頁開發中,需要對頁面內容進行「模塊化標準布局」,把內容放入到某個位置,讓頁面形成固定規律展示出來模塊化:在網頁中所有的內容都是以塊來展示的標準化:在開發網站時是有一定的標準的,w3c標準好處:為了把html
  • CSS 基礎與選擇器初識 | CSS
     在 index.css 和 common.css 中有如下內容,HTML 裡引入 index.css 後發現頁面字體的顏色和大小   沒發生任何變化,原因可能是?
  • scss,less,stylus這些css處理器該怎麼選擇
    css作為前端三劍客,從誕生以來很少變化,css3都已經誕生了20年,和js的框架層出不窮相比,似乎css就不需要框架,就不需要更優化的寫法。然而在追求極致的程式設計師面前,代碼的可維護性,代碼的優雅性有迫切希望改進css代碼的編寫,於是css預處理器誕生了。
  • scss,less,stylus這些css處理器該怎麼選擇
    css作為前端三劍客,從誕生以來很少變化,css3都已經誕生了20年,和js的框架層出不窮相比,似乎css就不需要框架,就不需要更優化的寫法。然而在追求極致的程式設計師面前,代碼的可維護性,代碼的優雅性有迫切希望改進css代碼的編寫,於是css預處理器誕生了。
  • 怎麼理解html和css、javascript的關係?
    html英文全稱是Hyper Text Markup Language超文本標記語言,html是一種標記語言,這個語言不能理解成通常所說的程式語言。html語言可以表達文字,圖形、動畫、聲音、表格、連結等信息,html語言簡單、易學容易上手學習難度並不高,每個html文檔簡單來說由頭部(head)和主體(body)兩部分組成。
  • 程式設計師設計師——Github這一組700+純CSS、SVG開源圖標收藏了
    介紹css.gg項目是的一個開源圖標項目,CSS、SVG和Figma用戶界面,可以以css、svg、tsx、fig、xd、json、xml的形式使用,而且圖標質量相當之高,值得推薦使用!Githubhttps://github.com/astrit/css.gg
  • 達觀數據基於RequireJS的前端模塊化設計
    針對這些現有問題,達觀科技採用了requirejs框架,用模塊化的思想去解決這些問題。(達觀數據 施列宇)一、什麼是模塊化模塊化是一種將複雜系統拆分成一個個小的可管理的模塊的方式。它可以把系統拆分為職責更單一,更獨立的模塊,也就是我們軟體設計中常常提到的高內聚低耦合的模塊。一般來說,前端模塊化包含javascript,css以及template三個部分。
  • HTML+CSS:認識css的概念與語法,了解css的優勢
    之前的文章給大家介紹了下網頁中常用的html的基本知識,從這篇文章開始我們開始介紹css的內容。可以這麼說學完了html你可以做出網頁的框架,學好了css之後呢,你就可以給做好的框架進行美化填色,做出各種各樣的網頁。本篇文章先帶大家認識一下css的概念與語法,了解一下css的優勢之處。
  • HTML+CSS:css清除浮動的幾種方式,哪種最合適?
    上篇文章我們說了元素的浮動,本篇文章主要介紹下css浮動帶來的影響,以及如何清除浮動。細心的人可能發現了,在我們上篇文章寫的導航條中存在一個問題,那就是使用了float之後,父級盒子的高度變為0了。(2)在標籤結尾處加空div標籤 clear:both原理:添加一個空div,利用css提高的clear:both清除浮動,讓父級div能自動獲取到高度。優點:簡單、代碼少、瀏覽器支持好、不容易出現怪問題缺點:不少初學者不理解原理;如果頁面浮動布局多,就要增加很多空div,不利於頁面的優化。
  • pure.css——輕量級、響應式純css模塊,適用於任何Web項目
    pure只有短短數千行代碼,但是可控拓展,非常實用,對於新手來說,pure是css框架入門的一個比較好的選擇。在後期做項目時也可能用到類似於boostrap這樣的大型框架。所以前期對於輕量級框架源碼的理解是很有幫助的。