」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用 Java 和 Spring Boot 建立 PWA:離線功能的最佳實務?

如何使用 Java 和 Spring Boot 建立 PWA:離線功能的最佳實務?

發佈於2024-08-24
瀏覽:187

How to Build a PWA with Java and Spring Boot: Best Practices for Offline Functionality?

我目前正在進行一個勞動力管理項目,其中的關鍵要求之一是確保即使用戶的設備暫時離線也可以訪問某些功能(例如打卡)。雖然這種情況很少見,但我希望透過根據需要啟用額外的離線功能來確保應用程式面向未來。

使用案例:

  • 後端: Java 與 Spring Boot
  • 前端: Thymeleaf 與 HTMX(或可能的 Vaadin Flow)
  • 關鍵要求: 能夠快取 POST 請求並在離線時導航到快取頁面。

我正在考慮的技術:

  1. 帶有 Thymeleaf 和 HTMX 的 Spring Boot: 我的首選堆疊。我喜歡使用 TDD 進行構建,這種組合非常符合我的經驗。我已經使用 service-worker.js 建立了一個小演示項目來快取和重新發送 POST 請求。我不確定這是否是將來繼續添加離線功能的最佳選擇。

  2. Vaadin Flow: 我對 Vaadin Flow 很感興趣,因為它非常注重完全用 Java 建立業務應用程式。但是,我擔心它支援離線功能的能力,因為它會動態更新視圖。據我了解,這將使得無法快取整個頁面以供離線查看。我知道 Hilla,但我需要在 Typescript 中建立所有視圖,在我看來,這違背了使用 Vaadin 的目的。

  3. PWA Starter: 我研究了PWA Starter,但它似乎專注於用Angular 或React 等語言創建單頁應用程序(SPA),這不符合我的偏好留在Spring Boot 生態系中。

  4. Quarkus 或 JHipster: 我也考慮過 Quarkus 和 JHipster,但 JHipster 通常使用 Angular 或 Vue 作為前端,看來我對此不是很感興趣。我正在尋找以獲得更接近 Java 全端方法的東西。 Quarkus好像主打微服務?

問題:

  1. 在 Java 和 Spring Boot 應用程式中整合 PWA 功能(特別是離線功能)的最佳實踐或框架/工具是什麼?例如,也許有一個可以幫助服務人員的工具?
  2. 有沒有辦法透過離線快取有效地使用 Vaadin Flow,或者我應該堅持使用 Thymeleaf 和 HTMX 以更好地控制 Service Worker?
  3. 您是否建議在 Spring Boot 和 Thymeleaf 設定中實作 Service Worker 的任何特定資源、函式庫或模式?

考慮到我傾向於留在 Java 生態系統中並避免添加重要的新前端技術,我正在尋求有關如何解決此問題的建議。我確信還有很多問題我沒有考慮過。任何見解或建議將不勝感激!

回顧我嘗試過的事情

  • 我透過寫自己的 Service Worker 建構了一個示範。很好,但我不確定我能走多遠。
  • 我嘗試了 Vaadin Flow,但後來意識到任何離線功能都需要 Typescript 和 Hilla。
  • 我開始關注 FlutterFlow,但這似乎是針對用戶設備離線的這種邊緣情況做出的重大設計決策。
版本聲明 本文轉載於:https://dev.to/livenathan/how-to-build-a-pwa-with-java-and-spring-boot-best-practices-for-offline-functionality-4l3k?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    在ASP.NET async void void async void void void void void的設計無需返回asynchroncon而無需返回任務對象。他們在執行過程中增加未償還操作的計數,並在完成後減少。在某些情況下,這種行為可能是有益的,例如未期望或明確預期操作結果的火災和...
    程式設計 發佈於2025-07-20
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-07-20
  • 在C#中如何高效重複字符串字符用於縮進?
    在C#中如何高效重複字符串字符用於縮進?
    在基於項目的深度下固定字符串時,重複一個字符串以進行凹痕,很方便有效地有一種有效的方法來返回字符串重複指定的次數的字符串。使用指定的次數。 constructor 這將返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.W...
    程式設計 發佈於2025-07-20
  • 為什麼HTML無法打印頁碼及解決方案
    為什麼HTML無法打印頁碼及解決方案
    無法在html頁面上打印頁碼? @page規則在@Media內部和外部都無濟於事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: ...
    程式設計 發佈於2025-07-20
  • Java中假喚醒真的會發生嗎?
    Java中假喚醒真的會發生嗎?
    在Java中的浪費喚醒:真實性或神話? 在Java同步中偽裝喚醒的概念已經是討論的主題。儘管存在這種行為的潛力,但問題仍然存在:它們實際上是在實踐中發生的嗎? Linux的喚醒機制根據Wikipedia關於偽造喚醒的文章,linux實現了pthread_cond_wait()功能的Linux實現,...
    程式設計 發佈於2025-07-20
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-07-20
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] 剩餘_size- = buf_size lines = buffer.split('\ n'....
    程式設計 發佈於2025-07-20
  • 在JavaScript中如何並發運行異步操作並正確處理錯誤?
    在JavaScript中如何並發運行異步操作並正確處理錯誤?
    同意操作execution 在執行asynchronous操作時,相關的代碼段落會遇到一個問題,當執行asynchronous操作:此實現在啟動下一個操作之前依次等待每個操作的完成。要啟用並發執行,需要進行修改的方法。 第一個解決方案試圖通過獲得每個操作的承諾來解決此問題,然後單獨等待它們: c...
    程式設計 發佈於2025-07-20
  • 解決MySQL插入Emoji時出現的\\"字符串值錯誤\\"異常
    解決MySQL插入Emoji時出現的\\"字符串值錯誤\\"異常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    程式設計 發佈於2025-07-20
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-07-20
  • 同實例無需轉儲複製MySQL數據庫方法
    同實例無需轉儲複製MySQL數據庫方法
    在同一實例上複製一個MySQL數據庫而無需轉儲在同一mySQL實例上複製數據庫,而無需創建InterMediate sqql script。以下方法為傳統的轉儲和IMPORT過程提供了更簡單的替代方法。 直接管道數據 MySQL手動概述了一種允許將mysqldump直接輸出到MySQL cli...
    程式設計 發佈於2025-07-20
  • 為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    在CSS 問題:不正確的代碼: 全球範圍將所有餘量重置為零,如提供的代碼所建議的,可能會導致意外的副作用。解決特定的保證金問題是更建議的。 例如,在提供的示例中,將以下代碼添加到CSS中,將解決餘量問題: body H1 { 保證金頂:-40px; } 此方法更精確,避免了由全局保證金重置...
    程式設計 發佈於2025-07-20
  • 哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    程式設計 發佈於2025-07-20
  • 如何在GO編譯器中自定義編譯優化?
    如何在GO編譯器中自定義編譯優化?
    在GO編譯器中自定義編譯優化 GO中的默認編譯過程遵循特定的優化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    程式設計 發佈於2025-07-20
  • PHP SimpleXML解析帶命名空間冒號的XML方法
    PHP SimpleXML解析帶命名空間冒號的XML方法
    在php 很少,請使用該限制很大,很少有很高。例如:這種技術可確保可以通過遍歷XML樹和使用兒童()方法()方法的XML樹和切換名稱空間來訪問名稱空間內的元素。
    程式設計 發佈於2025-07-20

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

Copyright© 2022 湘ICP备2022001581号-3