CSS 預處理器是什麼?


Posted by GL on 2022-03-06

為什麼要使用 CSS 預處理器

在說明什麼是 CSS 預處理器之前,首先我們來問,為什麼要使用 CSS 預處理器呢? 原生的 CSS 的哪些不便,讓懶惰成性的工程師,願意特地再花時間學習一套語法,勝過寫原生 CSS?

了解脈絡或許不會讓你的高中歷史成績變好(承認吧,當時坐在隔壁的班草 / 班花的確更能引起你的興趣),但知道原因,會讓你用 CSS 預處理時多點心安理得、多點理直氣壯,跟面試官聊起時才不會大眼瞪小眼,然後心裡暗付著,難道就是愛情~

對 CSS 的愛恨糾葛

自從 1996 年 12月,CSS1 發表以來到現在的 CSS3,CSS 一直被認為是定義網頁樣式的屬性與排版等輔助性裝飾功能,其核心機制與語法沒有太大的改變,BUT 看過韓劇的人就知道,事情的發展並非想像中的簡單,往往會朝著意想不到的複雜化發展,你愛的人有可能其實是失散多年的親哥,而從小暗戀著你的隔壁鄰居小明,就算幫你撐傘,替你擋子彈,卻還是拿他的一片真心換來你絕情的背影。CSS 一行行單純的屬性描述,雖然簡單易學易懂,然而,隨著網頁開發的複雜度提高,網頁開發者發現傳統 CSS 有一些問題難以支持大型專案的維護與重製需求,例如:

  1. 遇到大量且相同的樣式要修改,例如文字或顏色等,就要花很多時間使用查找以及取代的功能調整
// 如果老闆突然說要把整個網站中的文字改成紅色的 red,
// 你通常會要一行一行的找出來並取代,
// 但,如果有 100 行 要改呢?
// 又或者 100 行中有 20 行維持原設定 ?

div{
    color: green;
}

p{
    color:blue; 
}
  1. 命名時如果底下還有很多子元素,父元素還是需要重複打出,而且如果以後想要修改父元素名稱,要逐個找出來做調整
.person{
  ...
}

.person .avatar{
  ...
}

.person .name{
  ...
}

.person .address{
  ...
}
  1. 重複的樣式組需要寫多次,無法模組化再利用
// div1 與 div2 有很多重複的屬性,只有 font-size 不同


div1{
 width: 100%;
 heigh: 100%;
 margin: 5px;
 padding: 10px 20px;
 font-size:16px;
}

div2{
 width: 100%;
 heigh: 100%;
 margin: 5px;
 padding: 10px 20px;
 font-size:24px;
}

沒有變數與合理的樣式重複使用機制,以及需要寫很多重複的選擇器等情況降低了 CSS 的開發效率以及維護性,尤其是遇到複雜的專案開發時。

所以,CSS 預處理器是什麼

為了更快更有系統的管理 CSS,有開發者思考若是能讓 CSS 像一般程式語言一樣,有變數、函式、迴圈等功能該有多好。於是有了 CSS 預處理器(CSS Preprocessor)的誕生。

簡單來說,CSS 預處理器就是用另一種特定的語法規則撰寫 CSS,然後再幫你編譯成原生 CSS 檔案,讓瀏覽器可以讀取。

由於 CSS 預處理器是在生成 CSS 之前,所需進行撰寫與編譯,所以才會稱作"預(pre-)"處理


圖片來源

這個方式的好處是,讓開發者透過像是變數(varialbe)、混入(mixin)、繼承(extend)、嵌套(nesting)等常見的程式或邏輯的特性去撰寫 CSS,撰寫出更簡潔、可讀性高、可重複且易於維護的 CSS 程式碼

目前較多人使用相對成熟的 CSS 預處理器有: Sass/Scss、Less、Stylus,功能與語法都差不多,可以依照自己或公司使用習慣選用

由於 CSS 預處理器之後還是會被轉譯為原生 CSS,在瀏覽器中讀取的其實是轉譯後的原生 CSS,所以就算不用 CSS 預處理器直接使用原生的 CSS 也可以,就像手機沒有濾鏡 APP 可以自拍嗎? 當然還是可以拍,只是被打回原形後好不好看,你與網友們能不能接受。

有些人認為,在小型的個人 side project 或者單純的活動案,用原生 CSS 即可,省去建置編譯 CSS 預處理器相關環境的繁瑣;而在開發大型專案或多人協作時,為了管理以及維護的方便性,可以採用 CSS 預處理器。

但要選擇使用哪一套 CSS 預處理器,或是否使用 CSS 預處理器,終究還是要考量自己的熟練度以及公司團隊內部的習慣與規範,評估對此專案更有利的方式。

參考來源:


#css #CSS預處理器 #SASS







Related Posts

BindingAdapter(use in recyclerView)

BindingAdapter(use in recyclerView)

[Note] webpack5 problem: Environment Variable (.env)

[Note] webpack5 problem: Environment Variable (.env)

【文章筆記】簡單介紹前端相關名詞

【文章筆記】簡單介紹前端相關名詞


Comments