前言:網路上,很多介紹前端路由實現的文章,以及路由原理的文章。但是最近在面試過程中,我發現,所有面試者都能講清楚路由的技術實現,但是卻對每一種技術實現的適用場景不理解。比如
hash
路由,很多人的回答是hash
路由會帶有一個#
號不好看,所以用了history
路由。甚至我出去面試的時候,也有一些面試官這麼認為(T_T)。任何技術方案的產生都是為了解決某些特定問題的。hash
和history
也不例外。
目前前端路由方案主要有以下幾種
hash
:可能是大多數人瞭解的模式,主要是基於錨點的原理實現。簡單易用browser
:即使用html5
標準中的history api
通過監聽popstate
事件來對dom
進行操作。每次路由變化都會引起重定向memory
:這種實現是在記憶體中維護一個堆疊用於管理訪問歷史的方式,比較複雜。在早起移動端使用比較多。實現麻煩,問題也較多。現在很少有使用。RN
在使用這種路由模式static
:主要用於ssr
。需要後端去管理路由
前端路由解決的問題
- 根據路由變化顯示不同的頁面,完成頁面切換
- 通過
query
傳參
前端路由各種實現方案的對比
hash路由 優缺點
-
優點
- 實現簡單,相容性好(相容到
ie8
) - 絕大多數前端框架均提供了給予
hash
的路由實現 - 不需要伺服器端進行任何設定和開發
- 除了資源載入和
ajax
請求以外,不會發起其他請求
- 實現簡單,相容性好(相容到
-
缺點
- 對於部分需要重定向的操作,後端無法獲取
hash
部分內容,導致後臺無法取得url
中的資料,典型的例子就是微信公眾號的oauth
驗證 - 伺服器端無法準確跟蹤前端路由資訊
- 對於需要錨點功能的需求會與目前路由機制衝突
- 對於部分需要重定向的操作,後端無法獲取
browser路由 優缺點
-
優點
- 對於重定向過程中不會丟失
url
中的引數。後端可以拿到這部分資料 - 絕大多數前段框架均提供了
browser
的路由實現 - 後端可以準確跟蹤路由資訊
- 可以使用
history.state
來獲取當前url
對應的狀態資訊
- 對於重定向過程中不會丟失
-
缺點
- 相容性不如
hash
路由(只相容到IE10
) - 需要後端支援,每次返回
html
文件
- 相容性不如
memory路由 優缺點
-
優點
- 不存在相容性問題,路由儲存在記憶體中
- 不需要伺服器端提供支援
-
缺點
- 目前很少有前端路由模組提供對
memory
路由的實現(react-router
提供了memory
實現) - 自己實現難度較大,且工作量也很大
- 對於前進後退操作的路由管理非常麻煩,尤其是
android
裝置的backbutton
- 目前很少有前端路由模組提供對
static
路由 優缺點(該路由方式主要用於ssr
。不做比較。)
如何選擇合適的前端路由方案?以下建議作為參考:
hash模式適用場景:
- 相容IE8
- 沒有重定向傳參需求(第三方認證
oauth
) - 沒有錨點跳躍需求
- 後端不需要跟蹤前端路由資訊
hybrid app
需要將前端資源打包在應用內,因為html
的域在file://
下,所以不能發生重定向
history模式適用場景:
- 頁面內錨點需求
- 需要重定向傳參
- 同構直出
- 後端跟蹤路由資訊
- 附加路由資訊(
history.state
)獲取路由狀態
memory模式適用場景:
- ie8以下相容
- React Native