將 html 託管給後端,前端只發靜態資源(index.js
/index.css
),而後經過某種方式去刷 html 的靜態資源版本號(?version=時間戳或遞增數字)。css
咱們先來看看前端項目部署的比較好實踐是什麼?html
出處:大公司裏怎樣開發和部署前端代碼?前端
能夠總結出如下四點:算法
- 配置超長時間的本地緩存 —— 節省帶寬,提升性能
- 採用內容摘要做爲緩存更新依據 —— 精確的緩存控制
- 靜態資源 CDN 部署 —— 優化網絡請求
- 變動資源發佈路徑實現非覆蓋式發佈 —— 平滑升級
上面文章但是本文的基石,5 年過去了,更好的方案是什麼呢,還但願大佬賜教。後端
做爲一個畢業 1 年的菜鳥,我就先着上面的文章來看看目前公司發佈流程的不足吧。瀏覽器
前端只發布靜態資源,只要 html 引用的資源不刷版本號,對老用戶是沒有影響的(存在強緩存,直接請求本地緩存,對應實踐 1),新用戶雖然沒有緩存,但因爲是靜態資源是同名覆蓋發佈,因此請求新的 index.js
/index.css
資源,只要資源不依賴 html 結構,看到新版本功能,也沒有影響(注意:若是依賴 html 結構,請求新資源可能就會出現問題,好在目前單頁應用基本不依賴 html 結構,一個#root 根節點 就夠了)。緩存
(強行)優勢服務器
缺點網絡
那麼按照上面的實踐,如何處理比較好呢?運維
aaa.[contenthash].js
與 bbb.[contenthash].css
),文件名是否變化取決於文件內容是否變化再來看看上面的缺點是否被解決了?
1. 粗粒度的版本號刷新策略,致使根據文件內容變化選擇性更新緩存(對應實踐 2)沒法實施
文件名是基於 content hash生成,在發佈新的 html 後,若文件內容未發生變化,文件名不會發生改變,依舊使用本地強緩存,若文件內容變化,文件名會發生改變,會請求新的靜態資源,達到了選擇性更新緩存的效果。
2. 覆蓋發佈。在 html 刷新版本號前,新用戶和老用戶可能看到的頁面版本(功能)不一樣
非覆蓋式發佈,文件名[contenthash]不一樣不會覆蓋,舊的靜態資源文件依舊存在。
新的靜態資源發佈後,新的 html 未發佈前這個時間段內,老用戶請求到舊的 html,請求的是舊的靜態資源,文件名(或者說文件路徑)未變化,依舊使用本地強緩存,新用戶請求到舊的 html,沒有本地緩存,但舊的靜態資源未被覆蓋,依舊能夠請求到,此時看到的都是舊版本內容。
新的 html 發佈後,老用戶瀏覽器會選擇性更新本地緩存,新用戶直接請求新的靜態資源,看到的都是新版本內容。
3. html 託管在後端,致使必定程度的先後端未分離(譬如打包策略變動須要後端配合更改 html)
html 徹底由前端控制,後端只須要提供 API 便可,先後端真正意義上的徹底分離。
缺點:
經驗淺了些,參考的資料古老了些,可能有些地方有失偏頗,請必定要指正。
並且項目上線是確定要配 Nginx 的,要去找運維幫忙配,流程上還有能夠優化的地方,如今這種形式對前端制約太大了。