上半年在團隊作自動化之類的工做,也學習了NodeJS,確實,NodeJS很適合作一些小工具神馬的,今天我給你們介紹的就是我本身基於NodeJS寫的CSS模塊化打包工具:CSS Combo,項目地址:https://github.com/daxingplay/css-combophp
提及模塊化,前端通常談JS模塊化的居多,畢竟JS是編程語言,好比業內的seajs、KISSY loader等,都有很成熟的模塊化規則和方案了,前端工程師能夠採用模塊化的方法去編寫頁面,打包,上線,可是CSS界卻沒有。css
後來,CSS界出現了SASS、LESS之類的語言,這些語言的出現能夠說是很是應景的,有一點很重要,拿LESS舉例,less支持了模塊化,你能夠@import ‘xxx.less’的形式導入其餘less文件(模塊),方便模塊化。我也正是從這點獲得了靈感,想出瞭如何去作css模塊化。html
其實,CSS規範裏面就已經提到相關內容了,就是@import語法。這個語法是被當前主流瀏覽器(固然包括ie6)原生支持的。具體怎麼用我想我不用在這裏浪費大量篇幅給你們介紹語法,你們能夠看下mozilla裏面對@import語法的解釋(連接),爲啥你們不多用呢,大概很大一部分緣由是由於steve的這篇博文。確實,若是在生產環境單獨去用@import,會有較爲嚴重的性能,並且不一樣的瀏覽器以及不一樣的用法下也有不一樣的表現,比較讓人鬱悶。可是,這並不妨礙@import成爲CSS模塊化的利器。前端
想必@import誕生就是爲了解決css模塊化的問題吧。咱們先來舉一個例子看看CSS模塊化的優點:git
假如你要開發某大型網站首頁,那html的head裏面應該是這樣引用樣式的:github
<link href="/path/to/style.css" rel="stylesheet" type="text/css">
爲了頁面上比較好的性能,減小建立http請求的消耗,咱們通常會選擇儘可能減小link的css文件數量,假如本例中,頁面上全部的樣式都寫在了style.css裏面。可想而知對於一個大型網站來說,這個文件會有多長多長多長長長長。。。。若是出現bug或者想改個東西,確定找半天;並且如今界內對於CSS開發並無很成熟的最佳實踐或者約定可循,不少時候,前端爲了加快進度,可能會把某一個功能的代碼放在css不一樣的地方,若是想下線某個功能,確定不敢亂刪。web
這時候,CSS模塊化的優點就體現出來了!npm
頁面不改,咱們仍是隻引用那一個樣式,style.css,可是文件內容改爲下面的:編程
/** * xxx頁面入口樣式文件style.css */ @import './utils/base.css'; /*頁面基礎框架(骨架)*/ @import './mods/layout.css'; @import './mods/header.css'; @import './mods/nav.css'; /*首頁焦點圖*/ @import './mods/flash-pic.css'; ………這裏省略諸多模塊……… @import './mods/footer.css';
這裏,咱們把style.css中混亂的樣式劃分紅了一個一個的子文件,做爲模塊。能夠看到,做爲示例,我把頁面的一些reset樣式以及一些站點公用樣式放在了util目錄下的base.css中,把頁頭拆分紅header.css,把首頁焦點圖的樣式單獨拆分紅falsh-pic.css,把頁面的基礎佈局都放在了layout.css這個文件中。而後相應的代碼就在對應的模塊中寫,是否是看起來簡潔、好維護不少?windows
不光是簡潔,使用@import形式的模塊化還有下列好處:
好,說完CSS模塊化,以及如何利用@import形式來組織本身的模塊,你們是否是感受這種形式讓你眼前一亮呢?慢着,steve大牛不是說這種@import方式有性能問題麼?
是的,若是這樣開發完直接上線的話,頁面會有一些問題,我就不拿steve的博文再說一遍了,感興趣的同窗能夠本身去看看大牛的文章。我就挑一些比較明顯的問題說一下:
因此,最好的辦法就是把模塊打包!這和js模塊化同樣的,模塊化開發,而後上線以前打包,線上完美使用。
像js打包,通常都會有配備的打包工具。好比seajs有他的spm,kissy有我寫的module-compiler(NodeJS版本)等等,對於css,不少人是用ant的concat或者grunt的concat,這樣作的不利的一面就是要把css模塊依賴寫在打包腳本的配置文件中,很不利於維護。不少時候,你新增了模塊,忘記了修改打包腳本的配置,而後發上去發現個人腳本怎麼沒生效?查了半天才發現是沒打包進去。
若是你利用我上面介紹的@import形式來組織你的css,那麼你就能夠用我寫的配套打包工具CSS Combo了:
首先安裝css combo:
npm install -g css-combo
而後進入你所在的入口文件(本例爲style.css)目錄,輸入:
csscombo style.css style.combo.css
這樣就會把style.css文件打包成style.combo.css文件。很簡單吧。固然還有其餘參數,請見github文檔
好吧,你不喜歡用命令,或者你想整合該工具到你本身的一整套打包工具中,能夠到github上看相關的api文檔:https://github.com/daxingplay/css-combo
模塊化,很是重要的一個特色就是要方便調試。不然我把壓縮以後的打包文件發上去了,發現線上出bug了怎麼辦?這裏,你只須要選擇一個代理工具將style-min.css(或者style.combo.css)文件代理成你的源碼文件style.css,而後刷新一下,看看是否是都模塊加載了?
或者,我也推薦你用這種方案,和開發配合起來,好比後臺是php,我能夠在引用style-min.css的時候這麼寫:
if(!empty($_GET['css-debug'])){ echo ' <link href="http://xxx/style.css">'; }else{ echo ' <link href="http://xxx/style-min.css">'; }
這樣,在線上,你能夠在url後面加上css-debug參數,那麼頁面就引用了style.css腳本,樣式文件所有模塊化載入,方便你調試,可以快速定位到出錯的模塊;而普通訪客進來,沒有加這個參數,所有是引用的style-min.css這個壓縮以後的腳本。
固然,你也能夠任意發揮,好比在淘寶內部,咱們能夠結合ucool方便切換源碼和非源碼,或者使用現成的代理工具,好比windows下的fiddler等,固然你能夠在js腳本里面,把源碼的link標記刪除掉,在動態插入源碼的link等等。
總之,利用模塊化,能夠很方便調試,定位出問題的代碼在哪一個文件。
首先,我務必要提醒你們,@import語法必定要仔細看。
基本上,如下幾種用法:
@import "./mod/mod1.css";
@import "f:/website/htdocs/xxx/assets/css/mod/mod2.css";
@import url("http://assets.taobaocdn.com/tbsp/tbsp.source.css");
這裏,咱們不推薦使用本地絕對路徑的引用方式,由於不利於團隊協做,相對目錄絕對夠用了,固然css-combo是支持解析本地絕對路徑的。
至於直接@import線上的路徑,css-combo工具也是支持的,會幫你下載下來~
另外,必定要注意,CSS規範中,@import必須放在其餘樣式以前,好比:
@import "./mod/mod1.css"; @import "./mod/mod2.css"; body { margin:0; }
而下面這種寫法:
@import "./mod/mod1.css"; body { margin:0; } @import "./mod/mod2.css";
mod2.css是沒法被瀏覽器@import進來的。因此咱們推薦的最佳實踐就是把全部的模塊import都放在入口文件的最開始,方便管理。
團隊裏面不是每人都會less,不是每一個人都喜歡less。並且less不支持gbk編碼,還有上面提到的,調試須要引入一段js,不少狀況下,開發套頁面的時候都保留了。。。其實,最根本的緣由就是less和css combo解決的不是一類問題,less更多的是把css編程化,css combo只專一css模塊打包:)
好,先寫到這兒吧,思路比較亂,你們有問題歡迎提出,對於css combo工具備任何需求和bug,歡迎到github上提issue。 (5603)
轉自:http://www.techcheng.com/study/css/introduce-css-combo.html