最近很火的tailwindcss
有乙個功能:
可以將專案未使用的css
選擇器從編譯後css
檔案中移除。
purgecss
實現的。
鏈結tailwindcss
與purgecss
的,則是乙個postcss
外掛程式@fullhuman/postcss-purgecss
。
不僅tailwindcss
,還有很多知名專案中使用了postcss
外掛程式。比如:
很多人在專案中使用autoprefixer
外掛程式,為css
選擇器增加不同的「瀏覽器字首」。
在其內部會根據browserslist[1]指定瀏覽器版本。
再去caniuse[2]查詢該瀏覽器版本相容性支援情況。
最後通過postcss
的能力改寫不支援的css
屬性。
可以看到,postcss
正越來越成為前端專案必不可少的依賴。
同時也有很多關於postcss
的誤區,比如認為他是和less
、sass
一樣的「css預處理器」。
本文會自底向上介紹postcss
,希望通過此文讓你對這款大殺器有更深的認識。
postcss
是一款css
編譯器。
模擬babel
家族的@babel/parser
可以將js
**解析為ast
(抽象語法樹),再利用眾多外掛程式(@babel/plugin-xx
)的能力改寫ast
,最終輸出改寫後的js
**。
postcss
利用自身的parser
可以將css
**解析為ast
,再利用眾多外掛程式(上文介紹的autoprefixer
就是一種)改寫ast
,最終輸出改寫後的css
**。
less
這樣的「css預處理器」的不同 ——postcss
的輸入與輸出產物都是css
檔案。
因此,postcss
也被成為「後處理器」,因為其通常在css
處理鏈條的最後端。
來了解postcss
如何解析css
。
比如,對於如下css
**:
/**
* i am kasong
*/@media screen and (min-width: 900px)
}ul
ul li
會被postcss
解析為如下樹結構的ast
:
接下來我們從乙個外掛程式的實現來了解開發者如何介入postcss
編譯流程。
postcss-focus[4]會為所有:hover
選擇器增加:focus
以提高鍵盤操作的可用性。
對於如下**:
.a:hover, .b:hover, .c:hover
經過該外掛程式處理後會輸出:
.a:hover, .b:hover, .c:hover, .a:focus, .b:focus, .c:focus
你可以安裝postcss
、postcss-focus
後通過如下demo
在控制台看到結果:
const postcssfocus = require('postcss-focus');
const postcss = require('postcss');
const fs = require('fs');
// 輸入的css檔案位址
const from = 'src/a.css';
const to = 'output/a.css';
fs.readfile(from, (err, css) => ).then(result => )
})
接下來我們分析postcss-focus原始碼[5]的實現邏輯:
postcss
將輸入的css
解析為ast
遍歷ast
中所有rule
型別節點
維護乙個陣列,遍歷這個節點的所有selector
,每遍歷到乙個包含:hover
的selector
就往陣列中push
乙個:focus
的selector
將2中得到的陣列concat
到該節點已有的selectors
後
根據改變後的ast
輸出新的css
核心原始碼如下:
}
}// 步驟3
if (focuses.length) }}}
這個外掛程式只是為了演示外掛程式的基本工作方法,實際上該外掛程式實現的比較粗糙。
postcss
提供了詳細的外掛程式建立文件[6]。甚至提供了create-postcss-plugin[7]用來建立外掛程式的模版**。
由於提供了表達、改寫css ast
的能力,postcss
的外掛程式可以實現非常多功能。比如:
上文介紹了declaration
節點表達「css屬性」的鍵值對,其中值為「字串」型別。
那麼完全可以自定義值的解析規則。
body
通過定義getcolor
函式,並在ast
中將其解析為函式執行,就能在css
檔案中用js
寫邏輯**。
這就是postcss-functions[8]
配置不同的lint
規則,實現css
的靜態語法檢測。這就是stylelint[9]
當前postcss
外掛程式按功能劃分大體有如下幾類:
讀到這裡,相信你會同意:相比less
、sass
,postcss
才是css
處理領域的大殺器。
[1]browserslist:
[2]caniuse:
[3]astexplorer:
[4]postcss-focus:
[5]postcss-focus原始碼:
[6]外掛程式建立文件:
[7]create-postcss-plugin:
[8]postcss-functions:
[9]stylelint:
[10]css module:
[11]autoprefixer:
[12]postcss-html:
1.看到這裡了就點個在看支援下吧,你的在看是我創作的動力。
3.如果你覺得本文的內容對你有幫助,就幫我**一下吧。
前端架構師
專案架構 1.封裝專案的基礎庫 優秀的基礎庫可以保證專案的最低質量下限和更好的可擴充套件性。通常我們說的基礎庫包括 元件庫 基礎 css 庫 基礎工具庫。2.層級管理 管理你的請求,建議把你專案的 api 層獨立出來為乙個層級管理,這樣有利於在複雜介面下,更好的管理,降低複雜度。效能優化 1.快取 ...
前端架構師的思考
還記得2006年的時候 garrett dimon 寫了一篇關於前端架構師的文章 標題是the time is now for front end architects 到了前端架構師出手的時候了 他在這篇文章中有了對前端架構師能力的範圍的乙個list概括 作為乙個前端架構師,必須擁有這些領域的絕對...
前端架構師的思考
還記得2006年的時候 garrett dimon 寫了一篇關於前端架構師的文章 標題是the time is now for front end architects 到了前端架構師出手的時候了 他在這篇文章中有了對前端架構師能力的範圍的乙個list概括 作為乙個前端架構師,必須擁有這些領域的絕對...