」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 Svelte 創建獨立小部件:我的旅程和解決方案

使用 Svelte 創建獨立小部件:我的旅程和解決方案

發佈於2024-08-19
瀏覽:267

在過去的幾個月裡 在過去的幾個月裡,我的任務是確定如何為我的全職工作編寫和管理獨立的小部件。雖然確保它們正常運作相對簡單,但我很快就意識到維護它們完全是一個不同的挑戰

考慮到這一點,我在業餘時間開始了一個業餘專案並將其開源。這使我能夠分享我的見解和策略,幫助我確保小部件的品質。

我最初是怎麼做的?

由於我的小部件需要高水準的反應性,因此我嚴重依賴 Svelte 元件 API 並使用 Rollup 進行捆綁。 「這很簡單直接,直到我遇到了以下問題:

  • 隨著時間的推移,我未使用的 CSS 不斷增加,而且我也不確定是否只捆綁了所需組件的 CSS。

  • 如果沒有嚴格的輸入,很難透過小部件處理 JavaScript。由於我不得不分享一些像 jwt 解碼和身份驗證這樣的實用程序,它很快就變得一團糟。

我怎麼改的呢?

我開始考慮如何建立一些預設值,更重要的是,整合一個類型系統。這導致了我的業餘專案 svelte-standalone 的創建。

svelte-standalone 的目標是:

  • 確保 CSS 壓縮良好,並在捆綁時刪除未使用的 CSS。
  • 確保選擇的類型系統在我的所有應用程式上得到良好支援和重複使用。

注意:選擇的類型系統是 TypeScript。

  • 確保單元和整合測試。
  • 確保我可以在匯總解析之前和之後直觀地檢查我的小部件。

我是如何實現這一切的?

在確保 TypeScript 與 Rollup 插件和 Svelte 預處理器的兼容性之後,我退後一步,將我的專案分解為關鍵步驟。基本上我有:

  1. A .svelte.
  2. 一個 embed.js 文件,負責啟動 .svelte 文件的實例並將其新增至 body。

從此我注意到我的嵌入檔案基本上是在我所有小部件上複製的預設檔案並開始生成它們。因此,我能夠使用 codegen 工具根據我的精簡文件和我在整個應用程式中處理類型的願望生成 3 個文件:

  1. declaration.d.ts - 讓我可以直接導入我的 svelte 元件並使用 SvelteComponent 類型包裝它,因此我預設將我的 svelte 元件轉為強型別。
  2. types.ts - 使我可以根據declaration.d.ts.
  3. 聲明的道具編寫defaultConfig
  4. embed.ts - 以標準方式為我的所有小部件啟用我的組件的啟動/停止!

瞧!這種方法解決了我的類型系統問題並提高了我的小部件的可維護性。

我該如何應對 CSS 挑戰:

我面臨的與 CSS 相關的主要挑戰是:如何輕鬆地清除和縮小 CSS?如何撰寫既易於協作又易於整合到不同環境中的 CSS?

解決方案非常簡單:只需使用 Tailwind CSS。
Creating Standalone Widgets with Svelte: My Journey and Solutions

透過這個方法,我發現了以下好處:

  • 不再有衝突的樣式:使用 Tailwind 讓我不再擔心樣式衝突。例如,在處理嚴重依賴 Bootstrap 的遺留應用程式時,我只需向我的小部件應用一個前綴和一個重要標誌,衝突就得到了解決。

  • 無縫整合:當我的小部件匯入另一個 Tailwind 應用程式時,我可以輕鬆省略某些 Tailwind 指令以減少我的套件大小。

  • 輕鬆清除和縮小:縮小變得簡單,使用 Tailwind 的內建 PurgeCSS,我只需要為每個小部件正確配置內容標誌。這確保了最終捆綁包中僅包含必要的樣式。

我如何解決測試問題?

我在確保對我的小部件進行全面測試方面面臨挑戰,包括單元測試、整合測試和視覺化測試。

