精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

解剖postCSS- 向前端架構師邁出一小步

開發 前端
最近很火的TailwindCSS有一個功能,可以將項目未使用的css選擇器從編譯后css文件中移除。

 最近很火的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

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的AST

你可以在astexplorer[3]中選擇:

  • 語言:css
  • parser:postCSS

來了解postCSS如何解析css。

比如,對于如下css代碼:

  1. /** 
  2.  * I am KaSong 
  3.  */ 
  4.  
  5. @media screen and (min-width: 900px) { 
  6.   article { 
  7.     padding: 1rem 3rem; 
  8.   } 
  9.  
  10.  
  11. ul { 
  12.  margin: 3rem; 
  13.  
  14. ul li { 
  15.  padding: 5px; 

會被postCSS解析為如下樹結構的AST:


節點有如下幾種類型:

  • Root:根節點,代表一個css文件
  • AtRule:以@開頭的申明,比如@charset "UTF-8"或@media (screen) {}
  • Rule:內部包含定義的選擇器,比如input, button {}
  • Declaration:key-value鍵值對,比如color: black;
  • Comment:單獨的注釋。selectors、at-rule的參數以及value的注釋在節點的node屬性內

實現一個簡單的插件

接下來我們從一個插件的實現來了解開發者如何介入postCSS編譯流程。

postcss-focus[4]會為所有:hover選擇器增加:focus以提高鍵盤操作的可用性。

對于如下代碼:

  1. .a:hover, .b:hover, .c:hover { 
  2.   opacity: .5; 

經過該插件處理后會輸出:

  1. .a:hover, .b:hover, .c:hover, .a:focus, .b:focus, .c:focus { 
  2.   opacity: .5; 

你可以安裝postcss、postcss-focus后通過如下demo在控制臺看到結果:

  1. const postcssFocus = require('postcss-focus'); 
  2. const postcss = require('postcss'); 
  3. const fs = require('fs'); 
  4.  
  5. // 輸入的css文件地址 
  6. const from = 'src/a.css'
  7. const to = 'output/a.css'
  8.  
  9. fs.readFile(from, (err, css) => { 
  10.   postcss(postcssFocus).process(css, { fromto }).then(result => { 
  11.     console.log(result.css) 
  12.   }) 
  13.    
  14. }) 

接下來我們分析postcss-focus源碼[5]的實現邏輯:

  1. postCSS將輸入的css解析為AST
  2. 遍歷AST中所有Rule類型節點
  3. 維護一個數組,遍歷這個節點的所有selector,每遍歷到一個包含:hover的selector就往數組中push一個:focus的selector
  4. 將2中得到的數組concat到該節點已有的selectors后
  5. 根據改變后的AST輸出新的css

核心源碼如下:

  1.   postcssPlugin: 'postcss-focus'
  2.   // 步驟1 
  3.   Rulerule => { 
  4.     // 步驟2 
  5.     if (rule.selector.includes(':hover')) { 
  6.       let focuses = [] 
  7.       for (let selector of rule.selectors) { 
  8.         if (selector.includes(':hover')) { 
  9.           let replaced = selector.replace(/:hover/g, ':focus'
  10.           if (!hasAlready(rule.parent, replaced)) { 
  11.             focuses.push(replaced) 
  12.           } 
  13.         } 
  14.       } 
  15.       // 步驟3 
  16.       if (focuses.length) { 
  17.         rule.selectors = rule.selectors.concat(focuses) 
  18.       } 
  19.     } 
  20.   } 

這個插件只是為了演示插件的基本工作方法,實際上該插件實現的比較粗糙。

postCSS提供了詳細的插件創建文檔[6]。甚至提供了create-postcss-plugin[7]用來創建插件的模版代碼。

更多可能性

由于提供了表達、改寫css AST的能力,postCSS的插件可以實現非常多功能。比如:

postcss-functions

上文介紹了Declaration節點表達「css屬性」的鍵值對,其中值為「字符串」類型。

那么完全可以自定義值的解析規則。

  1. body { 
  2.   color: getColor(); 

通過定義getColor函數,并在AST中將其解析為函數執行,就能在css文件中用js寫邏輯代碼。

這就是postcss-functions[8]

stylelint

配置不同的lint規則,實現css的靜態語法檢測。這就是stylelint[9]

總結

當前postCSS插件按功能劃分大體有如下幾類:

  • 解決全局css問題,比如提供css module[10]支持
  • 使用未全面兼容的css特性,比如autoprefixer[11]
  • 格式化,提高css可讀性
  • 圖片和文字處理
  • linters,比如stylelint
  • 不同語法的css支持,比如postcss-html[12]可以解析類html文件中 

讀到這里,相信你會同意:相比Less、Sass,postCSS才是css處理領域的大殺器。

參考資料

[1]browserslist:

https://github.com/browserslist/browserslist[2]caniuse:

https://caniuse.com/#search=[3]astexplorer:

https://astexplorer.net/[4]postcss-focus:

https://www.npmjs.com/package/postcss-focus[5]postcss-focus源碼:

https://github.com/postcss/postcss-focus/blob/master/index.js[6]插件創建文檔:

https://github.com/postcss/postcss/blob/main/docs/writing-a-plugin.md[7]create-postcss-plugin:

https://github.com/csstools/create-postcss-plugin[8]postcss-functions:

https://www.npmjs.com/package/postcss-functions[9]stylelint:

https://github.com/stylelint/stylelint[10]css module:

https://github.com/madyankin/postcss-modules[11]autoprefixer:

https://github.com/postcss/autoprefixer[12]postcss-html:

https://github.com/gucong3000/postcss-html

 

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2021-02-25 16:58:38

Babel前端JavaScript

2013-10-09 09:32:58

2024-10-24 23:40:34

2016-11-07 13:31:24

2017-09-22 11:18:19

2009-12-17 17:40:45

架構師

2017-03-30 16:41:07

互聯網

2020-06-28 14:15:52

前端架構師互聯網

2018-03-15 13:14:59

思科網絡技術智慧系統

2018-02-10 11:24:39

Python數據程序

2020-07-22 22:10:34

互聯網物聯網IOT

2012-10-22 10:01:45

TD-LTETD-LTE頻譜TDD頻譜

2012-09-06 13:12:41

架構師ArchSummit

2012-06-17 12:58:04

架構師架構

2021-05-14 05:26:25

前端架構開發

2020-11-11 09:37:56

芯片

2011-11-28 14:59:47

華為

2020-08-24 08:50:12

架構師TL技術

2009-12-18 10:22:50

Ray Ozzie架構師

2023-09-18 14:39:02

點贊
收藏

51CTO技術棧公眾號

亚洲午夜久久久影院伊人| 午夜伦理精品一区| 下面一进一出好爽视频| 高h视频在线播放| 91网上在线视频| 国产精品网红直播| 精品无码人妻一区二区三| 亚洲欧洲免费| 欧美老女人在线| 日本一区午夜艳熟免费| 成年人视频在线免费观看| 国产乱码一区二区三区| 欧美在线视频播放| 日韩黄色免费观看| 国产欧美日韩在线一区二区 | 日产精品久久久| 残酷重口调教一区二区| 欧美日韩一级大片网址| 国产a级片网站| 在线免费观看黄色网址| 99视频超级精品| 成人免费视频网址| 免费av中文字幕| 影音先锋中文字幕一区| 丝袜情趣国产精品| 老鸭窝一区二区| 婷婷综合国产| 欧美日韩国产综合久久| 欧美女人性生活视频| 91三级在线| 国产精品国产自产拍高清av| 久精品国产欧美| 精品久久在线观看| 久久福利视频一区二区| 亲子乱一区二区三区电影| 久久久久免费看| 久久久久久免费视频| 亚洲无限av看| 亚洲综合网在线观看| 91精品啪在线观看国产爱臀| 91精品一区二区三区久久久久久 | 黄色一级片网址| 国产美女视频一区二区三区| 99精品在线观看视频| 99视频在线播放| 国产三级自拍视频| 国内不卡的二区三区中文字幕| 日韩av不卡电影| 福利所第一导航| 久久一区二区三区喷水| 中文字幕在线亚洲| 日韩精品电影一区二区三区| 亚洲精品456| 亚洲精品一区中文| 黄瓜视频污在线观看| 久久中文资源| 欧美精品一区二区三区视频| 超碰在线超碰在线| 国产精品毛片aⅴ一区二区三区| 婷婷丁香激情综合| 18黄暴禁片在线观看| 丰乳肥臀在线| 欧美日韩中国免费专区在线看| 日韩av在线第一页| 竹内纱里奈兽皇系列在线观看 | 波多野结衣电车| 日韩二区在线观看| 国产精品视频一区国模私拍 | 欧美一级大片| 在线免费观看一区| 性生活免费在线观看| 亚洲精品乱码日韩| 欧美成人综合网站| 国产免费一区二区三区最新6| 欧美aaaaa级| 亚洲欧美一区二区三区在线 | 日韩视频在线观看| 久久精品电影网| 国产精品99精品| 老鸭窝亚洲一区二区三区| 国产精品激情av在线播放| 97精品人妻一区二区三区香蕉 | 欧美日本韩国一区| 久久黄色一级视频| 日本午夜精品| www.99久久热国产日韩欧美.com| 欧美三根一起进三p| 日韩一级免费| 国产精品一区二区三区在线播放| 国产福利第一视频| 久久久久久久久久久久久女国产乱 | 超碰97人人射妻| 久久久加勒比| 亚洲国产精品女人久久久| 老熟妇一区二区| 亚洲欧美综合| 国产精品欧美风情| 亚洲成人一级片| 欧美激情一区二区三区全黄| 先锋影音男人资源| 成人一区福利| 日韩精品在线一区二区| 一级性生活毛片| 欧美.日韩.国产.一区.二区| 欧美一区三区三区高中清蜜桃| 国产一区二区三区三州| 99re视频精品| 色中文字幕在线观看| 涩涩av在线| 日韩亚洲欧美在线观看| 亚洲精品一区二区三区影院忠贞| 欧美精品啪啪| 国产精品中文久久久久久久| 欧美一级淫片免费视频魅影视频| 国产精品国产三级国产aⅴ中文| 国产精品久久久久久久乖乖| 未满十八勿进黄网站一区不卡| 亚洲精品一线二线三线 | 亚洲成年人影院| 57pao国产成永久免费视频| 偷拍一区二区| 高清欧美性猛交xxxx黑人猛交| 中文字幕免费在线看| 91在线视频在线| 久久av综合网| 无码国模国产在线观看| 日韩在线观看精品| 这里只有精品6| 国产人久久人人人人爽| 久久国产亚洲精品无码| julia中文字幕一区二区99在线| 啊v视频在线一区二区三区 | 亚洲国产高清福利视频| 国产人妻精品一区二区三区不卡| 国产精品久久777777毛茸茸 | 亚洲h精品动漫在线观看| www.日本久久| 忘忧草精品久久久久久久高清| 国产精品第一第二| 国内在线精品| 色综合天天综合色综合av | 国产精品九色蝌蚪自拍| www.日日操| 蜜桃精品噜噜噜成人av| 欧美一区二区三区精品电影| 天天操天天操天天| 欧美日韩国产一区二区| 亚洲一区二区在线免费| 亚洲精品专区| 久久影院理伦片| 一个人看的www视频在线免费观看 一个人www视频在线免费观看 | 思热99re视热频这里只精品| 91福利视频网| 男女视频在线观看免费| 日本道在线观看一区二区| 国产女主播喷水高潮网红在线| 亚洲影院在线| 欧美二区三区在线| 亚洲日本在线观看视频| 尤物yw午夜国产精品视频明星| 精品久久久久久久久久久国产字幕| wwwwxxxxx欧美| 韩国中文字幕av| 先锋资源久久| av在线不卡一区| 黄色在线观看www| 国产婷婷色综合av蜜臀av| 99精品人妻国产毛片| 日本一区二区三区dvd视频在线 | 久久精品免视看| 久草精品在线播放| 成人免费在线播放| 91亚洲国产成人久久精品网站| 日本伦理一区二区| 日韩电影大全免费观看2023年上 | 色呦呦在线看| 日韩精品福利网站| 国产原创中文av| 亚洲大片免费看| 欧美丰满美乳xxⅹ高潮www| 九九**精品视频免费播放| a级网站在线观看| 农村少妇一区二区三区四区五区 | 亚州国产精品| 成人激情av在线| 玖玖在线播放| 中文字幕在线成人| 婷婷丁香花五月天| 欧美日韩在线三级| 日韩欧美高清在线观看| 欧美国产国产综合| 蜜桃福利午夜精品一区| 欧美日韩国产色综合一二三四| 国产v亚洲v天堂无码| 依依综合在线| 大胆人体色综合| 欧美日韩影视| 日韩一区二区三免费高清| 男人天堂2024| 亚洲精品免费视频| 国精产品一区二区三区| 国产精品亚洲综合一区在线观看| 日韩av片在线看| 中文字幕一区二区av| 欧美黑人3p| av在线亚洲色图| 成人激情视频网| 色尼玛亚洲综合影院| 欧美黑人xxxⅹ高潮交| 99青草视频在线播放视| 亚洲国产精品成人va在线观看| 伊人网综合在线| 欧美丝袜美女中出在线| 久久香蕉精品视频| 国产精品福利一区| av电影在线不卡| 97久久精品人人做人人爽| 善良的小姨在线| 蜜桃精品视频在线观看| 亚洲成熟丰满熟妇高潮xxxxx| 欧美区日韩区| eeuss中文| 日韩免费特黄一二三区| 欧美精品一区二区三区在线看午夜 | 久久尤物视频| www在线观看免费| 欧美私人啪啪vps| 日本黄色播放器| 欧美1级片网站| 日韩高清av电影| 美女少妇全过程你懂的久久| 精品毛片久久久久久| 国产精伦一区二区三区| 99久久综合狠狠综合久久止| 国产美女亚洲精品7777| 国产主播欧美精品| 婷婷激情成人| 91久久久久久久| 在线观看欧美| 91亚洲国产成人精品性色| 亚洲成人1区| 91视频免费在线| 午夜不卡一区| 91香蕉国产在线观看| 99er精品视频| 2020国产精品久久精品不卡| 91国产一区| 91久久国产综合久久蜜月精品| 国产一区精品二区| 亚洲一区久久久| 亚洲日本va午夜在线电影| 999国产在线| 粉嫩av一区二区| 国内精品久久国产| 亚洲人成网站77777在线观看| 久久国产精品99久久久久久丝袜| 日韩在线影视| 日本精品一区二区三区高清 久久| 国产a久久精品一区二区三区| 日韩国产高清一区| 色琪琪久久se色| 久久国产精品免费观看| 欧美午夜不卡| 美女av免费在线观看| 欧美a级一区二区| 色姑娘综合天天| 99精品视频在线观看免费| av中文字幕免费观看| 欧美国产97人人爽人人喊| 久久精品黄色片| 精品国产精品三级精品av网址| av黄色在线播放| 欧美午夜电影一区| 精品区在线观看| 亚洲精品v天堂中文字幕| www亚洲人| 欧美激情久久久久久| 中文字幕乱码在线播放| 成人免费在线视频网址| 极品尤物一区| 亚洲视频电影| 亚洲精品激情| 国产精品一区二区小说| 粉嫩一区二区三区在线看| 野外性满足hd| 亚洲免费观看高清完整版在线| 日韩精品手机在线| 欧美日本韩国一区二区三区视频| 你懂的网站在线| 自拍偷拍免费精品| 91黄页在线观看| 国产精品丝袜久久久久久高清| a级日韩大片| 亚洲日本精品| 国产一区二区三区久久| aaa一级黄色片| 久久久高清一区二区三区| 日本中文字幕免费在线观看| 欧美性猛交xxxxx水多| 99re只有精品| 一区二区三区黄色| аⅴ资源天堂资源库在线| 成人黄色在线观看| 国产区精品区| 阿v天堂2018| 国产一区二三区| 中文字幕人妻一区二区三区在线视频 | 久久精品久久精品国产大片| 亚洲不卡av不卡一区二区| 99精品视频播放| 成人精品鲁一区一区二区| 国产午夜精品久久久久久久久| 精品久久久久久久大神国产| 国产乱人乱偷精品视频| 国产亚洲精品一区二555| heyzo高清国产精品| 91精品中国老女人| 欧美日韩中文一区二区| 国产h视频在线播放| 国产98色在线|日韩| 亚洲熟女毛茸茸| 色素色在线综合| 四虎影院在线域名免费观看| 理论片在线不卡免费观看| 玖玖精品在线| 丝袜足脚交91精品| 玖玖精品视频| 亚欧洲乱码视频| 黑人巨大精品欧美一区二区| 超碰免费在线97| 欧美乱妇高清无乱码| 未满十八勿进黄网站一区不卡| 色综合影院在线观看| 久久久一二三| 亚欧洲乱码视频| 91久久线看在观草草青青| 天堂资源中文在线| 欧美一区二三区| 亚洲欧洲av| 日本黄网站免费| 久久久久综合网| 无码人妻久久一区二区三区| 日韩精品www| 国产日韩另类视频一区| 欧美久久综合性欧美| 日韩精品1区2区3区| 黄免费在线观看| 欧美在线三级电影| 亚洲欧美视频一区二区| 国产精品直播网红| 亚洲精品一二三区区别| 国产一级片中文字幕| 一区二区久久久久| 天堂av一区二区三区| 91精品国产成人www| 九九视频免费观看视频精品| 欧美日韩亚洲一二三| 国产精品色哟哟网站| 97人妻一区二区精品免费视频| 久久国产精品久久精品| 亚洲一区二区三区日本久久九| 日韩小视频网站| 久久久久国产精品麻豆ai换脸| 这里只有精品999| 久久精品亚洲94久久精品| 色播一区二区| 成熟了的熟妇毛茸茸| 亚洲国产高清不卡| 精品二区在线观看| 2021国产精品视频| jiujiure精品视频播放| 污污的视频免费| 亚洲制服丝袜在线| 欧美巨乳在线| 91精品视频观看| 亚洲天堂久久| 日韩视频在线观看免费视频| 欧美另类变人与禽xxxxx| 国产丝袜精品丝袜| 日本一区视频在线播放| 国产一区中文字幕| 欧美videossex极品| 日韩网站免费观看高清| 国产精品任我爽爆在线播放| 91av在线免费播放| 亚洲精品日产精品乱码不卡| 天堂在线视频观看| 国产欧美日韩亚洲精品| 亚洲精品激情| 视频国产一区二区| 亚洲激情免费观看| 亚洲国产天堂| 国产a级一级片| 一区二区三区日韩| 国产午夜在线观看| 国产精品一区二| 精品在线你懂的| 国产伦精品一区二区三区视频网站 | 成年人在线观看av| 欧美日韩精品一区二区三区|