前言
通過本文,您將瞭解什麼是Web components,以及如何將其落地到業務場景的最佳實踐。
一、初識(什麼是Web components)
在 html5 提供的video元件實現上採用了Shadow DOM技術,Shadow DOM 技術是Web Components 核心套件之一,還有像input、select 也都採用了這個技術,具體什麼是Shadow DOM 會在下文中給出解釋。
二、實踐
基於業務,我們先看一個訂單卡片的視覺稿:
用Web Components實現,程式碼展示如下:
這裡涉及到Web Components的三大技術套件
- Template: 利用 Template 生成 DOM;
- Shadow DOM:利用Shadow DOM 來隔離CSS樣式;
- Custom Elements: 利用Custom Elements 來自定義元素,繼承自HTMLElement,HTMLElement 是 DOM API 裡面的一個類,繼承該類就有了html 的常見屬性和 API,利用Custom Elements 來自定義元素;
Template 和 Custom Elements 都比較好理解,那什麼是 Shadow DOM 呢?
你可以簡單理解為Shadow DOM 是一個獨立的沙箱,與其它的DOM元素互不干擾,能天然做到 CSS 的樣式隔離!類似於 Vue 中帶 Scoped 的 style 標籤,它不會干擾其它標籤樣式。
下面我們來看下更具象的 <order-card />
元件程式碼:
目前元件的內容是寫死的,該怎麼動態生成DOM呢?我們繼續往下看:
答案就是藉助 Web Components
元件的生命週期來做,其中 connectedCallback
就是 dom
節點首次掛載呼叫,且只會呼叫一次,在這裡可以拿到外部傳入的屬性。屬性變更會呼叫 attributeChangedCallback
, 在這裡可以做 dom 更新相關的事情,這裡不在展開,大家可以自行探索下。
dom
能動態生成了,點選事件怎麼玩?
其實和大家平時寫 Vue
元件、React
元件一樣,在 Vue
中是 @click
,在 React
中是 onClick
,具體示例可參考下圖:
好了,基本知識點先講到這裡。這就是 Web Components!
三、總結
Web Components 具有如下特點:
其應用場景也比較豐富:
元件庫
舉例:國內已有實踐 WCs 的是 Taro v3 版本,下面是官網截圖:
跨端
舉例:跨端的含義是一套 Web Components 元件既可以跑在 Web 上也可以跑在小程式上,跑在 Web 上,那是 Web Components 天然支援的,跑在小程式上的一個可行的方案可以參考下 Taro 3.x。
其基本原理是在 Taro runtime 提供了一套模擬 DOM & BOM 的 API,React & Vue 最終呼叫的API會被對映到 taro runtime 模擬的那一套 API,然後 Taro runtime 在模擬的API內部做微信小程式相關元件和API的呼叫。目前國內騰訊開源的 omi-mp 就實現跨端,感興趣的可以看一下。
微前端
微前端的幾個基本要素: 技術棧無關、應用隔離、獨立開發。目前 Web Components 都符合,因此理論上用 Web Components 做微前端也是可行的。
四、做點什麼
既然我們知道了 WCs 這麼牛逼,那我們能用它來為我們們業務做點什麼呢?
??? 小故事一則:
在9月初,我們業務中臺前端團隊在和數科團隊共建 Vue 元件庫,當時正好我們的產品經理提出要重構訂單,會涉及到React、Vue兩個技術棧的多個工程。
因此我們萌生了尋找一套能夠跨技術棧的元件解決方案,在9月份的時候,我們組一邊在和數科共建 Vue 2.x 元件庫、一邊在探索跨技術元件的可能性。
在經過不斷探索後,我們利用業務開發 Buffer 時間,沉澱了一套基於 Web Components 技術的跨技術棧元件庫!
下面向大家隆重介紹,我們的作品Quark:官網請點選
用資料說話,下圖是 Quark 在業務的落地情況,目前為止,Quark 已經可以承受住 40w+ pv 工程,且監控資料表明執行情況良好。
- 【體積小】比輕更輕,Quark cdn 總包大小為 20k!
- 【跨技術棧】支援 Vue、React、Angular 等各類框架/無框架
- 【質量高】19+ 高質量元件
- 【按需載入】支援按需引用
- 【文件全】詳盡的文件和示例
- 【單測】單元測試覆蓋
- 【TS】支援 TypeScript
- 【SSR】支援服務端渲染
- 【主題】支援定製主題
打勾部分文章已發內網論壇!
以上。