淺析一波路由的hash 和 history 的區別與實現原理以及服務器刷新404的問題及解決方法

先解釋下基本概念
hash
hash 不是那個哈希算法,就是以前url用的錨點,以前是多用來定位頁面展示內容。代表符號是“#”
之所以用hash是因爲他既可以獲取到,又可以不去刷新頁面也不去請求服務器。滿足單頁面的需求。
一般寫法: 就如說我們的思否 https://segmentfault.com/#a/b... 你在控制檯輸入 window.location.hash,就會出現#a/b/c/d
history
就是url ,也比如說我們的思否,我現在寫文章的頁面 https://segmentfault.com/write,你在瀏覽器輸入 window.location.pathname 就會輸出 /write,但是單頁面路由中的url主要目的是用來存儲路由變量的

基本概念說完了,說下原理

hash 的原理 比較簡單粗暴易理解,因爲錨點本身就是基於單頁面的一種頁面定位功能,獲取頁面的hash值相當於可以直接獲取路由的變量,實現按需加載子頁面。

history 的原理 略微複雜一點,它可以通過history.pushState(state, title, url)去變動url 內容, 不會造成頁面刷新。這裏state 可以存一些params值,title 隨便傳值吧目前沒什麼用。url 就是要變動的url。既然瀏覽器不會刷新。那麼和hash 就變成一樣的效果了, 但是比hash美觀。

講一下區別

hash 是一個真實的url,它利用錨點#來實現單頁面,只要錨點前的地址不會,這個頁面就不會刷新,即便刷新了,也能立即獲取到路由參數(#後面的內容)

history 是一個虛假的url, 他就像你用代碼去在地址欄敲了url,並且,沒按回車 你一旦按了回車,那基本上就崩了,因爲瀏覽器 會真的去請求這個虛假的url。那麼自然就崩了。(前端開發的時候沒崩是因爲dev包把這個問題都解決了,但是生存環境的服務器並沒有去主動解決,所以部署以後就崩,所以需要手動解決一下)

然後說一下history 的解決方法,解決方法有很多,我個人喜歡重定向的方法。
首先 服務器將所有的頁面方面的請求均 重定向 到 初始頁上面,這樣的話,url就不至於請求不到頁面(當然嫌麻煩的可以直接把404重定向到初始頁面)
然後 在前端最外層頁面寫一個地址解析(一般框架都應該有寫好,我這裏是說自己寫路由插件),相當於獲取到路由所需參數。

這樣的話,就可以做到刷新頁面不崩的效果。

如果有服務器部署基礎的可以拿nginx此類的服務器試試,我自己這邊是默默地拿着notepad配置成功了......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章