CSS 預處理器與 CSS 後處理器

轉載自"趙雷的博客",原文地址:http://zhaolei.info/2014/01/04/css-preprocessor-and-postprocessor/

說到 CSS 預處理器,大家都很熟悉了,本文的重點是介紹從中抽出的 CSS 後處理器,這也是近一年多以來,前端社區的一些新趨勢。
將 CSS 後處理器 抽象出來之後,會對 CSS 的 開發模式 帶來一些變化,下面從概念開始說起。

CSS 預處理器

廣義上說,目標格式爲 CSS 的 預處理器 是 CSS 預處理器,但本文 特指 以最終生成 CSS 爲目的的 領域特定語言
SassLESSStylus 是目前最主流的 CSS 預處理器。

示例

下面以 LESS 爲例:

LESS
1
2
3
4
5
6
7
.opacity(@opacity: 100) {
opacity: @opacity / 100;
filter: ~"alpha(opacity=@{opacity})";
}
.sidebar {
.opacity(50);
}

將以上 DSL 源代碼 (LESS),編譯成 CSS

1
2
3
4
.sidebar {
opacity: 0.5;
filter: alpha(opacity=50);
}

可以看到,編譯前 與 編譯後 是完全不同的語言。

實現原理

  1. 取到 DSL 源代碼 的 分析樹
  2. 將含有 動態生成 相關節點的 分析樹 轉換爲 靜態分析樹
  3. 將 靜態分析樹 轉換爲 CSS 的 靜態分析樹
  4. 將 CSS 的 靜態分析樹 轉換爲 CSS 代碼

現實中的 CSS 預處理器 更復雜一點兒,因爲大多功能要同時支持 特有 DSL 與 原生 CSS,一件事情要同時考慮兩種情況下的處理。

優缺點

  • 優點:語言級邏輯處理,動態特性,改善項目結構
  • 缺點:採用特殊語法,框架耦合度高,複雜度高

CSS 後處理器

CSS 後處理器 是對 CSS 進行處理,並最終生成 CSS 的 預處理器,它屬於廣義上的 CSS 預處理器
我們很久以前就在用 CSS 後處理器 了,最典型的例子是 CSS 壓縮工具(如 clean-css),只不過以前沒單獨拿出來說過。
還有最近比較火的 Autoprefixer,以 Can I Use 上的 瀏覽器支持數據 爲基礎,自動處理兼容性問題。

示例

以 Autoprefixer 爲例:

1
2
3
4
5
6
.container {
display: flex;
}
.item {
flex: 1;
}

將以上 標準 CSS,編譯爲處理了兼容性的 生產環境 CSS


1
2
3
4
5
6
7
8
9
10
11
12
.container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
.item {
-webkit-box-flex: 1;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
}

可以看到,編譯前 與 編譯後 的代碼都是 CSS。

如果你使用 Sublime Text,可以通過 Package Control 安裝 Autoprefixer 插件體驗一下。

實現原理

  1. 將 源代碼 做爲 CSS 解析,獲得 分析樹
  2. 對 CSS 的 分析樹 進行 後處理
  3. 將 CSS 的 分析樹 轉換爲 CSS 代碼

優缺點

  • 優點:使用 CSS 語法,容易進行模塊化,貼近 CSS 的未來標準
  • 缺點:邏輯處理能力有限

開發模式的變化

原來的開發模式是這樣的:

DSL 源代碼 -> 生產環境 CSS

與原來相比,新的 開發模式 最大的變化是面向 標準 CSS 編程,將 兼容性優化 部分交給 CSS 後處理器 自動完成:

DSL 源代碼 -> 標準 CSS -> 生產環境 CSS

等到衆多 CSS 未來標準 在 CSS 後處理器 層面實現之後,部分項目甚至可以迴歸到使用 標準 CSS 編程的模式:

標準 CSS(包含未來標準的後處理器實現)-> 生產環境 CSS

以下有一些簡單對比:

對比項 預處理器 後處理器 兩者同時使用
語言學習成本 DSL CSS √ DSL
目標輸出結果 生產環境 CSS 標準 CSS √ 標準 CSS √
兼容性處理耦合度 高,依賴 DSL 框架 低,依賴後處理器 √ 低,依賴後處理器 √
可編程性 高,語言級邏輯處理 √ 中,擴展 CSS 語法 高,語言級邏輯處理 √

現在我推薦 CSS 預處理器 與 CSS 後處理器 同時使用,各自做他們最擅長的部分。

我當回神棍,預計以後會有這樣的趨勢:

  • 越來越多專注於 單一功能 的小型 CSS 工具庫
  • CSS 樣式庫 從 整體方案 到 模塊化組合方案 轉變
  • 部分 CSS 未來標準 在 CSS 預處理器 中得到支持
  • 原生 CSS 和 CSS 後處理器 的組合成爲新選擇

優秀的 CSS 後處理器框架

Rework

Rework 是一個 高效、簡單、易擴展 並且 模塊化 的 CSS預處理器。
它在 2012 年 9 月才發佈了第一個版本,是 Stylus 的作者 TJ Holowaychuk 大神挖的新坑。

實際上,他採用的是 CSS 後處理器 的模型,在其之上有一個模仿 Stylus 風格縮進嵌套的工具 styl,其 CSS 預處理器 部分功能是在 Rework 開始工作之前通過 css-whitespace 實現的。
有一些基於 Rework 的樣式庫,參考了 CSS 標準草案 或 CSS 標準提案,相當於支持了 CSS 的未來標準,如 rework-varsrework-font-variantrework-calcrework-color-function 等。

是不是聽起來有點暈?這正說明它的模塊化做的非常好,你可以按照實際需要,組合 CSS 框架,比如 Myth

概括一下 Rework 的特點:

  • JavaScript 中直接操作 CSS 解析對象,擴展方便
  • 可以 自由組合模塊,按需定製 CSS 工具庫
  • CSS 後處理器 的模型決定它的模塊傾向 CSS 未來標準
  • 除 服務器 端外,也支持在 瀏覽器 環境運行

Rework 還很年輕,還需要更多的時間積累。

PostCSS

PostCSS 是一個 CSS 後處理器 框架,允許你通過 JavaScript 對 CSS 進行修改。
它的第一個版本發佈於 2013 年 11 月,是從 Autoprefixer 項目中抽象出的框架。

PostCSS 有以下特點:

  • 它和 Rework 非常相似,但提供了 更高級的 API,更易擴展
  • 它可以在現有 Source Map 的基礎上生成新的 Source Map
  • 在 原有 CSS 格式 的保留方面做的更好,便於開發 編輯器插件
  • 比 Rework 更年輕,還只有 Autoprefixer 一個成功案例

其實 Autoprefixer 最初是基於 Rework 做的,但後來作者有更多需求(上面的列表),就造了 PostCSS 這個輪子。

最後

CSS 後處理器 的出現讓 CSS 工作流 更清晰,但現在他們還遠未成熟,還有很多地方能夠做的更好。

比如 Autoprefixer 只做語法 Prefix 層面的兼容,還需要一些專門處理如 IE 濾鏡兼容 這些問題的小模塊配合使用。
比如可以針對 CSS 中單獨使用的 圖片 自動做 CSS Sprites 歸類與合併 的工作。
比如可以根據項目對 圖標字體 字形的實際使用情況自動對字體進行 體積優化

當每個模塊都專注於特定的問題時,那他多數情況下要比一個大而全的集中式框架更靠譜。

或許你也可以考慮基於 Rework 或 PostCSS 寫個 CSS 後處理器 玩玩?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章