99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 作者:紅薯 ? 2022-12-19 11:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

什么是 Web Component?

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

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



 

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

什么是 Shadow DOM?

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

構(gòu)建 Web Component

準(zhǔn)備工作

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

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

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

需要一個(gè)文本編輯器

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

開始

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

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

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

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

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

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


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

npm run dev

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

開發(fā)一個(gè)組件

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

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



{card_title}

{card_desc}

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



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



  


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

importButtonfrom"./Button.svelte";

Click me

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

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

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

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

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

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

npm run build

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

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


  
    My website
    
  

  
    
      
        
          
          
           
        
        
          
             Solid Cool Button 
             Outlined Cool Button 
          
        
      
    
  

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

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

組件分割

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

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

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

Click Me

 

主要缺點(diǎn)

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

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

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

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

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

總結(jié)

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

動(dòng)手試試吧?

審核編輯:湯梓紅

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

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

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

    到當(dāng)前SAXI的MAXI接口創(chuàng)建一個(gè)新的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實(shí)現(xiàn)簡單移植的方法

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

    ADC701簡單方塊圖

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

    簡單方便lockdir_文件加密軟件

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

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

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

    測試IGBT的簡單方

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

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

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

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

    無意中發(fā)現(xiàn)的一個(gè)通過Keil5實(shí)現(xiàn)簡單移植的方法,真的非常簡單方便,再也不用手動(dòng)拖文件了,甚至還有專門的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èi)下載
    發(fā)表于 12-09 16:17 ?0次下載
    使用Bolt<b class='flag-5'>構(gòu)建</b>鬧鐘的最<b class='flag-5'>簡單方</b>法

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

    電子發(fā)燒友網(wǎng)站提供《使用蜂鳴器創(chuàng)建警報(bào)的最簡單方法.zip》資料免費(fèi)下載
    發(fā)表于 12-15 11:05 ?0次下載
    使用蜂鳴器創(chuàng)建警報(bào)的最<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 ?1493次閱讀
    前端框架<b class='flag-5'>Svelte</b>放棄TypeScript,JS贏!

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

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