昨天在部署項目時遇到一個問題,因為服務要部署到外網使用,中間經過了較多的網絡傳輸限制,而且要加載arcgis等較大的文件,所以在部署后,發現頁面loading需要很長時間,而且刷新也要重新從服務器下載文件。這當然是不能忍受的,即使在不考慮文件大小的情況下,我們也希望我們的靜態文件如js, css, json, img等,可以在刷新的時候盡量不重新加載,這樣我們的頁面會變得更有效率即使在網絡不好的狀況下。
那么問題來了:
我們如何在刷新瀏覽器時,使自己的項目中的任何可控靜態文件,被瀏覽器緩存?
就簡單說下我的思路和經歷:(聲明,作為一名前端,有些理解可能是跑偏的,歡迎指點。
另文章有引用看到的不錯知識的連接,傳送門走起~
文中的很多思考,后端可以略過不看,因為我對后台有很多不確定性
如果你只是想迅速知道結果,請看直達第五條后面)
1.當我獲得這個需求后,我的第一個想法是從服務器端或者偏后台的的方向去尋求解決方法。但是由於我們作為一名前端開發者,我們總要先檢查自己的前端是否可以完成,以及放在那一部分較好。很遺憾,前端好象對此無能為力(如果你有,歡迎指點)。此時,我們基本確定了自己需要研究的方向。
2.最簡單的方式,打開百度,我們獲得的第一類相關信息為SpringMVC 配置靜態資源緩存,基本思路是通過在web.xml中配置filter,還需要通過Tomcat容器進行一些過濾配置。一篇關於Tomcat下MVC靜態資源強緩存配置的文章~,很遺憾,SpringBoot並不支持這種在web.xml中配置過濾器,顯然這不是我們需要的。
3.但我們至少縮小了我們的范圍,繼而我發現了頁面在刷新請求資源時,使用的cache-contro為no-store.這時,由於我的SpringBoot項目,並沒有進行特殊的配置,所以得出結論,如果不是SpringBoot內置的,就是通過Tomcat進行配置的。接着是另一篇傳送門Tomcat配置Cache-Control~,但是通過配置之后發現並沒有改變這些資源的Cache-Control,所以再一次興奮起來,你又證明了一個不太可行的方式。
4.其實很少有文章或者資源講述SpringBoot緩存靜態資源的,有一部分是將數據請求的緩存,之后又問了幾個師兄,又通過百度,發現了1.SpringBoot可以寫類似於MVC的過濾類,通過過濾配置強緩存, 2. 通過SpringBoot +redis配置緩存我們的靜態資源。這里事情來到了一個要寫過濾類的代碼,事情來到了一個轉折,加上當時我有其他內容要修改,所以就把這個交給了我們后台的兄弟們。思路已經很清晰了,寫過濾類,實現靜態資源緩存。或者是更復雜的一些東西。但是實現,我就不行了。不過事情到這里並沒有結束,,,因為有更好的方法
這里有一些我覺得可以了解的資源:
5.今天將近中午的時候,此項目前端的修改基本完成的時候,其實后台的兄弟也覺得實在不行就寫Filter,但還是想找一種更合理簡單的方法,我覺得這是很好的。我又繼續我們自己的思考,如果有,那么一定是在SpringBoot內部進行設置,但是我們百度的總是SpringBoot和一些插件相結合進行控制(ex: EhCache),我覺得是自己對后台不理解導致的搜索盲區,最終誤打誤撞,找到了理想的解決方法:
通過配置application.properties
#資源緩存時間,單位秒
spring.resources.cache-period: 3600
# 開啟gzip壓縮
spring.resources.chain.gzipped=true
# 啟用緩存
spring.resources.chain.cache=true
總算啰嗦完了!(想必你也是這種心情,終於聽你嗶嗶完了)
寫這篇文章算是一個記錄,這個問題從昨天產生到解決中間過了大概有一天時間。但是真正思考這個問題的時間可能並沒有多久,對自己能解決結果,真的是很意外。又覺得是值得記錄的,因為證明了我之前有時候想的,前端和后台的開發思想,計算機思想,應該是一致的。嗯,也這么長時間沒寫博客了,獻丑獻丑~
(希望以后有時間把自己總結的前端的干貨(想減少大家和我當時對前端的誤解,其實前端的內容真的很多很多,就是總感覺這些大家只要看都能懂的,就總不想寫。。)都能分享一下,哎~)
希望各位看官多多點贊,讓我多在首頁待一待好不~_~