路由的 hash 和 history 模式的區(qū)別

Vue-Router 有兩種模式:hash 模式和 history 模式。默認(rèn)的路由模式是 hash 模式。

1. hash 模式

1.1 簡(jiǎn)介

hash 模式是開(kāi)發(fā)中默認(rèn)的模式,它的 URL 帶著一個(gè)#;

例如:http://www.abc.com/#/vue,它的 hash 值就是#/vue。

1.2 特點(diǎn)

  • hash 值會(huì)出現(xiàn)在 URL 里面,但是不會(huì)出現(xiàn)在 HTTP 請(qǐng)求中,對(duì)后端完全沒(méi)有影響。所以改變 hash 值,不會(huì)重新加載頁(yè)面。
  • 這種模式的瀏覽器支持度很好,低版本的 IE 瀏覽器也支持這種模式。
  • hash路由被稱為是前端路由,已經(jīng)成為 SPA(單頁(yè)面應(yīng)用)的標(biāo)配。

1.3 原理?。?!

hash 模式的主要原理就是 onhashchange() 事件

好處:

  1. 在頁(yè)面的 hash 值發(fā)生變化時(shí),無(wú)需向后端發(fā)起請(qǐng)求,window 就可以監(jiān)聽(tīng)事件的改變,并按規(guī)則加載相應(yīng)的代碼

  2. hash 值變化對(duì)應(yīng)的 URL 都會(huì)被瀏覽器記錄下來(lái),這樣瀏覽器就能實(shí)現(xiàn)頁(yè)面的前進(jìn)和后退

  3. 雖然是沒(méi)有請(qǐng)求后端服務(wù)器,但是頁(yè)面的 hash 值和對(duì)應(yīng)的 URL 關(guān)聯(lián)起來(lái)了。

 // js中有一個(gè)事件hashchange
window.onhashchange = function() {
    // 可以獲取到app的data值,也可以設(shè)置值
    // console.log(app.currentCom)
    // 獲取錨點(diǎn)值
    let curhash = location.hash.slice(1)
    console.log(curhash)
    switch (curhash) {
        case '/login':
            app.currentCom = 'login'
            break
        case '/reg':
            app.currentCom = 'reg'
            break
        case '/index':
            app.currentCom = 'index'
            break
    }
}

2. history 模式

2.1 簡(jiǎn)介

history 模式的 URL 中沒(méi)有#,它使用的是傳統(tǒng)的路由分發(fā)模式,即用戶在輸入一個(gè) URL 時(shí),服務(wù)器會(huì)接收這個(gè)請(qǐng)求,并解析這個(gè)URL,然后做出相應(yīng)的邏輯處理。

2.2 特點(diǎn)

  • 當(dāng) 使 用 history 模 式 時(shí) , URL 就 像 這 樣 :http://abc.com/user/id。相比 hash 模式更加好看。

  • history模式需要后臺(tái)配置支持,如果后臺(tái)沒(méi)有正確配置,訪問(wèn)時(shí)會(huì)返回 404。

  • API: history api 可以分為兩大部分,切換歷史狀態(tài)修改歷史狀態(tài)

    • 修 改 歷 史 狀 態(tài) :

    • 包 括 了 HTML5 History Interface 中 新 增 的pushState()replaceState() 方法,這兩個(gè)方法應(yīng)用于瀏覽器的歷史記錄棧,提供了對(duì)歷史記錄進(jìn)行修改的功能。只是當(dāng)他們進(jìn)行修改時(shí),雖然修改了 url,但瀏覽器不會(huì)立即向后端發(fā)送請(qǐng)求。如果要做到改變 url 但又不刷新頁(yè)面的效果,就需要前端用上這兩個(gè) API。

    • 切換歷史狀態(tài):

    • 包括 forward()、back()、go()三個(gè)方法,對(duì)應(yīng)瀏覽器的前進(jìn),后退,跳轉(zhuǎn)操作。

    • 雖然 history 模式丟棄了丑陋的#。但是,它也有自己的缺點(diǎn),就是在刷新頁(yè)面的時(shí)候,如果沒(méi)有相應(yīng)的路由或資源,就會(huì)刷出 404 來(lái)。

    • 如果想要切換到 history 模式,就要進(jìn)行以下配置(后端也要進(jìn)行配置)

      const router = new VueRouter({
          mode:'history',
          routes:[...]
      })
      

3. 兩種模式對(duì)比

  1. 調(diào)用 history.pushState() 相比于直接修改 hash,存在以下優(yōu)勢(shì):pushState() 設(shè)置的新 URL 可以是與當(dāng)前 URL 同源的任意 URL;而hash 只可修改 # 后面的部分,因此只能設(shè)置與當(dāng)前 URL 同文檔的URL;
  2. pushState() 設(shè)置的新 URL 可以與當(dāng)前 URL 一模一樣,這樣也會(huì)把記錄添加到棧中;而 hash 設(shè)置的新值必須與原來(lái)不一樣才會(huì)觸發(fā)動(dòng)作將記錄添加到棧中;
  3. pushState() 通過(guò) stateObject 參數(shù)可以添加任意類型的數(shù)據(jù)到記錄中;而 hash 只可添加短字符串;
  4. pushState() 可額外設(shè)置 title 屬性供后續(xù)使用。
  5. hash 模式下,僅 hash 符號(hào)之前的 url 會(huì)被包含在請(qǐng)求中,后端如果沒(méi)有做到對(duì)路由的全覆蓋,也不會(huì)返回 404 錯(cuò)誤;
  6. history 模式下,前端的 url 必須和實(shí)際向后端發(fā)起請(qǐng)求的 url 一致,如果沒(méi)有對(duì)用的路由處理,將返回 404 錯(cuò)誤。
  7. hash 模式和 history 模式都有各自的優(yōu)勢(shì)和缺陷,還是要根據(jù)實(shí)際情況選擇性的使用。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容