我的主要目標是在使用 Rollup 處理元件之前和之後將它們視覺化。為了實現這一目標,我採取了以下步驟:

  • 嚴格類型故事書:我根據我的declaration.d.ts和types.ts文件實現了嚴格類型故事書。這使得自動為我的每個小部件產生預設故事變得很方便。

  • Vite整合:我使用Vite在Svelte路由上載入捆綁的元件。基於我的 TypeScript 檔案產生預設路由元件也很方便。

僅此而已!我衷心感謝一些回饋!另外,請查看 svelte-standalone。

無論您有疑問、建議還是疑慮,請隨時與我聯絡!

版本聲明 本文轉載於:https://dev.to/brenoliradev/how-to-create-widgets-using-svelte-1gep?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-03-12
  • Beyond Type Safety:TypeScript運行時選擇器深度解析
    Beyond Type Safety:TypeScript運行時選擇器深度解析
    [2 嘿,在开始之前,让我澄清一下:虽然我会谈论我的软件包,但 ts-runtime-picker ,这不是促销文章。我只是在分享自己的经验以及在构建之前所经历的旅程。 (,但是嘿,如果您很好奇,这是指向软件包的链接?)。 typescript如何使我成为一个新的想法(和一个软件包...
    程式設計 發佈於2025-03-12
  • 為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    網格超過身體,用100%grid-template-columns 為什麼在grid-template-colms中具有100%的顯示器,當位置設置為設置的位置時,grid-template-colly修復了? 問題: 考慮以下CSS和html: class =“ snippet-code”> ...
    程式設計 發佈於2025-03-12
  • 為什麼我的CSS @font-face在Firefox中失敗(以及如何修復它!)
    為什麼我的CSS @font-face在Firefox中失敗(以及如何修復它!)
    CSS @font-face不在Firefox 本地文件uri policy 問題如果發布該站點並且存在問題,則可能需要考慮一個潛在的交叉點問題。即使在代碼中指定了相對路徑,建議在.htaccess文件中添加一個附加標頭:此標頭應防止任何潛在的跨域限制。此外,可以將base64編碼用於字體字...
    程式設計 發佈於2025-03-12
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    程式設計 發佈於2025-03-12
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-03-12
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-03-12
  • Vue.js框架選型指南:適合你的下一個項目嗎?
    Vue.js框架選型指南:適合你的下一個項目嗎?
    Vue.js:輕量級、靈活且易於上手的JavaScript框架 Vue.js憑藉其漸進式特性和易於集成性,成為小型和大型項目的理想選擇。它在視圖切換方面提供流暢的過渡效果,提升用戶體驗,非常適合動畫和交互元素豐富的應用。 Vue.js 的主要優勢: 易於集成: Vue.js 非常適合構建單頁應...
    程式設計 發佈於2025-03-12
  • C#字符串比較:String.Equals()和==何時等效?
    C#字符串比較:String.Equals()和==何時等效?
    C# 字符串比較的困惑:String.Equals() 方法和 == 運算符是否可互換? 在 C# 中,字符串比較有時會產生令人意外的結果。一個常見的問題是 String.Equals() 方法和 == 等號運算符的行為是否完全相同。 考慮以下代碼片段: string s = "Categor...
    程式設計 發佈於2025-03-12
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-03-12
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-03-12
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, attributeError:SomeClass實...
    程式設計 發佈於2025-03-12
  • 如何區分GO結構中的默認值和顯式設置零值?
    如何區分GO結構中的默認值和顯式設置零值?
    默認值並區分GO ,原始類型具有默認值。例如,整數(int)初始化為0。但是,在使用structs時,區分0值和非初始化字段可能具有挑戰性。 導入“日誌” 類型測試結構{ testintone int testinttwo int } func main(){ S:= te...
    程式設計 發佈於2025-03-12
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    程式設計 發佈於2025-03-12
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月份)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP...
    程式設計 發佈於2025-03-12

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3