回顧熱部署
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 項目:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
此時隨便在 resources/static 目錄下添加一個靜態 html 頁面,然后啟動 Spring Boot 項目,在打開了 LiveReload 的選項卡中訪問 html 頁面。
訪問成功后,我們再去手動修改 html 頁面代碼,修改成功后,回到瀏覽器,不用做任何操作,就會發現瀏覽器自動刷新了,頁面已經更新了。
整個過程中,我的 Spring Boot 項目並沒有重啟。
如果開發者安裝並且啟動了 LiveReload 插件,同時也添加了 devtools 依賴,但是卻並不想當靜態頁面發生變化時瀏覽器自動刷新,那么可以在 application.properties 中添加如下代碼進行配置:
spring.devtools.livereload.enabled=false
最佳實踐
建議開發者使用 LiveReload 策略而不是項目重啟策略來實現靜態資源的動態加載,因為項目重啟所耗費時間一般來說要超過使用LiveReload 所耗費的時間。
Firefox 也可以安裝 LiveReload 插件,裝好之后和 Chrome 用法基本一致,這里不再贅述。
關注公眾號【江南一點雨】,專注於 Spring Boot+微服務以及前后端分離等全棧技術,定期視頻教程分享,關注后回復 Java ,領取松哥為你精心准備的 Java 干貨!