各位前端大神能不能通俗的說一下PostCSS到底能做什麼?對於手寫css的優勢在哪?
PostCSS 就是 CSS 界的 Babel。
它們本身只做兩件事:
- 把源代碼(或者符合一定條件的擴展語法)解析為一個自帶遍歷訪問、節點操作介面的樹;
- 把語法樹輸出為代碼字元串。
主要的功能,都由插件提供,在第一步完成以後,這棵樹以及上面的節點會由一個個插件依次進行處理。插件可以做很多事,比如:
- 識別一些瀏覽器尚未支持的語法,轉換為瀏覽器支持的(Autoprefixer、cssnext);
- 在不破壞解析的前提下在一定程度上擴展語法,提供私有的語法糖;
- 識別出源碼中不符合編碼規範之處,輸出結果來給 linter 顯示(Stylelint);
- 找到並去除冗餘代碼、將代碼壓縮為等價且更短的寫法(cssnano);
- ...
和手寫 CSS 相比,主要優勢很簡單:寫出更短、更標準、更容易維護的代碼。
簡單點講,PostCSS是CSS的處理器。如果你以前使用過CSS的預處理器的話,比如Sass、LESS或者說Stylus。這幾個是使用預編碼來處理CSS,然後編譯成線上需要使用的CSS。而PostCSS剛好相反,他是處理你寫好的CSS,讓你的CSS更健康。可以用一張圖來簡單的描述:
上圖也告訴我們,在這個過程中有很多插件。這些插件就是PostCSS的插件,而且這些插件都是使用JavaScript寫的。言外之意,你可以使用JavaScript基於PostCSS核心的Core上編寫任何你想要的一款功能的插件。也因為這個原因,PostCSS的插件生態圈非常的強大,最常見的就是Autoprefixer、cssnext之類的。當然還有其他的,這也是PostCSS能在社區迅速發展狀大的原因之一。我自己很多時候常把PostCSS的插件生態看作是NPM的生態。這個時候你想想就知道了。
有了PostCSS,我們並不需要拋棄以前所熟悉的Sass或LESS之類的,你的開發模式可以這樣:
我自己也是這樣的一個開發模式,使用Sass先編譯成CSS,然後通過PostCSS對編譯好的 CSS做優化處理。讓自己的代碼更為健康。當然你也可以直接自己基於PostCSS定製一款適合你自己的預處理器。
簡單總結一下:
PostCSS不是什麼
- 儘管表面上它看起來是一個預處理器,其實它不是一個預處理器
- 儘管表面上它看起來是一個後處理器,其實它也不是一個後處理器
- 儘管它可以促進、支持未來的語法,其實它不是未來語法
- 儘管它可以提供清理、優化代碼這樣的功能,其實它不是清理、優化代碼的工具
- 它不是任何一件事情,這也意味者它潛力無限,你可以根據自己的需要配置你需要的功能
PostCSS特別之處
- 多樣化的功能插件,創建了一個生態的插件系統
- 根據你需要的特性進行模塊化
- 快速編譯
- 創建自己的插件,且具可訪問性
- 可以像普通的CSS一樣使用它
- 不依賴於任何預處理器就具備創建一個庫的能力
- 可以與許多流行工具構建無縫部署
它的插件生態系統提供不同的功能
像PostCSS本身一樣令人驚奇的是,它有很多不同的插件,這也是讓PostCSS發光之處。當你看到PostCSS在GitHub上的可用插件列表,你會發現其具有各式各樣的功能。
模塊化
另一方面,PostCSS具有很可用的插件,你可以根據自己所需儘可能使用多的選擇或儘可能少選擇。
如果僅想用PostCSS讓CSS是更有效率和讓瀏覽器更友好的話,載入一些優化插件,你就可以閃人了。
如果僅想用PostCSS作為預處理器的話,使用一些語言擴展插件就OK。
PostCSS的基本原理是粒子化,模塊化。簡而言之,沒有處理多個功能的笨重插件。相反,每創建一個插件,就是一個功能。
可以創建任何自己想要的插件
PostCSS是用JavaScript編寫的插件,這樣只要能編寫JavaScript的就可以創建一個自己想要的插件,達到自己的目的。值得慶幸的是,就算你不是專業的JavaScript開發人員,但使用PostCSS開發插件也就只需要短短的幾個小時,就可以開發出一個全功能的插件。
你可以像使用CSS一樣使用PostCSS
大多數PostCSS插件不需要使用自定義的語法,其實它就是典型的預處理器。相反,它們可以應用常規的CSS語法。這也意味著,你可以使用PostCSS就像是使用CSS一樣。比如說,你要完成一個前端框架,你完全可以使用別人項目中的文件,例如Normalize.css文件。
PostCSS庫不會綁定到一個處理器上
雖然過去他們可能一直使用Stylus、Sass或LESS來編寫一個庫,但我們也開始看到有人通過PostCSS來創建整個庫。
上面是我所知道的一些關於PostCSS的東東。國外有一個系列專門介紹PostCSS:PostCSS Deep Dive: Shortcuts and Shorthand中文:PostCSS_入門 精通 教程_w3cplus 而且互聯網上這方面的教程也非常的多:https://www.google.com/#newwindow=1safe=activeq=postcss+tutorial
另外有一本書專門介紹PostCSS:
這是一本英文書,聽說中文版本很快要上架了。如果喜歡的話,可以關注一下。
希望上述回答能幫你解惑!
官方的解釋已經很通俗了,只不過是拿英文說的,這些功能也就是它的優勢…
PostCSS is a tool for transforming styles with JS plugins. These plugins can lint your CSS, support variables and mixins, transpile future CSS syntax, inline images, and more.…一些對於人來說重複繁瑣的事情讓後處理器幫你做了,例如PostCSS最典型的場景是autoprefixer,你只用寫標準的CSS屬性,自動給你加上-webkit-,-moz-這些。另外可以在CSS實現babel的效果,讓你現在就可以嘗鮮一些CSS next的語法
如果你的項目都是自己的私人小項目 那麼跟手寫css比沒有任何優勢 。
如果是團隊作戰的大項目,工具的優勢就體現出來了 ,科學化的管理代碼會給團隊節省大量的時間。
直接的好處就像各位大神所說 就是不用一個一個加前綴了,但前綴這玩意也就是這幾年瀏覽器標準還沒有定型的時候會用到,以後應該也不會有什麼前綴之類的了,
我的建議是,初學者把精力花在學習css知識本身,至於這些亂七八糟的工具,等你到了公司跟大家一起用就行了,用不著本末倒置的學工具。
當然,如果你硬要學,也是好的,畢竟技多不壓身。但如果你本身該學的都沒學好,就被這些五花八門的工具困擾著,你的心理負擔會很重,也許會耽誤了你吸取真正知識的機會。 總之看你個人了,你覺得好玩你就學,你覺得難受就不要學,畢竟這東西其實沒有你想的那麼重要,因為到了公司你該用什麼自然就會用了。
作為一名前端工程師是有必要學一款CSS處理工具的,這也是個人能力的體現,可以把它放到你學習CSS的最後階段。
說到這裡我突然想到了時尚圈,不是每年都有流行的款式嗎,你一直跟時尚博主的步伐也會樂此不疲,就像今天流行postcss你學postcss 明天流行一個新玩意你又去學那個新玩意。 但經典的款式永遠靜靜的在那裡。
最大的優勢是不用寫一級又一級重複的前綴了
以前寫的,你可以看下,就完全懂了。
https://www.60sky.com/post/postcss-introduce.html
大家幫忙點個贊吧其他答主都說得不錯,但是有一點我不得不指出,那就是對於新手來說,這裡面是有一個認知障礙需要點明的。
新手的思路:
以前,我只需要寫好 CSS,然後刷新頁面,就可以看到效果了。(題目中說到的「手寫」就是指這種所見即所得的感覺)。
現在,這種感覺消失了:「我寫的 CSS 不是我寫的 CSS,而是被一個叫 PostCSS 改過的東西」
這個 PostCSS 存在的意義是什麼?工作原理又是什麼?
我在之前一個所謂「被打臉」的答案里說過,前端應該學 C、編譯原理這些東西,才能理解一些基本的東西。這個題目就是一個例子。
你寫的代碼,不是最終的代碼
學過編譯型語言的人都知道,代碼會被轉化成機器碼或者中間碼,你寫的代碼,不是最終運行在機器上的代碼(二進位)。
而只學的 JS 的人,沒有這種體會。
PostCSS 就是一種類似編譯的過程(應該叫轉譯)。它的目的是讓你的代碼更可靠(Bug更少、兼容性更高甚至功能更強大)。PostCSS 就可以認為是 CSS 的「編譯器」。
PostCSS 的工作原理又是什麼呢
稍微了解過編譯原理的人都知道,代碼在被理解的時候會被轉化成一個結構化的「樹」,也就是抽象語法樹(何為語法樹)。
稍微看一下 PostCSS 的插件開發指南就知道怎麼給它開發插件了:
css.walkRules(function (rule) {
rule.walkDecls(function (decl, i) {
});
});
這不就是在遍歷語法樹嗎?我只需要改變語法樹中的一些節點,就可以得到新的 CSS 語法樹。這個語法樹會生成新的代碼。
再比如 Grunt 是跟 Makefile 一脈相承,Gulp 跟 Shell 里的 pipe 一脈相承。如果你對 Makefile 和 Bash Script 熟的話,理解 Grunt 和 Gulp 就是幾分鐘的事情。
也難為其他幾個答主,只能用 babel 來類比 PostCSS 了。對 JS 世界的人來說,也就只能拿 babel 來舉例了。
所以說,該學的總是要學的。
可以這麼理解,less/sass 與 postcss 的關係就像 coffeescript/typescript 與 babel 的關係。
babel 編譯 es2015+ ,安裝各種插件支持這些語法
postcss 編譯 next css,安裝各種插件支持這些語法
less/sass 編譯自己的語法 -&> css
coffeescript/typescript 編譯自己的語法 -&> js
近來的前端相關問題都出現那個方應杭,回答總是有點酸前端秀優越的感覺,雖然答案有參考價值,但透露出那種小傲嬌真的很可笑看得也不太舒心,容易引戰。
其實不應該問前端來回答這個問題,這個工具明擺著就是給後端開發者用的。因為如果寫個CSS都要用各種工具來輔助的話,這個前端的能力是可想而知的。
PostCSS就是一個腳手架,基於這個腳手架,你可以更輕鬆的開發出各種編譯css的工具。
而針對普通用戶而言,可以自己選擇各種PostCSS插件,來搭建自己的css編譯流程。
比如我所習慣的CSS編譯流程是這樣的:
CSS語法風格檢查&>CSS next語法兼容&>添加私有屬性前綴&>添加IE的HACK&>壓縮
這個流程對應的PostCSS插件插件就是:
stylelint&>cssnext&>autoprefixer&>cssgrace&>cssnano
推薦閱讀:
※airbnb 的 Hypernova 跟已有的 Universal JS 解決方案相比有哪些優勢?
※說說各位轉行做前端的經驗?
※flow.js/typescript 這類定義參數類型的意義何在?
※facebook immutable.js 意義何在,使用場景?
※如果寫一個靜態HTML頁面,直接寫HTML代碼和用JS動態生成代碼,哪種方式要好點?為什麼?
TAG:前端開發 | CSS | JavaScript | 前端工程師 |