天天看點

Spring Boot 修改靜态資源一定要重新開機項目才會生效嗎?未必!

Spring Boot 修改靜态資源一定要重新開機項目才會生效嗎?未必!

回顧熱部署

Spring Boot 中的熱部署相信大家都用過吧,隻需要添加 spring-boot-devtools 依賴就可以輕松實作熱部署。Spring Boot 中熱部署最最關鍵的原理就是兩個不同的 classloader:

base classloader

restart classloader

其中 base classloader 用來加載那些不會變化的類,例如各種第三方依賴,而 restart classloader 則用來加載那些會發生變化的類,例如你自己寫的代碼。Spring Boot 中熱部署的原理就是當代碼發生變化時,base classloader 不變,而 restart classloader 則會被廢棄,被另一個新的 restart classloader 代替。在整個過程中,因為隻重新加載了變化的類,是以啟動速度要被重新開機快。

但是有另外一個問題,就是靜态資源檔案!使用 devtools ,預設情況下當靜态資源發生變化時,并不會觸發項目重新開機。雖然我們可以通過配置解決這一問題,但是沒有必要!因為靜态資源檔案發生變化後不需要編譯,按理說儲存後重新整理下就可以通路到了。

那麼如何才能實作靜态資源變化後,不編譯就能自動重新整理呢? LiveReload 可以幫助我們實作這一功能!

LiveReload

devtools 中預設嵌入了 LiveReload 伺服器,利用 LiveReload 可以實作靜态檔案的熱部署,LiveReload 可以在資源發生變化時自動觸發浏覽器更新,LiveReload 支援 Chrome、Firefox 以及 Safari 。以 Chrome 為例,在 Chrome 應用商店搜尋 LiveReload ,結果如下圖:

将第一個搜尋結果添加到 Chrome 中,添加成功後,在 Chrome 右上角有一個 LiveReload 圖示

在浏覽器中打開項目的頁面,然後點選浏覽器右上角的 LiveReload 按鈕,打開 LiveReload 連接配接。

注意:

LiveReload 是和浏覽器頁籤綁定在一起的,在哪個頁籤中打開了 LiveReload,就在哪個頁籤中通路頁面,這樣才有效果。

打開 LiveReload 之後,我們啟動一個加了 devtools 依賴的 Spring Boot 項目:

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>           

此時随便在 resources/static 目錄下添加一個靜态 html 頁面,然後啟動 Spring Boot 項目,在打開了 LiveReload 的頁籤中通路 html 頁面。

通路成功後,我們再去手動修改 html 頁面代碼,修改成功後,回到浏覽器,不用做任何操作,就會發現浏覽器自動重新整理了,頁面已經更新了。

整個過程中,我的 Spring Boot 項目并沒有重新開機。

如果開發者安裝并且啟動了 LiveReload 插件,同時也添加了 devtools 依賴,但是卻并不想當靜态頁面發生變化時浏覽器自動重新整理,那麼可以在 application.properties 中添加如下代碼進行配置:

spring.devtools.livereload.enabled=false

最佳實踐

建議開發者使用 LiveReload 政策而不是項目重新開機政策來實作靜态資源的動态加載,因為項目重新開機所耗費時間一般來說要超過使用LiveReload 所耗費的時間。

Firefox 也可以安裝 LiveReload 插件,裝好之後和 Chrome 用法基本一緻,這裡不再贅述。

原文位址

https://www.cnblogs.com/lenve/p/11325041.html