記錄--前端路由 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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...