能說下 vue-router 中常用的 hash 和 history 路由模式實現原理嗎?


這個router有兩種模式:hash模式(默認)、history模式(需配置mode: 'history')

 

 

 然后,我們來研究下兩者的原理:

我們先來認識下這位朋友#,這個#就是hash符號,中文名哈希符或錨點,當然這在我們前端領域姑且這么稱呼。

然后哈希符后面的值,我們稱之為哈希值。OK,接下來我們繼續分析他的原理。路由的哈希模式其實是利用了window可以監聽onhashchange事件,也就是說你的url中的哈希值(#后面的值)如果有變化,前端是可以做到監聽並做一些響應(搞點事情),這么一來,即使前端並沒有發起http請求他也能夠找到對應頁面的代碼塊進行按需加載。

后來人們給他起了一個霸氣的名字叫前端路由,成為了單頁應用標配。

大伙可以圍觀下網易雲音樂的url模式:https://music.163.com/#/friend

 

history模式

我們先介紹一下H5新推出的兩個神器:pushStatereplaceState   history模式中的原理。

 

pushState

瀏覽器不會向服務端請求數據,直接改變url地址,可以類似的理解為變相版的hash;但不像hash一樣,瀏覽器會記錄pushState的歷史記錄,可以使用瀏覽器的前進、后退功能作用。

 

replaceState   

不同於pushState,replaceState僅僅是修改了對應的歷史記錄。

 

具體自行百度,簡而言之,這兩個神器的作用就是可以將url替換並且不刷新頁面,好比掛羊頭賣狗肉,

http並沒有去請求服務器該路徑下的資源,一旦刷新就會暴露這個實際不存在的“羊頭”,顯示404。

 

那么如何去解決history模式下刷新報404的弊端呢,這就需要服務器端做點手腳,將不存在的路徑請求重定向到入口文件(index.html)

前后端聯手,齊心協力做好“掛羊頭賣狗肉”的完美特效。

 

 

 

 

 

 

 

 

 

 

 

 

 

總之,pushState方法不會觸發頁面刷新,只是導致history對象發生變化,地址欄會有反應。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM