0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Svelte來構(gòu)建Web Component(超簡單方便)

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 作者:紅薯 ? 2022-12-19 11:39 ? 次閱讀

每個開發(fā)人員都應(yīng)該關(guān)注代碼中的可重用性以及代碼的業(yè)務(wù)隔離,這樣可以讓業(yè)務(wù)邏輯與應(yīng)用架構(gòu)分離,提升系統(tǒng)的擴(kuò)展性。而 Web Component 就是這樣一個技術(shù),可以讓我們創(chuàng)建一個獨立的可重用組件。

本文將介紹使用 Svelte 創(chuàng)建通用的 Web Component 的完成過程。『通用』指的是該組件不局限于 Svelte 應(yīng)用,還可以用于任何 JavaScript 應(yīng)用程序(如 Vue、React 等),同時還將介紹使用 Svelte 創(chuàng)建 Web Component 的一些局限性。

什么是 Web Component?

Web Component 可以讓我們創(chuàng)建可重用的、自定義的封裝了樣式以及功能的 HTML 元素。

例如,我們使用如下代碼來創(chuàng)建一個導(dǎo)航條:



 

如果用 Web Component 技術(shù),我們可以定義一個自定義元素(如 ),然后你可以在網(wǎng)頁任一地方使用該元素顯示導(dǎo)航條,同時這個導(dǎo)航條的樣式和頁面其他元素的樣式是完全隔離的,不會相互影響。而這項技術(shù)被稱之為 Shadow DOM (影子 DOM)。

什么是 Shadow DOM?

Shadow DOM 是一個較小的、獨立的 DOM,它與主 DOM 分開渲染,允許我們將樣式和標(biāo)記行為隔離到單個組件中。Shadow DOM 本質(zhì)上允許我們將組件功能進(jìn)行封裝和隔離,我們可以單獨對其設(shè)置樣式、編寫功能腳本,而不會干擾應(yīng)用程序的其余元素。
你大概對 Web Component 有一個基本的認(rèn)識,下面我們開始用 Svelte 來編寫一個簡單的組件。

構(gòu)建 Web Component

準(zhǔn)備工作

為了完成本文剩余的內(nèi)容學(xué)習(xí),需要你對掌握以下知識:

對 HTML, CSS 和 JavaScript 有基本的認(rèn)識

熟悉命令行操作環(huán)境

需要一個文本編輯器

