記錄--前端路由 hash 與 history 差異

来源:https://www.cnblogs.com/smileZAZ/archive/2022/07/06/16451207.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 簡單介紹 Vue Router Vue Router 是 Vue.js 官方的路由插件,它和 Vue.js 是深度集成的,適合用於構建單頁面應用。vue的單頁面應用是基於路由和組件的,路由用於設定訪問路徑,並將路徑和組件映射起來。傳統的頁 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

簡單介紹 Vue Router

  • Vue RouterVue.js 官方的路由插件,它和 Vue.js 是深度集成的,適合用於構建單頁面應用。vue的單頁面應用是基於路由和組件的,路由用於設定訪問路徑,並將路徑和組件映射起來。傳統的頁面應用,是用一些超鏈接來實現頁面切換和跳轉的。在 vue-router 單頁面應用中,則是路徑之間的切換,也就是組件的切換。路由模塊的本質 就是建立起url和頁面之間的映射關係
  • 至於我們為什麼不能用a標簽,這是因為用Vue做的都是單頁應用,就相當於只有一個主的 index.html 頁面,所以你寫的 標簽是不起作用的,你必須使用 vue-router 來進行管理。

Vue Router 實現原理

  • 在瞭解路由模式前,我們要先清楚,vue-roter 的實現原理是怎樣的,什麼是單頁面應用,特點是什麼,這樣更容易加深對路由的理解。

  • SPA 單頁面及應用方式:單一頁面應用程式,只有一個完整的頁面;它在第一次載入頁面時,就將唯一完整的 html 頁面和所有其餘頁面組件一起下載下來,這樣它在切換頁面時,不會載入整個頁面,而是只更新某個指定的容器中內容。

  • 單頁面應用(SPA)的核心之一是: 更新視圖而不重新請求頁面。

  • 路由器對象底層實現的三大步驟即(1)監視地址欄變化;(2)查找當前路徑對應的頁面組件;(3)將找到的頁面組件替換router-vieW 的位置。

  • vue-router 在實現單頁面前端路由時,提供了兩種方式:Hash 模式和 History 模式;vue2 是根據 mode 參數來決定採用哪一種方式,vue3 則是 history 參數,下麵我們將圍繞這個屬性進行進一步瞭解。

Hash

