以前,咱們在 SitePoint 上屢次特刊了 PostCSS 內容,但它仍是難倒了不少人。一句話總結 PostCSS:
css
PostCSS 處理了不少你沒必要處理的乏味工做node
它很巧妙的不一樣於預處理器,提供了可選的且更簡潔的編程語言,來編譯成 CSS,如 Sass、Less 與 Stylus。得出這個結論的部分緣由是:git
然而,雖然你能夠構建本身的預處理器,但除非你想限制功能並加快編譯速度,你沒有別的該這麼作的理由。就我我的而言,爲加強 CSS,我使用 Sass,再加以 PostCSS 輔佐。github
PostCSS 能在獨立的 JavaScript 文件中使用,也能在 Gulp,Grunt,Broccoli,Brunch 還有不少我都沒聽過的任務運行器中使用web
PostCSS 自己只負責將 CSS 解析爲 JavaScript 對象與詞元(token)。那些檢查、修改、添加或修改屬性與屬性值的插件的魔法發生在寫最終 CSS 文件以前。npm
爲了在 Gulp 中使用 PostCSS,你須要創建你的項目並安裝兩個模塊:編程
npm init npm install --save-dev gulp gulp-postcss複製代碼
而後,你能夠繼續添加你須要的插件,如: autoprefixer 與 cssnano。gulp
npm install --save-dev autoprefixer cssnano複製代碼
你能夠建立一個 gulpfile.js 文件。它定義了一個任務,加載 CSS 源文件而後經過 PostCSS 管道。插件以及任意所需的其它選項以一個數組傳給 PostCSS。最終,CSS 文件被輸出至目標文件。api
// Gulp.js 配置var gulp = require('gulp'), postcss = require('gulp-postcss');// 應用 PostCSS 插件gulp.task('css', function() { return gulp.src('src/main.css') .pipe(postcss([ require('autoprefixer')({}), require('cssnano') ])) .pipe(gulp.dest('dest/main.css')); });複製代碼
在控制檯,可以使用下面的命令運行該任務:數組
gulp css複製代碼
如今咱們只差一份方便的 PostCSS 插件列表了。
若是你不用其它插件,安裝 Autoprefixer。
npm install --save-dev autoprefixer複製代碼
隨着瀏覽器對規範的支持愈來愈好,供應商選擇替代方案如基於標記的屬性使能,特定瀏覽器前綴如 -webkit-、 -moz- 以及 -ms- 正逐漸消亡。不幸的是,你還沒法避免使用供應商前綴,但你很難知道哪些前綴是一直須要的(例如 user-select),哪些是偶爾須要的(例如 3D 轉換),哪些是從不須要的(例如 border-radius)。
有了 Autoprefixer,你再也不須要擔憂前綴選擇了。你只須要定義無前綴的 CSS,而後聲明你想支持的瀏覽器,Autoprefixer 將在添加必要前綴時查詢檢查 caniuse.com。下面的代碼指定了任意主流瀏覽器最新的 2 個版本,或者任何市場佔有率超過了 2% 的瀏覽器:
.pipe(postcss([ require('autoprefixer')({browsers: ['last 2 versions', '> 2%'] }) ]))複製代碼
在預處理器的庫函數中,這是一個高級選項,要求特殊的編碼方式,且會在任意狀況下都應用供應商前綴。隨着瀏覽器標準的進化,在將來運行 PostCSS 時,你添加了前綴的代碼將會被移除。
Autoprefixer 很是有用並廣爲流暢,可能你已經正在使用它卻沒有意識到它是一個 PostCSS 插件。
PostCSS Assets 提供了不少實用的圖像處理函數:
npm install --save-dev postcss-assets複製代碼
它的選項包括:
cssnext 讓你如今就能使用最新的 CSS 語法。
npm install --save-dev postcss-cssnext複製代碼
這個插件有份很長的特性列表,包括:
當它執行時,cssnext 會將代碼翻譯成如今的瀏覽器支持的語法。
Rucksack 提供了不少函數,它的開發者宣稱,它們會使 CSS 開發再次有趣起來。
npm install --save-dev rucksack-css複製代碼
它的選項包括:
Stylelint 基於 140 個規則報錯,這些規則被設計用來捕獲常見錯誤,實現樣式協議並強制最佳實踐。有不少選項可用來依你的喜愛配置 Stylelint —— Pavels Jelisejevs 的文章使用 PostCSS 提高你的 CSS 質量帶你走過搭建過程。
MQPacker 在必要時會將你的媒體查詢成一個規則:
npm install --save-dev css-mqpacker複製代碼
預處理器如 Sass 能在一個聲明裏使用媒體查詢,很簡單,如:
.widget1 { width: 100%; @media (min-width: 30em) { width: 50%; } @media (min-width: 60em) { width: 25%; } } .widget2 { width: 100px; @media (min-width: 30em) { width: 200px; } }複製代碼
這會編譯成:
.widget1 { width: 100%; }@media (min-width: 30em) { .widget1 { width: 50%; } }@media (min-width: 60em) { .widget1 { width: 25%; } }.widget2 { width: 100px; }@media (min-width: 30em) { .widget2 { width: 200px; } }複製代碼
爲了減少文件大小以及(儘量)提高解析時間,MQPacker 會將多個聲明打包到一個 @media 規則中,也就是:
.widget1 { width: 100%; }.widget2 { width: 100px; }@media (min-width: 30em) { .widget1 { width: 50%; } .widget2 { width: 200px; } }@media (min-width: 60em) { .widget1 { width: 25%; } }複製代碼
可靠情報:確保你的代碼中第一個媒體查詢聲明按照你所想的順序定義了全部可能的選項,即便沒有實際的不一樣。這能保證 MQPacker 會以正確的順序定義規則。
MQPacker 也提供了選項來排序媒體查詢與輸出 sourcemap。
cssnano 會壓縮你的 CSS 文件來確保在開發環境中下載量儘量的小。經過下面的命令安裝它:
npm install --save-dev cssnano複製代碼
這個插件經過移除註釋、空白、重複規則、過期的瀏覽器前綴以及作出其餘的優化來工做,通常能減小至少 50% 的大小。還有不少其它選擇,但 cssnano 是其中最好的一個。使用它!
postcss.parts 上提供了可搜索的 PostCSS 插件索引, PostCSS 使用文檔 也提供了建議的選項列表。幾乎任何你能想到的 CSS 工做都能找到插件,但注意存在的交叉與重複的問題 —— 例如,cssnext 也包括 Autoprefixer。
若是那還不夠的話,你還能夠用 JavaScript 開發你本身的 PostCSS 插件。PostCSS 文檔講解了如何寫一個插件並提供了一份參考 API。
無論你是否使用預處理器,PostCSS 都使得 CSS 開發變得更簡單了。它節省的 CSS 開發時間比爲最初的安裝與配置付出的努力重要多了。