Web Components介紹(一)

Web Components介紹(一)

在前端快速發(fā)展的今天,組件貫徹著我們開發(fā)的方方面面湿酸,不管是針對業(yè)務封裝的業(yè)務組件,還是項目中依賴的第三方基礎 UI 組件(Ant Design菩掏、Element鲫竞、Vuetify...),亦或是依賴的前端框架(Angular铲觉、Vue澈蝙、React...),它們都貫徹著「組件化」的概念撵幽。

[組件化]開發(fā)已然成為前端主流開發(fā)方式灯荧,現(xiàn)在流行的 Vue、React盐杂、Angular等框架都是組件框架逗载。[組件化]在代碼復用、提升效率方面存在巨大優(yōu)勢链烈,因此厉斟,可以認為:組件化是前端發(fā)展的未來

1.什么是Web Components?

Web Components是一套不同的技術强衡。

可以通過它創(chuàng)建可重用的自定義元素擦秽,并在Web應用中使用這些元素。Web Components是一個瀏覽器原生支持的組件化方案,允許創(chuàng)建新的自定義感挥、可封裝的HTML標簽缩搅,在使用時,不需要加載任何額外的模塊触幼,不需要依賴任何第三方框架硼瓣,可以跨現(xiàn)代瀏覽器工作,并可與任何支持 HTML 的 JavaScript 庫或框架一起使用置谦。

簡單理解: Web Components 是一套技術巨双,允許創(chuàng)建可重用的自定義元素

Web Components目的很明確霉祸,從原生層面實現(xiàn)組件化,使開發(fā)者開發(fā)袱蜡、復用丝蹭、擴展自定義組件,實現(xiàn)自定義標簽坪蚁。

Web Components意味著前端開發(fā)人員開發(fā)組件時可以實現(xiàn) Write once, run anywhere奔穿。

2.如何使用Web Components?

這里演示定義一個Hello World組件敏晤,網(wǎng)頁只要插入下面代碼贱田,就會在頁面顯示Hello World組件

<hello-world></hello-world>

完整代碼,test-01.html

<!DOCTYPE html>

<html>
    <head><title>test-01</title></head>
    <body>
        <h4>test-01</h4>

        <!-- 這里使用自定義的web components -->
        <hello-world></hello-world>

        <!-- 自定義web components視圖樣式 -->
        <template id="testTemplate01">
            <style>
                #title {
                  color: red;
                }
            </style>
            <span id="title">Hello Web Components !</span>
        </template>

        <script>

            // web components定義 需要繼承HTMLElement類
            class HelloWorld extends HTMLElement {
                constructor() {
                    super();
                    // 獲取頁面上的template
                    const template = document.querySelector('#testTemplate01');
                    // 克隆節(jié)點嘴脾,防止該組件被多處使用時男摧,修改了一處,其他地方也跟著變化
                    // 參數(shù)true表示遞歸克隆子元素
                    const content = template.content.cloneNode(true);
                    this.appendChild(content);
                }
            }

            window.onload = () => {
                // 注冊web components
                window.customElements.define('hello-world', HelloWorld);
            };
        </script>
    </body>
</html>

使用瀏覽器打開test-01.html译打,頁面展示如下

image-20230104162630720.png

上面示例定義了一個簡單的Hello World組件耗拓,使用過Vue的同學會覺得上面的寫法似曾相識,但它并沒有使用第三方框架奏司,完全使用瀏覽器原生API完成乔询。

相較于Vue、React韵洋、Angular 等框架定義的組件竿刁,web components擴展性更好,不會因為Vue2.x變更到Vue3.x導致組件不能使用搪缨。

對上面的API做一些說明:

  1. <template>標簽

    <template>標簽用于定義web components的內容和樣式食拜,<template>包裹的元素不會立即渲染,只有在內容有效的時候勉吻,才會解析渲染监婶,具有這個屬性后,我們可以在自定義標簽中按需添加我們需要的模板,并在自定義標簽渲染的時候再去解析我們的模板惑惶,這樣做可以在 HTML 有頻繁更改更新任務煮盼,或者重寫標記的時候非常有用。

  2. customElements.define()函數(shù)

    自定義元素需要使用 JavaScript 定義一個類带污,并且繼承HTMLElement僵控,這樣一來,自定義元素便繼承了HTML元素的特性鱼冀,然后使用瀏覽器原生的customElements.define()函數(shù)报破,告訴瀏覽器<hello-world>標簽與自定義類關聯(lián)

    window.customElements.define('hello-world', HelloWorld);
    

更多API說明可以到官網(wǎng)查閱Web Components API

