精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品久久久久久久久久东京 | 亚洲乱码国产乱码精品精| jizzjizz国产精品喷水| 国产在线日本| 精品亚洲成a人在线观看| 欧美丰满少妇xxxx| av黄色在线免费观看| 日韩在线成人| 欧美在线一区二区| 日韩精品免费一区| av电影在线观看| 成人av资源站| 国产综合视频在线观看| 国产成人无码精品久久久久| 午夜精品毛片| 日韩av综合中文字幕| 国内自拍第二页| 欧美无毛视频| 性感美女极品91精品| www.午夜色| 国产精品四虎| 91麻豆.com| 国产福利一区二区三区在线观看| 老熟妇一区二区三区啪啪| 在线欧美日韩| 久久躁狠狠躁夜夜爽| 亚洲理论片在线观看| 国产精品白丝av嫩草影院| 在线电影欧美成精品| 亚洲高清在线免费观看| 丁香花在线高清完整版视频| 中文字幕日韩欧美一区二区三区| 日本高清不卡三区| 四虎影视精品成人| 成人性色生活片| 91精品天堂| 国产尤物在线观看| 美国十次了思思久久精品导航| 日本韩国在线不卡| 国产精品久久久久久99| 亚洲成人原创| 91国产精品电影| jizz国产免费| 亚洲看片一区| 欧美精品18videos性欧| 中文字幕影音先锋| 欧美91大片| 欧美日本啪啪无遮挡网站| 特级片在线观看| 综合久久一区| 久久99热精品这里久久精品| 久久免费看少妇高潮v片特黄 | 色综合亚洲精品激情狠狠| 插吧插吧综合网| 国产在线日韩精品| 国产一区二区三区在线免费观看| www.狠狠爱| 欧美精品系列| 日韩在线观看网址| 日韩欧美国产成人精品免费| 国产精品91一区二区三区| 久久精品亚洲一区| 久久精品www| 91久久在线| 欧美一级在线亚洲天堂| 中文人妻av久久人妻18| 免费人成在线不卡| 91色精品视频在线| 亚洲成人黄色片| 99精品热视频| 日本一区视频在线| 免费网站黄在线观看| 亚洲制服丝袜在线| 国产精品无码av在线播放| av资源亚洲| 欧美日韩成人在线一区| 亚洲丝袜在线观看| 天海翼精品一区二区三区| 亚洲欧洲黄色网| 久久精品一区二区三区四区五区 | 日韩美女国产精品| 中文字幕欧美视频在线| 色婷婷粉嫩av| 中文国产一区| 国产欧美va欧美va香蕉在线 | 亚洲精品动漫100p| 欧美性猛交xxxx乱| 亚洲乱码精品| 欧美一级bbbbb性bbbb喷潮片| 艳妇乳肉豪妇荡乳av无码福利 | 欧美午夜精品一区二区三区| 污污视频在线免费| 亚洲人成网亚洲欧洲无码| 日韩在线观看免费全| 日韩欧美亚洲一区二区三区| 欧美aaaaa成人免费观看视频| 91牛牛免费视频| 欧美男男激情freegay| 亚洲三级在线免费观看| 女人天堂av手机在线| 国产精选久久| 一区二区三区四区在线观看视频| 欧美精品xxxxx| 日本vs亚洲vs韩国一区三区二区| 成人在线观看91| 91社区在线| 精品国产91久久久久久| 91精品视频国产| 狠狠做六月爱婷婷综合aⅴ| 久久久久久国产三级电影| 日韩精品在线一区二区三区| 成人福利视频在线| 400部精品国偷自产在线观看| 免费亚洲电影| 亚洲国产91精品在线观看| 性色国产成人久久久精品| 亚久久调教视频| 国产精品 日韩| 在线看一级片| 欧美精品一二三区| 亚洲激情视频小说| av成人天堂| 成人av影视在线| 菠萝菠萝蜜在线视频免费观看 | 怡红院亚洲色图| 少妇精品久久久| 97久久精品国产| 亚洲av少妇一区二区在线观看 | 久久精品亚洲无码| 国产精品1区二区.| 熟女熟妇伦久久影院毛片一区二区| 中文字幕成在线观看| 亚洲高清色综合| 国产无遮挡aaa片爽爽| 国产成人免费在线观看不卡| 最新欧美日韩亚洲| 国产aⅴ精品一区二区四区| 日韩中文字幕网| 在线观看毛片网站| 国产精品人人做人人爽人人添| 免费无码av片在线观看| 日韩高清成人在线| 欧美一级高清免费播放| 午夜国产在线观看| 岛国av一区二区三区| 亚洲の无码国产の无码步美| 亚洲伦伦在线| 精品在线一区| 久久久一本精品| 在线电影欧美日韩一区二区私密| 精品乱码一区内射人妻无码 | 日本三级视频在线| 不卡区在线中文字幕| 国内精品在线观看视频| 日本欧美高清| 日本成人精品在线| 91在线视频| 日韩欧美激情在线| 精品无码人妻一区二区三区品| 大美女一区二区三区| 9久久9毛片又大又硬又粗| 天堂俺去俺来也www久久婷婷 | 国产女同性恋一区二区| 国产精品视频中文字幕| 欧美精品网站| 99精品国产高清一区二区| av成人 com a| 伊人久久男人天堂| 国产精品久久久久久无人区| 亚洲自拍偷拍av| 午夜理伦三级做爰电影| 麻豆一区二区99久久久久| 日本女人高潮视频| 久久黄色影视| 国产精品日韩久久久久| 中文字幕伦理免费在线视频 | 午夜伦理大片视频在线观看| 亚洲国产精品成人精品| 中文字幕永久在线| 亚洲欧美日韩久久| 人妻少妇精品视频一区二区三区| 日本在线不卡视频| 人妻互换免费中文字幕| 奇米狠狠一区二区三区| 91在线观看免费| 亚洲私拍视频| 久久精品成人欧美大片| 亚洲av少妇一区二区在线观看| 日韩欧美国产成人| 国产女人18水真多毛片18精品| www精品美女久久久tv| 日本一二区免费| 国产精品日韩精品欧美精品| 亚洲一区三区在线观看| 欧洲在线一区| 亚洲一区二区三区777| 一区二区三区四区日本视频| 成年人精品视频| 欧美视频综合| 日韩欧美一二三区| 在线视频 91| 欧美日韩国产中文字幕| 精品欧美一区二区久久久久| 久久久精品免费观看| 国产免费无码一区二区| 麻豆精品国产传媒mv男同| 国产午夜福利100集发布| 久久久久久久久国产一区| 欧美日韩大片一区二区三区| 91成人精品在线| 国产日韩欧美中文| 希岛爱理一区二区三区av高清| 欧美激情第6页| 日本在线观看www| 亚洲片在线资源| 天天操天天干天天爱| 91精品国产一区二区| 欧美性受xxx黑人xyx性爽| 精品久久久久久久久中文字幕| 美国黄色小视频| 中文字幕亚洲区| 日本少妇xxxxx| 久久综合九色综合97婷婷| 怡红院一区二区| 国产成人午夜电影网| 在线免费观看av网| 理论片日本一区| 尤蜜粉嫩av国产一区二区三区| 亚洲专区欧美专区| 亚洲熟妇无码另类久久久| 亚洲小说区图片区| 免费在线黄网站| 亚洲国产激情| 国产美女主播在线播放| 欧美欧美全黄| 精品人妻人人做人人爽| 欧美一区久久| 一二三四中文字幕| 亚洲有吗中文字幕| 日本一道在线观看| 牛牛国产精品| 99在线免费视频观看| 黄色综合网站| 97超碰在线人人| 欧美日韩国产在线一区| 成人av在线不卡| 亚洲小说欧美另类婷婷| 男人日女人逼逼| 亚洲一区图片| 亚洲综合在线网站| 免费成人在线网站| 日本高清久久久| 国产伦精一区二区三区| 人妻精油按摩bd高清中文字幕| 国产福利精品一区二区| 高清中文字幕mv的电影| 97国产一区二区| 亚洲精品国产精品国自产网站| 国产日产精品一区| 黄色录像一级片| 一区二区久久久| 久久久久久久久久免费视频| 色综合久久综合网欧美综合网| 国产成人亚洲精品自产在线 | 超碰在线播放97| 亚洲护士老师的毛茸茸最新章节| 日韩精品视频无播放器在线看| 亚洲午夜久久久久久久| 日本中文字幕电影在线免费观看 | 日韩成人av毛片| 一本一道综合狠狠老| 中文字幕+乱码+中文乱码www| 7777精品伊人久久久大香线蕉超级流畅| 99热这里只有精品3| 亚洲成人网在线| 国产高清一级毛片在线不卡| 久久视频中文字幕| 黑森林国产精品av| 国产中文字幕亚洲| 女人抽搐喷水高潮国产精品| 亚洲欧洲一区二区福利| 黄色av一区| 香蕉视频网站入口| 国产成人综合精品三级| 美女久久久久久久久久| 自拍偷拍亚洲激情| 97久久久久久久| 欧美一区二区视频免费观看| 午夜视频1000| 美女精品久久久| 成人欧美大片| 999国产视频| 欧美精品一二| 婷婷五月综合缴情在线视频| 看电视剧不卡顿的网站| avtt香蕉久久| 亚洲乱码国产乱码精品精可以看| 久久久久久久久久久影院| 欧美一级片在线看| 国产鲁鲁视频在线观看免费| 高清欧美性猛交xxxx黑人猛交| 狠狠久久伊人中文字幕| 国产亚洲一区在线播放 | 亚洲精品蜜桃久久久久久| 日韩精品电影一区亚洲| 成熟妇人a片免费看网站| ㊣最新国产の精品bt伙计久久| 99精品人妻国产毛片| 精品少妇一区二区三区日产乱码 | 91成人在线观看国产| 国产精品麻豆| 手机成人在线| 麻豆久久精品| 白嫩情侣偷拍呻吟刺激| 亚洲男人天堂一区| 亚洲视频在线免费播放| 精品亚洲精品福利线在观看| 欧美videos另类精品| 国产在线久久久| 日本不卡高清| 国产91色在线观看| 久久日韩精品一区二区五区| 国产精品自拍视频一区| 日韩亚洲欧美高清| h片在线免费观看| 91亚洲va在线va天堂va国| 日韩大片在线观看| 看欧美ab黄色大片视频免费| 久久亚洲综合色| 影音先锋亚洲天堂| 日韩av在线看| 欧美激情网站| 久久综合中文色婷婷| 国产精品毛片一区二区三区| 无码人妻精品一区二区三区99不卡| 亚洲综合在线观看视频| 国产高清免费观看| 欧美黑人xxx| 91嫩草精品| 久久亚洲中文字幕无码| 成人国产精品免费观看| 日韩精品成人在线| 日韩成人高清在线| 中文字幕在线免费观看视频| 欧美日本亚洲| 免费精品视频最新在线| 久久精品日韩无码| 欧美一激情一区二区三区| 国产盗摄一区二区| 国内精品视频在线播放| 午夜在线视频观看日韩17c| 亚洲天堂网一区二区| 一本色道**综合亚洲精品蜜桃冫| 青青操在线视频| 国产精品劲爆视频| 国产精品久久久久无码av| 亚洲制服在线观看| 午夜精品在线视频一区| 四虎在线观看| 国产在线一区二区三区| 欧美激情在线| 国产国语性生话播放| 91久久国产综合久久| 欧美一区二区三区| 不卡日韩av| 美女黄网久久| 很污很黄的网站| 日韩欧美国产精品| www.日韩| 国产精品亚洲天堂| aa级大片欧美| 中文字幕在线观看国产| 色综合久久悠悠| 亚洲丁香日韩| 国内自拍第二页| 欧美日韩免费网站| 91免费在线| 国模一区二区三区私拍视频| 免费观看久久久4p| 国产亚洲精品成人| 国产一区二区三区日韩欧美| 美女精品久久| 日本熟妇人妻xxxxx| 亚洲免费资源在线播放| 视频午夜在线| 成人午夜在线影院| 国产日韩精品视频一区二区三区 | 免费日本黄色网址| 欧美性大战久久久| 182在线视频观看| 在线视频不卡国产| 97精品久久久午夜一区二区三区| 中文字幕一二三四| 91精品国产乱码久久久久久蜜臀| 日本一二区不卡| 欲求不满的岳中文字幕| 7777精品伊人久久久大香线蕉 | 日韩免费va| 欧妇女乱妇女乱视频| 日本一区二区三区视频视频|