资讯专栏INFORMATION COLUMN

[譯] Houdini: 你還沒聽說!這可能是 CSS 下一件最令人興奮的大事

bergwhite / 2731人阅读

摘要:接下來我們將會更具體的說明是什麼東西和這傢伙會怎麼解決這些問題,並且列出目前開發中一些令人興奮的功能。這個功能甚至還沒有一個瀏覽器支援。完整的清單請查閱目前還未被寫入規範,意思是這邊提到任何內容極有可能會改變。

譯者:其實...我想說這可能是最令我感到興奮..但又害怕頭痛的功能... 附上原文連結

你曾經想要使用某個 CSS 的新功能,但是最後卻因為這個功能瀏覽器還未全面支援而放棄了嗎?甚至更糟糕的狀況,瀏覽器已經支援了但卻充滿問題。我敢打賭這些情況你肯定遇過了。如果上面這種情形你曾經遇過,那麼你是應該關心一下 Houdini

Houdini 是 w3c 新的任務團隊,他們的終極目標就是解決上面這些問題 - 讓瀏覽器更迅速廣泛的支援 CSS 新特性。這個計畫試圖透過提供一系列新的 API,也是第一次讓開發者可以擴充 CSS 本身的能力。透過 hook 的方式讓我們可以在瀏覽器渲染的過程動點手腳。

Hooks 簡易說明:Hooks 英文翻譯為鉤子,在程式術語中所表達的是在程式特定位置埋入一段預留的程式碼,用來呼叫其他對應的程式碼。可以大略想成在某個片段先空出一個位置,這個位置可以在事後再放入動作,不放也沒關係。

不過具體來說這到底是什麼意思?這麼做真的好嗎?還有這樣做到底能在我們的開發過程提供些什麼幫助。

在這篇文章,我將試著回答這些問題。不過在這之前我們必須要先搞清楚,到底我們在今時今日遇到什麼問題,為什麼我們需要做這些改變。接下來我們將會更具體的說明 Houdini 是什麼東西和這傢伙會怎麼解決這些問題,並且列出目前開發中一些令人興奮的功能。最後我將提供一些比較具體實例的說明。

Houdini 試圖要解決什麼問題?

每一次當我寫了一篇文章來介紹一些 CSS 的新功能時總是會有人留言像是 這實在太棒了! 不過我們可能要再等個 10 年才能使用 我能體會這種毫無建設性的留言....從過往的歷史來看,這的確需要花上好幾年的時間從功能提案到廣泛採用。而其中最關鍵的原因是唯一讓 CSS 增加新功能的方式就是透過下面這個標準流程。

因為瀏覽器本身牽涉太廣泛,對於這樣的流程我本身沒有任何反對意見。當然我們也知道這會耗掉很長的時間。舉例來說 flexbox 首次提案是在 2009 年,而時至今日我們還是見到開發者在抱怨支援的瀏覽器不夠。這個問題正緩慢的解決中,因為幾乎所有的瀏覽器都會自動更新,不過即使是現代瀏覽器(Modern Browser)在功能提案到實際能使用該功能還是有一段挺長的時間。

有趣的是並不是所有 Web 領域的東西都處在這樣的情況,看看最近的 Javascript,為什麼 Javascript 可以發展如此迅速

從上圖這種流程,構想提案到實際用在產品上有時候只需要幾天的時間。例如:我已經在產品上使用了 async/await 的功能。這個功能甚至還沒有一個瀏覽器支援。

你還可以看到兩個社群截然不同的狀況,在 Javascript 社群你可以聽到人們開始在抱怨更新速度太快,而在 CSS 社群則多是看到一堆人在抱怨學那麼多東西沒用,還需要非常久的時間才能使用。

那為什麼我們不可以使用 CSS Polyfills?

看完 Javascript 的流程第一個直覺的想法是那我們也來為 CSS 提供 Polyfills,聽起來可能蠻可行的,如果有 Polyfills 那麼 CSS 也可以像 Javascript 一樣快速的演進,不是嗎?可惜的是,這並不像想的那麼容易,用舊有技術實現新的功能或 API 在 CSS 中異常的困難,在大部分的情況下會整個犧牲掉效能。

Javascript 是一個動態語言,意味著我們相對容易用 Javascript 替 Javascript 補上 Polyfills。對 CSS 來說我們相對很少使用 CSS 來做 Polyfills。一般頂多就是使用轉譯器來產生 CSS 例如 PostCSS 就是這樣的東西。
如果你想直接對 DOM 結構或者元素的 Layout,位置加上 Polyfills,那麼我們就必須要在客戶端執行對應的邏輯程式。

不幸的是瀏覽器對於這方面並不提供任何簡單的方式。

下圖我們簡單的歸納瀏覽器從收到 HTML 文件到顯示在螢幕上概略的流程。藍色區塊就是 Javascript 能夠控制結果的關鍵點

在上圖中我們認知到身為一個開發者,你對於瀏覽器解析 HTML 和 CSS 轉換成 DOM, CSSOM 的過程幾乎沒有控制權,尤其在瀏覽器對元素佈局以及渲染方面。唯一在這個過程中我們能夠掌握的就是 DOM 的存取,是不是該換 CSSOM 做些開放了。不過這邊先提一下 Houdini 網站上提到的改良 CSSOM的部分:確認跨瀏覽器行為不一致以及缺少關鍵功能的問題。

關於缺少關鍵功能部分,舉例來說,瀏覽器中的 CSSOM 並不會顯示跨站存取的樣式規則,而且會直接忽略那些它看不懂的樣式,這也意味著如果你想增加一個瀏覽器未支援的功能,你是不可以使用 CSSOM。反而要用 DOM 去找到