最好對 Svelte 有一些基本的了解(可以看看我之前翻譯的文章https://my.oschina.net/javayou/blog/5309554)

開始

本文我們將開發(fā)兩個組件:

第一個組件是一個卡片組件,接收三個屬性分別是:卡片標(biāo)題、卡片描述以及圖片,該組件名為

第二個組件是一個帶樣式的按鈕,接收一個type的屬性,通過該屬性來確定按鈕的顯示樣式,組件名稱為

同時我們將使用兩種組件的發(fā)布方式,一個是打包到單一文件,另外一個是每個組件發(fā)布到一個獨立的文件中。

下圖顯示的是兩個組件運行后的外觀:
ad515cfe-7df7-11ed-8abf-dac502259ad0.png
我們從創(chuàng)建一個 Svelte 應(yīng)用開始,并安裝必須的包:

npx degit sveltejs/template web-component-tut
cd web-component-tut
npm install


上述命令執(zhí)行完畢就可以使用如下命令啟動一個測試環(huán)境:

npm run dev

然后我們打開瀏覽器訪問http://localhost:8080就可以看到一個最基礎(chǔ)的 Svelte 應(yīng)用運行起來后的樣子:
ad73f21e-7df7-11ed-8abf-dac502259ad0.png

開發(fā)一個組件

使用 Svelte 生成通用 Web Component 的過程類似于創(chuàng)建常規(guī) Svelte 組件的過程,只是進(jìn)行了一些修改。

為了創(chuàng)建第一個卡片組件,我們首先創(chuàng)建一個文件src/Card.svelte并定義組件的屬性、樣式以及 HTML 標(biāo)簽,代碼如下:



{card_title}

{card_desc}

你可以在其他組件中使用這個卡片組件,如下所示(這一步可忽略):



接下來是按鈕組件,文件名/src/Button.svelte代碼如下:



  


該組件的使用方法如下(可忽略):

importButtonfrom"./Button.svelte";

Click me

將自定義組件轉(zhuǎn)成通用組件

我們需要將自定義 Svelte 組件轉(zhuǎn)成通用的 Web Component ,這樣才可以在其他框架中直接使用。

要做這個轉(zhuǎn)換操作,我們需要在 Svelte 配置文件中設(shè)置讓編譯器生成自定義元素。打開rollup.config.js在 plugins 增加一個compilerOptions配置項,在該配置項下增加customElement: true配置信息,如下所示:

...
 plugins:[
    svelte({
      compilerOptions:{
        dev:!production,
        customElement:true,
...
然后我們需要給兩個組件分別定義一個元素名稱,打開Card.svelte文件,在文件開頭第一行插入如下內(nèi)容:
上述tag屬性值代表組件的標(biāo)簽名稱。

同樣的,打開 Button.svelte 給第二個組件指定一個標(biāo)簽名稱:
最后一步是在main.js中引入這兩個組件,打開/src/main.js將里面的內(nèi)容替換成如下兩行:
importButtonfrom"./Button.svelte";
importCardfrom"./Card.svelte";

這里我們已經(jīng)完成了兩個組件的開發(fā)步驟,下一步就是打包組件以便其他的應(yīng)用可以使用這兩個組件,打開命令行窗口進(jìn)入項目所在目錄執(zhí)行如下命令:

npm run build

該命令將生成兩個文件,分別是build.js和build.map.js, 文件位于項目下的/build目錄。其中build.js是打包的兩個組件,而build.map.js是build.js源代碼映射文件。

如果上述步驟順利完成,我們就可以將bundle.js拷貝到一個新目錄,然后創(chuàng)建一個index.html文件,內(nèi)容如下:


  
    My website
    
  

  
    
      
        
          
          
           
        
        
          
             Solid Cool Button 
             Outlined Cool Button 
          
        
      
    
  

這是一個再簡單不過的 HTML 頁面了,該頁面使用了上述兩個組件,在瀏覽器中顯示為如下效果:

ad903c9e-7df7-11ed-8abf-dac502259ad0.png

組件分割

在某些情況下我們不需要將多個組件打包到同一個 js 文件中,我們希望每個組件有一個獨立的 js 文件。要實現(xiàn)這個場景只需在rollup.config.js的input 和 output 中進(jìn)行配置即可。

在 input 的配置中我們可以指定一個數(shù)組,數(shù)組的元素就是每個組件的文件路徑,而 output 指定為輸出的目錄即可:

exportdefault{
  input:["src/Card.svelte","./src/Button.svelte"],
  output:{
    format:"iife",
    dir:"public/build/",
  },
...
修改完成后再次執(zhí)行npm run build,我們就可以在 build 目錄中看到兩個文件Button.js和Card.js。
使用方法類似:

Click Me

 

主要缺點

到這里我們已經(jīng)掌握了使用 Svelte 開發(fā) Web Component 的方法,這個過程非常之簡單,但是,使用 Svelte 開發(fā) Web 組件會有一些缺點如下:

組件的屬性名稱不允許使用駝峰命名法,例如你會發(fā)現(xiàn)使用形如 cardTitle 這樣的屬性名就無法正常工作,而駝峰命名法又是 JavaScript 推薦的命名風(fēng)格。這是一個 Bug,不過如果你使用的是 Vite ,那么有一個workaround plugin可以解決這個問題。

如果不標(biāo)記 Web 組件,就無法在 Svelte 中重用它們 - 不幸的是,您還必須標(biāo)記要在自定義 Web 組件中使用的每個 Svelte 組件

加入你有一個Header.svelte文件需要作為組件輸出,但同時這個組件又依賴另外一個Nav.svelte文件,而 Nav.svelte 我們不希望作為 Web 組件輸出,這個問題使得我們必須將 Nav.svelte 也作為組件輸出,否則程序就會報錯。好在這個問題現(xiàn)在也有解了(詳情請看https://github.com/svelte-society/recipes-mvp/issues/41#issue-638005462),我們可以通過配置來解決這個問題,雖然看起來不是那么的爽,就這樣吧,又不是不能用。

瀏覽器的支持問題 — JavaScriptcustomElementAPI 就是用來創(chuàng)建 Web Component 的底層 API,該 API 目前并沒有被所有的瀏覽器支持,我們需要引入 Polyfill 來解決這個文件,詳情請看https://github.com/webcomponents/polyfills/tree/master/packages/custom-elements。

總結(jié)

在本文中,我們學(xué)習(xí)了如何使用 Svelte 創(chuàng)建通用卡片和按鈕組件,生成捆綁文件,拆分它們,甚至在單獨的 HTML 頁面中重用此組件。

動手試試吧?

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴

原文標(biāo)題:使用Svelte來構(gòu)建Web Component (超簡單方便)

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    簡單方便的電話視免打擾電路設(shè)計

    簡單方便的電話視免打擾電路設(shè)計筆者利用家中壞電熱毯的調(diào)溫開關(guān)改制了一電話機(jī)免打擾電路,其結(jié)構(gòu)簡單,改制容易,現(xiàn)將改制方法介紹如下。 [hide][/hide]
    發(fā)表于 12-17 10:48

    使用MAXI接口的最簡單方法是什么?

    到當(dāng)前SAXI的MAXI接口創(chuàng)建一個新的axi_lite組件,然后通過新組件處理外部請求。如果是這樣,開始使用MAXI接口的最簡單方法是什么?以上來自于谷歌翻譯以下為原文I have an XADC
    發(fā)表于 11-02 11:32

    將新庫添加到Petalinux rootfs的最簡單方法是什么

    嗨,將新庫添加到Petalinux rootfs的最簡單方法是什么?1>如何將預(yù)編譯的庫添加到rootfs,這將在petalinux-config -c rootfs中檢測到2>如何將源代碼添加到petalinux并在rootfs配置中進(jìn)行構(gòu)建和編譯。
    發(fā)表于 05-22 08:32

    通過Keil5實現(xiàn)簡單移植的方法

    無意中發(fā)現(xiàn)的一個通過Keil5實現(xiàn)簡單移植的方法,真的非常簡單方便,再也不用手動拖文件了,甚至還有專門的rtos調(diào)試工具可以用。
    發(fā)表于 11-30 08:03

    ADC701簡單方塊圖

    ADC701簡單方塊圖
    發(fā)表于 06-27 15:49 ?565次閱讀
    ADC701<b class='flag-5'>簡單方</b>塊圖

    簡單方便lockdir_文件加密軟件

    電子發(fā)燒友網(wǎng)站提供《簡單方便lockdir_文件加密軟件.exe》資料免費下載
    發(fā)表于 08-26 20:21 ?1次下載

    FLIR手機(jī)熱像儀體驗:簡單方便 小巧易用

    這款FLIR ONE PRO熱像儀可以算得上是一款家中日常必備的小工具, 它簡單方便、小巧易用,能夠?qū)崿F(xiàn)大多數(shù)熱像儀的功能。它可以說是跟激光尺、螺絲刀一樣,雖然不常用,但是在用的時候卻是能夠幫大忙
    發(fā)表于 12-24 09:42 ?2467次閱讀
    FLIR手機(jī)熱像儀體驗:<b class='flag-5'>簡單方便</b> 小巧易用

    測試IGBT的簡單方

    一些測試IGBT的簡單方
    的頭像 發(fā)表于 06-19 10:19 ?1.5w次閱讀

    多功能醫(yī)療臺車給人帶來舒適感,操作簡單方便

    多功能醫(yī)療臺車設(shè)計以功能為主體,通過人機(jī)分析研究充分考慮體積與功能的關(guān)系,采用可折疊式結(jié)構(gòu)和易維護(hù)的結(jié)構(gòu),整體簡單大氣,顏色搭配造型都體現(xiàn)了專業(yè)度,給人帶來舒適感,操作簡單方便。 考慮到醫(yī)療產(chǎn)品的特殊性,醫(yī)
    發(fā)表于 05-17 15:11 ?852次閱讀

    一種簡單的FreeRTOS移植方法——2021.03

    無意中發(fā)現(xiàn)的一個通過Keil5實現(xiàn)簡單移植的方法,真的非常簡單方便,再也不用手動拖文件了,甚至還有專門的rtos調(diào)試工具可以用。
    發(fā)表于 11-21 19:06 ?10次下載
    一種<b class='flag-5'>超</b><b class='flag-5'>簡單</b>的FreeRTOS移植方法——2021.03

    svelte-intellij Svelte的IDEA插件

    ./oschina_soft/svelte-intellij.zip
    發(fā)表于 05-18 14:25 ?1次下載
    <b class='flag-5'>svelte</b>-intellij <b class='flag-5'>Svelte</b>的IDEA插件

    使用Bolt構(gòu)建鬧鐘的最簡單方

    電子發(fā)燒友網(wǎng)站提供《使用Bolt構(gòu)建鬧鐘的最簡單方法.zip》資料免費下載
    發(fā)表于 12-09 16:17 ?0次下載
    使用Bolt<b class='flag-5'>構(gòu)建</b>鬧鐘的最<b class='flag-5'>簡單方</b>法

    使用蜂鳴器創(chuàng)建警報的最簡單方

    電子發(fā)燒友網(wǎng)站提供《使用蜂鳴器創(chuàng)建警報的最簡單方法.zip》資料免費下載
    發(fā)表于 12-15 11:05 ?0次下載
    使用蜂鳴器創(chuàng)建警報的最<b class='flag-5'>簡單方</b>法

    前端框架Svelte放棄TypeScript,JS贏!

    負(fù)責(zé) Svelte 編譯器的開發(fā)者則說道,改用 JSDoc 后,代碼不需要編譯構(gòu)建即可進(jìn)行調(diào)試 —— 簡化了編譯器的開發(fā)工作。畢竟目前的調(diào)試工作比較復(fù)雜,需要使用構(gòu)建步驟進(jìn)行調(diào)試。
    的頭像 發(fā)表于 05-11 10:39 ?1231次閱讀
    前端框架<b class='flag-5'>Svelte</b>放棄TypeScript,JS贏!

    前端UI框架Svelte 4正式發(fā)布

    的支持,這就需要發(fā)布一個 CJS 構(gòu)建,一旦 eslint 重寫完成,Svelte 的軟件包大小可以再下降 50% 以上。
    的頭像 發(fā)表于 06-25 15:44 ?564次閱讀
    前端UI框架<b class='flag-5'>Svelte</b> 4正式發(fā)布