網(wǎng)絡(luò)技術(shù)的快速發(fā)展,帶來(lái)了層出不窮的新概念和框架,尤其是在前端開(kāi)發(fā)領(lǐng)域,新技術(shù)的出現(xiàn)如同浪潮般一波接一波,例如 Vue3 和 Vite 的組合。而在這種技術(shù)快速更新的環(huán)境中,Web Components 作為一項(xiàng)已經(jīng)存在一段時(shí)間的技術(shù),為什么仍然值得我們深入學(xué)習(xí)和探討呢?
---- 文章的篇幅可能較長(zhǎng),借助目錄效果更好。
Web Components 是由 W3C 推動(dòng)的標(biāo)準(zhǔn)化技術(shù),它得到了包括 Chrome、Firefox、Safari 和 Edge 在內(nèi)的主流瀏覽器的廣泛支持。不僅 Vue3 的更新就包括了對(duì) Web Components 的原生支持,現(xiàn)在面試也問(wèn) Web Components 話題,尤其是頻頻出現(xiàn) Shadow DOM。
這項(xiàng)技術(shù)的魅力在于,它允許開(kāi)發(fā)者創(chuàng)建自定義、可重用的元素,這些元素可以在任何符合標(biāo)準(zhǔn)的 Web 應(yīng)用中無(wú)縫使用,而不受限于特定的框架(React、Vue)。如果你還對(duì) Web Components 比較陌生,那么現(xiàn)在是時(shí)候開(kāi)始了解這項(xiàng)技術(shù)了。
Web Components 核心概念
Web Components 是一種瀏覽器原生支持的 Web 組件化技術(shù),它允許開(kāi)發(fā)者創(chuàng)建可重用的自定義元素,并且可以在任何支持 Web Components 的瀏覽器中使用。
image.png
Web Components 包括以下幾個(gè)核心概念:
Custom Elements(自定義元素):允許開(kāi)發(fā)者創(chuàng)建新的 HTML 元素,并且可以定義它的行為和樣式。
到這里為止,便實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的 Web Components,詳細(xì)代碼見(jiàn)CustomElements[1]。
生命周期回調(diào)方法
Custom Elements 也有一組生命周期回調(diào)方法(到這里是不是感覺(jué) Web Component 就像 Vue、React似得,怎么還有生命周期?),這些方法在元素的不同生命周期階段被調(diào)用。這些生命周期方法允許你在元素的創(chuàng)建、插入文檔、更新和刪除等時(shí)刻執(zhí)行操作。
當(dāng) my-custom-element 被插入到 DOM 中時(shí),connectedCallback 會(huì)被調(diào)用。如果元素被從 DOM 中移除,disconnectedCallback 會(huì)被調(diào)用。如果元素的 my-attribute 屬性發(fā)生變化,attributeChangedCallback 會(huì)被調(diào)用。
注意:監(jiān)聽(tīng)的同時(shí),也記得停止監(jiān)聽(tīng)。比如說(shuō)你可能需要在元素連接到 DOM 時(shí)開(kāi)始監(jiān)聽(tīng)事件,但是在元素?cái)嚅_(kāi)連接時(shí)停止監(jiān)聽(tīng),避免內(nèi)存泄漏。
Shadow DOM(影子 DOM)
下面我們將繼續(xù)探討 Shadow DOM,它是 Web Components 的核心特性之一。
Shadow DOM
Shadow DOM 允許開(kāi)發(fā)者創(chuàng)建一個(gè)封閉的 DOM 子樹(shù),這個(gè)子樹(shù)與主文檔的 DOM 分離,這意味著 Shadow DOM 內(nèi)部的樣式和結(jié)構(gòu)不會(huì)受到外部的影響,也不會(huì)影響到外部。
Web Components 是一組用于構(gòu)建可復(fù)用組件的技術(shù),包括 Custom Elements, Shadow DOM, HTML Templates 等。這些技術(shù)的出現(xiàn),使得開(kāi)發(fā)者能夠更好地組織,去開(kāi)發(fā)復(fù)雜的網(wǎng)頁(yè)應(yīng)用。然而,由于這些技術(shù)相對(duì)較新,不同瀏覽器的支持情況不盡相同,因此兼容性問(wèn)題也是我們需要重點(diǎn)關(guān)注的方向。
Custom Elements
image.png
Shadow DOM
image.png
HTML Templates
image.png
從上面可以看出,現(xiàn)階段市場(chǎng)上大部分的瀏覽器已經(jīng)都原生支持了 Web Components 的規(guī)范標(biāo)準(zhǔn)。但是如果說(shuō)出現(xiàn)了兼容性問(wèn)題,我們應(yīng)該怎么處理?
Polyfills
對(duì)于舊版瀏覽器不支持的兼容性情況,可以考慮使用 polyfill 來(lái)實(shí)現(xiàn)兼容性。Polyfills 是一種代碼注入技術(shù),使得瀏覽器可以支持新的標(biāo)準(zhǔn) API。對(duì)于不支持 Web Components 的瀏覽器,我們可以用 Polyfills 讓這些瀏覽器可以支持 Web Components。
這里我們可以用到 webcomponents.js[5] 庫(kù),它可以實(shí)現(xiàn)兼容 Custom Elements、Shadow DOM 和 HTML Templates 標(biāo)準(zhǔn),讓我們?cè)陂_(kāi)發(fā)時(shí)不必考慮兼容性問(wèn)題。
npm install @webcomponents/webcomponentsjs
<!-- load webcomponents bundle, which includes all the necessary polyfills --> <scriptsrc="node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
<!-- load the element --> <scripttype="module"src="my-element.js"></script>
<!-- use the element --> <my-element></my-element>
具體配置詳情,見(jiàn)polyfills webcomponents[6]。
React 與 Vue
相信大家也比較關(guān)心 Web Components 與現(xiàn)有框架(如 React、Vue)相比有哪些優(yōu)勢(shì)?以及各自適用場(chǎng)景?
首先,Web Components 是一組 Web 平臺(tái) API,允許開(kāi)發(fā)者創(chuàng)建可重用的自定義元素,而無(wú)需依賴于任何特定的框架。與現(xiàn)有的前端框架,Web Components 有以下幾個(gè)優(yōu)勢(shì):
標(biāo)準(zhǔn)化:Web Components 是基于 Web 標(biāo)準(zhǔn)(如 Custom Elements、Shadow DOM 和 HTML Templates)構(gòu)建的,這意味著它們得到了瀏覽器廠商的直接支持,而不依賴于任何特定的庫(kù)或框架。
svelte + vite 開(kāi)發(fā) Web Components[9]:通過(guò) svelte + vite 快速搭建 web components 的項(xiàng)目。
使用 Polymer 構(gòu)建 Web Components[10]:用于構(gòu)建 Web Component,它提供了一套工具和 API,能夠更容易地創(chuàng)建自定義元素。
參考資料
**MDN Web Docs - Web Components 入門(mén)**[11]
你不知道的 Web Components - 現(xiàn)狀[12]
自定義元素 v1 - 可重復(fù)使用的網(wǎng)絡(luò)組件[13]
Web Components Tutorial for Beginners \[2019\][14]
總結(jié)
Web Components 是 W3C 推動(dòng)的標(biāo)準(zhǔn)化技術(shù),它通過(guò)自定義元素的方式,允許開(kāi)發(fā)者在瀏覽器中直接使用。這種技術(shù)通過(guò) Shadow DOM 實(shí)現(xiàn)了組件化 DOM 隔離和樣式隔離,確保了組件的獨(dú)立性和可重用性,這些特性被現(xiàn)有很多借鑒和使用。