css預處理器和後處理器

来源:http://www.cnblogs.com/cyn941105/archive/2016/06/16/5590239.html
-Advertisement-
Play Games

因為我是前端剛入門,昨天看了一個大神寫的的初級前端需要掌握的知識,然後我就開始一一搜索,下麵是我對css預處理器和後處理器的搜索結果,一是和大家分享下這方面的知識,另一方面方便自己以後翻閱。所以感興趣的可以看下。 轉載自"趙雷的博客",原文地址:http://zhaolei.info/2014/01 ...


因為我是前端剛入門,昨天看了一個大神寫的的初級前端需要掌握的知識,然後我就開始一一搜索,下麵是我對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 後處理器 玩玩?


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • jQuery jQuery是一個快速,小,功能豐富的JavaScript庫。 它使 HTML文檔遍歷和操作、事件處理、 動畫和Ajax更簡單和易於使用的API,在工作 眾多的瀏覽器。 和多功能性的結合 可擴展性,jQuery已經改變了數百萬人的方式寫 JavaScript。 網址: 1. "http ...
  • EChart ECharts,一個純 Javascript 的圖表庫,可以流暢的運行在 PC 和移動設備上,相容當前絕大部分瀏覽器(IE8/9/10/11,Chrome,Firefox,Safari等),底層依賴輕量級的 Canvas 類庫 ZRender,提供直觀,生動,可交互,可高度個性化定製的 ...
  • JS格式化金額,正則方式修改。 ...
  • 實現tab切換的主要html代碼: 實現tab切換的jquery代碼: ...
  • 在之前項目後臺管理界面開發中,不知道有layer這樣好用的組件,我的內心是這樣的的。。。呀!這個框架有彈框,哈哈哈,好開心,不用自己寫遮罩層,不用自己寫彈框,好開森。。 當知道有layer之後。。。。。這麼方便,這麼人性化,好漂亮,哇哦,好簡單。。。 或許我這人看到新鮮的東西都叫好吧,不好的暫時沒發 ...
  • [1]一元加 [2]一元減 [3]遞增 [4]遞減 [5]加法 [6]減法 [7]乘法 [8]除法 [9]求餘 ...
  • 我們知道,JavaScript中檢測對象類型的運算符有:typeof、instanceof,還有對象的constructor屬性: 1) typeof 運算符 typeof 是一元運算符,返回結果是一個說明運算數類型的字元串。如:"number","string","boolean","object ...
  • div+css3實現漂亮的多動畫彩標簽雲,滑鼠移動會有動畫 點擊運行效果 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...