簡述

  • image.png

  • vue-router 預設 hash 模式 —— 使用 URL 的 hash 來模擬一個完整的 URL,於是當 URL 改變時,頁面不會重新載入。  hash(#)是 URL 的錨點,代表的是網頁中的一個位置,單單改變 # 後的部分,瀏覽器只會滾動到相應位置,不會重新載入網頁,也就是說 # 是用來指導瀏覽器動作的,對伺服器端完全無用,HTTP 請求中也不會不包括 # ,同時每一次改變 # 後的部分,都會在瀏覽器的訪問歷史中增加一個記錄,使用 "後退" 按鈕,就可以回到上一個位置,所以說 hash 模式通過錨點值的改變,根據不同的值,渲染指定 DOM 位置的不同數據。

  • # 符號本身以及它後面的字元稱之為 hash,可通過 window.location.hash 屬性讀取。

特點

  • hash 雖然出現在URL中,但不會被包括在 HTTP 請求中。它是用來指導瀏覽器動作的,對伺服器端完全無用,因此,改變 hash 不會重新載入頁面
  • 可以為 hash 的改變添加監聽事件:
  •    window.addEventListener("hashchange", fncEvent, false)
    
  • 每一次改變 hash(window.location.hash),都會在瀏覽器的訪問歷史中增加一個記錄
  • url 帶一個 # 號。

設置

  • vue3 設置 hash 模式路由

history

簡述

  • image.png
  • history 是路由的另一種模式,由於 hash 模式會在 url 中帶#,如果不想要帶 #的話,我們可以使用路由的 history 模式,只需要在響應的 router 配置規則時,加上即可,vue 的路由預設是 hash 模式。
  • 利用了HTML5 History Interface中新增的 pushState() replaceState() 方法。
  • 這兩個方法應用於瀏覽器的歷史記錄棧,在當前已有的 back、forward、go 的基礎之上,它們提供了對歷史記錄進行修改的功能。只是當它們執行修改時,雖然改變了當前的 URL,但瀏覽器不會立即向後端發送請求。

設置

特點

  • 路由跳轉不需要重新載入頁面。
  • 不帶 # 在大部分人看來要比 hash 路由好看許多。
  • 相容性沒有 hash 好,會在下麵展開說明

生產環境問題及解決

  • 當我們把 history 項目部署到伺服器中後,此時我們在瀏覽器輸入一個網址(比如是 www.test.com ), 此時會經過 dns 解析,拿到 ip 地址後根據 ip 地址向該伺服器發起請求,伺服器接受到請求後,然後返回相應的結果(html,css,js)。如果我們在前端設置了重定向,此時頁面會進行跳轉到 www.test.com/home ,在前端會進行匹配對應的組件然後將其渲染到頁面上。此時如果我們刷新頁面的話,瀏覽器會發送新的請求 www.test.com/home, 如果後端伺服器沒有 /home 對應的介面,那麼就會返回404。
  •  

  • 生產環境 刷新 404 的解決辦法可以在 nginx 做代理轉發,在 nginx 中配置按順序檢查參數中的資源是否存在,如果都沒有找到,讓 nginx 內部重定向到項目首頁。

開發環境- historyApiFallback

  • 有些小伙伴會有疑問,為什麼開發環境沒有遇到這個問題呢,不是和生產同樣的刷新操作嘛。

  • 這裡我也是疑問了一下,經查閱相關資料後發現在 vue-cli 中 webpack 幫我們做了處理
  • 如果我們把該配置改位 false,瀏覽器會把我們這個當做是一次 get 請求,如果後端沒有對應的介面,就會出現下麵這個報錯提示。

總結

  • 至此我們使用知道了 vue-roter 的兩種路由模式,及差異化,簡單來講就是,hash 路由相容梗好,但是帶#顯得醜些, histroy 和正常 url 路徑一樣,但是需要在伺服器進行單獨配置。大家可以根據自己的喜好去按需使用。有疑問的同學歡迎在評論區進行溝通。

本文轉載於:

https://juejin.cn/post/7096034733649297421

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #RDD(2) ##RDD轉換運算元 RDD根據數據處理方式的不同將運算元整體上分為Value類型、雙Value類型、Key-Value類型 ###value類型 ####map 函數簽名 def map[U:ClassTag](f:T=>U):RDD[U] 函數說明 將處理的數據逐條進行映射轉換,這裡 ...
  • ZEGO 提供 ZIM + RTC 服務聯動的場景解決方案,公開語聊房、秀場直播等業務場景搭建的示例源碼,幫助開發者能在極短的時間內搭建完美的業務場景。 ...
  • 目前正在做的一個項目需要用到地圖功能,在使用數據線連接到手機進行真機調試的時候,由於uniapp自帶了高德的SDK能夠獲取位置信息,但是在打包成apk後就不行了,原先地圖的位置顯示一片空白,這個時候,就需要我們去高德(或者百度)開放平臺去申請應用的key了,在這裡以高德地圖為例,步驟如下: 第一步: ...
  • 2022年6月,HMS Core機器學習服務面向開發者提供一項全新的開放能力——同聲傳譯,通過AI語音技術減少資源成本,加強溝通交流,旨在幫助開發者製作豐富多樣的同聲傳譯應用。 HMS Core同聲傳譯涵蓋了機器學習服務的語音識別、翻譯、語音合成等核心技術,首先把輸入的實時語音轉換成文字,然後再把文 ...
  • Android系統日誌和工具 我們經常需要查看設備裡面的各種日誌信息。所以有必要瞭解android系統裡面有哪些日誌,以及用什麼方式可以提取這些日誌。以我手頭的紅米note4xplus為例,其基本配置為高通msm8953,android7.0。我們可以看一下根文件系統: mido:/ # ls ac ...
  • 利用jq對比兩段文本的差異,差異的內容用不同顏色表示出來。 線上參考demo:http://incaseofstairs.com/jsdiff/ 項目地址:https://github.com/kpdecker/jsdiff 先上效果圖: 左側第一列是原稿,第二列是需要對比稿,第三列是對比後的結果。 ...
  • HTML知識點概括 前端三件套分別是HTML3,CSS5,JavaScript 稍微介紹一下W3C標準: 結構化標準語言(HTML) 表現標準語言(CSS) 行為標準(DOM,JavaScript) HTML是超文本標記語言,負責網頁最基本信息的構造 HTML的優勢: 市場需求量 跨平臺使用 瀏覽器 ...
  • 學習筆記 ant_vue模態框拖拽記錄 通過自定義命令 utils文件夾中新建dragModal.js import Vue from 'vue' // 註冊自定義拖拽指令,彌補 modal 組件不能拖動的缺陷 Vue.directive('drag-modal', (el, bindings, v ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...