3.Web Components如何應用于生產(chǎn)?

上面的示例只是一個簡單的演示千绪,如果要應用于生產(chǎn)還有許多額外的知識需要進行學習充易,例如綁定事件,使用插槽荸型,動態(tài)數(shù)據(jù)綁定等盹靴。

不過,大部分情況下我們并不需要使用原生API創(chuàng)建Web Components瑞妇,因為代碼量相對較大稿静,市面上已經(jīng)出現(xiàn)了很多庫,可以更加輕松的使用和構建Web Components辕狰。

  • Polymer :Google推出的Web Components庫改备,支持數(shù)據(jù)的單向和雙向綁定,兼容性較好蔓倍,跨瀏覽器性能也較好悬钳;提供了一組用于創(chuàng)建 custom elements 的功能。這些功能旨在使custom elements 像標準 DOM 元素一樣工作更容易和更快柬脸。

  • X-Tag: 是微軟推出的開源庫他去,支持Web Components規(guī)范,兼容Web Components API倒堕。

  • Stencil: 是一個用于構建可重用灾测、可擴展的設計系統(tǒng)的工具鏈。生成可在每個瀏覽器中運行的小型垦巴、極快且100%基于標準的Web Components媳搪。

  • hybrids: 是一個 JavaScript UI 框架,用于創(chuàng)建功能齊全的 Web 應用程序骤宣、組件庫或具有獨特的混合聲明性和功能性架構的單個Web Components秦爆。

  • LitElement: 是一個簡單的基類,用于使用lit-html創(chuàng)建快速憔披、輕量級的Web Components等限。

[Polymer] start最多(21.9k)爸吮,而且有大廠支持,是一個不錯的選擇望门。

下一篇文檔將演示如何使用[Polymer]創(chuàng)建Web Components

4.前端發(fā)展方向

Web Components已經(jīng)被很多大廠直接或者間接地用于實踐形娇,比如:Twitter、YouTube筹误、Electronic Arts桐早、Adobe Spectrum等。

有些同學可能會產(chǎn)生疑問厨剪,現(xiàn)在的前端框架不是挺好的嗎哄酝?為什么還需要Web Components?

最大的原因在于Web Components是建立在Web標準之上。

雖然現(xiàn)在許多前端框架組件都很不錯祷膳,用起來也很方便陶衅,但它們只在自己的生態(tài)系統(tǒng)中很不錯。但你不能(輕松)在 React 中使用 Angular 組件直晨,也不能(輕松)在 React 中使用 Vue 組件万哪。而Web Components 建立在Web標準之上,它可以在所有生態(tài)系統(tǒng)中工作抡秆,這是第三方框架無法比擬的優(yōu)勢。

最后吟策,如果說組件化是前端的未來儒士,那么Web Components便是組件化的未來

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市檩坚,隨后出現(xiàn)的幾起案子着撩,更是在濱河造成了極大的恐慌,老刑警劉巖匾委,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拖叙,死亡現(xiàn)場離奇詭異,居然都是意外死亡赂乐,警方通過查閱死者的電腦和手機薯鳍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挨措,“玉大人挖滤,你說我怎么就攤上這事∏骋郏” “怎么了斩松?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長觉既。 經(jīng)常有香客問我惧盹,道長乳幸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任钧椰,我火速辦了婚禮粹断,結果婚禮上,老公的妹妹穿的比我還像新娘演侯。我一直安慰自己姿染,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布秒际。 她就那樣靜靜地躺著悬赏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娄徊。 梳的紋絲不亂的頭發(fā)上闽颇,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音寄锐,去河邊找鬼兵多。 笑死,一個胖子當著我的面吹牛橄仆,可吹牛的內容都是我干的剩膘。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼盆顾,長吁一口氣:“原來是場噩夢啊……” “哼怠褐!你這毒婦竟也來了?” 一聲冷哼從身側響起您宪,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤奈懒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宪巨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磷杏,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年捏卓,在試婚紗的時候發(fā)現(xiàn)自己被綠了极祸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡怠晴,死狀恐怖贿肩,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情龄寞,我是刑警寧澤汰规,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站物邑,受9級特大地震影響溜哮,放射性物質發(fā)生泄漏滔金。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一茂嗓、第九天 我趴在偏房一處隱蔽的房頂上張望餐茵。 院中可真熱鬧,春花似錦述吸、人聲如沸忿族。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽道批。三九已至,卻和暖如春入撒,著一層夾襖步出監(jiān)牢的瞬間隆豹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工茅逮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留璃赡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓献雅,卻偏偏與公主長得像碉考,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挺身,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容