基於 Stencil 構建 Web Components 元件庫

SuperX發表於2022-03-24

「元件化」 一直是前端工程師繞不開的話題,不管是日常業務開發封裝業務元件;還是基礎設施建設開發UI元件或基礎元件;亦或者是 React 、Vue、Angular 等MV*框架,都是秉承著元件作為基礎原子概念,所以可以肯定的是: 元件是下一代 web 技術的發展關鍵

但業界並沒有對元件化有一個準確的定義,都是一些主觀的意識,一般都是以程式模式設計思想裡的“高內聚、低耦合、高擴充套件、可複用”的幾個基本概念來描述,元件內部要保證邏輯的集中和完整,元件外部要提供可擴充套件性api,並且獨立性、簡單可用性要保證。幾個小的元件可層層巢狀,組合成一個大的元件,提供給外部使用,就像搭積木一樣。

前端框架的本質也是進行元件化的抽象,現在前端框架的格局就是第一梯隊三足鼎立、第二梯隊百花齊放,但是歸本溯源,各個框架最後編譯的結果還是迴歸js、css、html,對於「元件」這一概念來說,只是在框架的設計思想上進行一些功能的抽象和程式碼的隔離,那這會帶來什麼問題?

  1. 由於我們前端專案越來越複雜,大型的專案中可能依賴幾十、上百個第三方庫,其中靠程式碼框架上的一些設計進行程式碼隔離,多多少少還是會出現一些適配性的衝突,比如DOM操作的衝突、樣式CSS的衝突等。
  2. 越來越多公司的專案,為了適應新技術或者提升效率,不得不進行了技術棧的遷移,或者老專案新專案並存、微前端的引入等等,來融合不同的框架或者框架的版本到一個頁面中。如 Vue2.x 升級到Vue3.x,則導致封裝的基礎元件和業務元件都面臨著不可用的狀況。
  3. 公司各個專案技術棧的不同,為了提高效率,封裝元件的時候不得不去適配各個框架,比如一個業務元件就需要適配Vue、React技術棧,造成開發基礎元件成本比較高。

圖為 2021 前端框架top5

為了解決這些問題,我們需要一套完備的元件系統,來提高 前端 的開發效率,減少重複勞動,這才是符合前端提效、穩定的發展趨勢。在此情況下,各種解決方案應運而生,而 Web Components 是其中關鍵性的一環。

那麼,使用 Web Components 帶來了哪些改變?我們來舉個?。

以前:

A:我造了一個Vue3的輪子,是關於身份資訊卡片的。

B:正好,我需要我試試。wtf 是vue3的啊,我vue2用不了。

C:好可惜,我是react框架,也用不了。

D:啊!我是angular,也用不了!

E:老jq專案能不能用?

F:我引入了,但是和我目前專案的邏輯衝突了!

假如基於 Web Components 構建:

A:我造了一個Web Components的輪子,是關於身份資訊卡片的,引入標籤就能用了。

B:正好,我需要我試試,好像可以,用起來好簡單!

C:我是react框架,沒問題。

D:啊!我是angular,沒問題,也完美!

E:老jq專案能不能用?能啊 nice!

F:我引入了,完美,無衝突。

那麼,到底什麼是 Web Components?

什麼是 Web Components?

Web Components 提供了基於原生支援的、對檢視層的封裝能力,可以讓單個元件相關的 javaScript、css、html模板執行在以html標籤為界限的區域性環境中,不會影響到全域性,元件間也不會相互影響 再簡單來說:就是提供了我們自定義標籤的能力,並且提供了標籤內完整的生命週期

Google 一直在推動瀏覽器原生元件規範「Web Components API」的發展,元件化的概念既然作為下一代發展的趨勢,那麼Google 肯定不會缺席。早在 Google I/O 2017 Polymer 就升級到了 2.0 版本,而這次升級的最主要意義就是將 Shadow Dom 和 Custom Elements 升級到 v1 版本,從而獲得更多瀏覽器支援下一 代 Web Components 規範,時隔4年,各大瀏覽器廠商自然是紛紛跟進。目前支援情況如下:

Web Components 可以將元件化的概念直接應用到瀏覽器可以識別的 html 標籤上,就比如我們開發html 頁面常用的 <video /> <aduio/> 標籤;它可以將一個單一模組所內聚的邏輯、UI層聚合到一個標籤,並且相互進行天然的隔離,而且它提供一些生命週期的鉤子給開發者呼叫。Web Components實現以上的種種特性,是因為三個核心的技術,它們分別是:

  • Custom elements:自定義元素

通過 CustomElementRegistry 來自定義可以直接渲染的html元素,並提供了元件的生命週期connectedCallback、disconnectCallback、attributeChangedCallback 等提供給開發者聚合邏輯時使用。

  • Shadow DOM :隱式DOM

「影子DOM」 或 「隱式 DOM」,顧名思義,他具有隱藏屬性,具體的意思就是說,在使用Shadow DOM的時候,元件標籤內的 CSS 和 HTML 會完全的隱式存在於元素內部,在具體頁面中,標籤內部的HTML 結構會存在於#shdaow-root,而不會在真實的dom樹中出現。

  • HTML template: HTML模板

它的特性是用 template 標籤包裹的元素不會立即渲染,只有在內容有效的時候,才會解析渲染,具有這個屬性後,我們可以在自定義標籤中按需新增我們需要的模板,並在自定義標籤渲染的時候再去解析我們的模板,這樣做可以在 HTML 有頻繁更改更新任務,或者重寫標記的時候非常有用。

我們來做一個 Web Components 特性簡單的總結

  • 「標準統一」瀏覽器支援的底層api。
  • 「靈活多變」可用於封裝基礎、業務元件。
  • 「無侵入」以標籤隔離、不會侵入業務程式碼、元件間不會相互影響。
  • 「清晰」簡單直接、不依賴外部模組、程式碼體積小。

看起來 Web Components 可以嘗試解決由框架帶來的基礎元件不適配問題、複雜應用帶來的元件定義衝突問題。並且得到了chrome 的支援和積極推動,順應前端的發展潮流,是個不錯的選擇。

而且 Web Components 在移動化趨勢的浪潮中,隱隱地向大前端方向滲透,跨端和跨框架實現的複用漸漸都是以元件的形式推動發展,所以我感覺 Web Components 的思想不單單是在web端,在多端開發領域也會有一定的影響。

所以這就是我選擇 Web Components 來深入研究和應用的原因,順應前端的時代的發展必將乘風破浪、水漲船高。

國外對於新技術的應用和探索一直領先我們,希望國內的小夥伴們也快速認識到趨勢,並可以把前端的新思想,新趨勢帶入到業務中,提升研發效率,得到正向的反饋。同時也多多貢獻自己的想法和輪子,提升中國前端在世界的影響力。

下一章:初識 Web Components 與 Stencil

相關文章