點燈坊

失くすものさえない今が強くなるチャンスよ

為什麼我喜歡 TailwindCSS ?

Sam Xiao's Avatar 2020-11-03

很多 Developer 都不喜歡 CSS,我也不例外,但直到 TailwindCSS 出現,讓我對 CSS 完全改觀,重拾對 UI 熱情。

Version

TailwindCSS 2.1.1

Traditional CSS

我一直很不喜歡傳統 CSS,有幾點原因:

  • 由於 CSS 與 HTML 分離,讓我不能只由 HTML 得知結果,還必須搭配 CSS,經常還須觀察 browser 才知道結果如何
  • 由於 CSS 常搭配複雜的 selector,也很難簡單由 CSS 得知結果,最後還是得藉由 browser 才知道結果如何
  • 由於 CSS 需搭配 selector 對應,因此需要為 class 命名想破頭,且若 UI 修改,需不斷對照 HTML 與 CSS 來回對應,降低開發效率
  • 由於 CSS 是以 cascading 設計,實務上會不斷覆蓋 CSS,導致經年累月後 CSS 越來越大,且大部分 CSS 都是無效的,徒然增加 file size 而已
  • 由於 CSS 是以多 selector 決定,當 selector 衝突時,還必須考慮其 precedence,非常複雜
  • 由於一個 selector 可能對應多處 element,實務上很難重構 CSS,因為 side effect 太大了

CSS Framework

CSS 雖然功能強大,卻也非常繁瑣,因此很多 developer 改用 CSS framework 的 component 加快開發速度,但也面臨不少挑戰:

  • Component 格式太制式,很難高度客製化
  • 若要客製化必須使用 CSS 覆蓋方式,常會面臨 precendence 問題
  • 一開始開發速度很快,但最後客製化維護又將省下時間吐回來

Functional CSS

Tailwind CSS 則以 Functional Programming 理念設計,完全顛覆傳統 CSS 與 CSS framework:

  • CSS 由眾多 utility 構成,可以想像成 FP 的 pure function
  • 自行在 HTML 組合 utility,由 HTML 就可得知結果,不需透過 browser
  • 不使用 selector,因此沒有 precedence 問題
  • 從複雜 selecor 解放,CSS 退化成自行組合 utility 成新的 utility,也可使用 @apply 從 utility 再組合成 utility,類似 FP 組合小 function 成新 function 一樣
  • 由於 utility 顆粒很小,因此很容易自行組合客製化,沒有 CSS framework 的 component 因顆粒太大而難以客製化問題
  • 由於不覆蓋 CSS,也沒有 CSS 越來越大問題,還可使用 PurgeCSS 將沒用到 CSS 移除,大幅降低 file size
  • 不再為 class 命名煩惱,utility 直接描述 element
  • 由於 utility 直接描述 element 沒有 side effect,可以大膽重構 CSS

Conclusion

  • Functional CSS 的另一個優點是其思考模式與 FP 相同,都是透過最小化問題並搭配 Function Composition,不會因 JavaScript 與 CSS 思維差異而造成人格分裂
  • 此外 Tailwind CSS 的命名也比較人性化,CSS 雖然是簡單的 key / value 設計,但其 key 與 value 常使用過長單字難以記憶,而 Tailwind CSS 則將 key / value 簡化成雙單字的 utility,也符合一般 JavaScript 使用習慣
  • 實務上也證明使用 Tailwind CSS 刻 UI 開發效率遠高於傳統 CSS,又比 CSS framework 容易客製化