Vue的路由模式的區別和原理

路由模式

Vue 的路由模式指的是 Vue Router 提供的 URL 處理方式,主要有兩種:Hash 模式和History 模式。

Hash模式

在 Vue Router 中,默認使用的是 hash 模式,即 mode: 'hash'。如果想要使用 history 模式,可以設置 mode: 'history'

原理

  • Hash 模式基于瀏覽器的 window.location.hash 屬性。當 URL 中的哈希部分發生變化時,Vue Router 會監聽到這個變化,并相應地切換視圖。

  • Hash 模式不會向服務器發送請求。這是因為 URL 中的哈希值(# 后面的部分)的變化不會觸發瀏覽器重新加載頁面或向服務器發送新請求

核心原理

  1. 哈希值變化:當 URL 的哈希部分(如 http://example.com/#/home 中的 /home)發生變化時,瀏覽器只會:

    • 更新 window.location.hash 屬性。
    • 觸發 hashchange 事件(可通過 window.addEventListener(hashchange, callback) 監聽)。
  2. Vue Router 的處理:Vue Router 監聽 hashchange 事件,根據新的哈希值匹配對應的路由配置,然后動態更新組件視圖。整個過程完全在前端完成,不會向服務器發送任何請求

  3. 下面是Vue3底層hash改變的代碼實現(有興趣可以看一下)

// 簡化版 Vue Router 核心實現
class Router {constructor(options) {this.routes = options.routes || [];this.currentPath = window.location.hash.slice(1) || '/';// 創建響應式數據:使用 Vue 3 的 reactive 原理(簡化版)this.currentRoute = this.createReactive({path: this.currentPath,component: null});// 初始化路由監聽this.init();}// 創建簡易響應式對象(模擬 Vue 3 的 Proxy 實現)createReactive(target) {return new Proxy(target, {set: (obj, key, value) => {obj[key] = value;this.updateView(); // 值變化時更新視圖return true;}});}// 初始化路由監聽init() {// 1. 初始加載時處理當前哈希值this.handleHashChange();// 2. 監聽哈希值變化window.addEventListener('hashchange', () => {this.handleHashChange();});}// 處理哈希值變化handleHashChange() {this.currentPath = window.location.hash.slice(1) || '/';this.matchRoute();}// 匹配路由matchRoute() {const route = this.routes.find(route => {// 簡化的路徑匹配(實際 Vue Router 使用更復雜的路徑解析)return route.path === this.currentPath;});if (route) {this.currentRoute.path = route.path;this.currentRoute.component = route.component;} else {// 處理 404 路由this.currentRoute.path = '*';this.currentRoute.component = this.routes.find(r => r.path === '*')?.component;}}// 更新視圖(模擬 Vue 的虛擬 DOM 更新)updateView() {// 在實際 Vue Router 中,這里會觸發 Vue 組件的重新渲染console.log(`路由變更為: ${this.currentRoute.path}`);}
}// 模擬 Vue 組件系統
function createComponent(options) {return {...options,render() {// 實際 Vue 會根據模板生成 VNode 并渲染console.log(`渲染組件: ${this.name}`);}};
}// 使用示例
const HomeComponent = createComponent({name: 'Home',template: '<div>Home Page</div>'
});const AboutComponent = createComponent({name: 'About',template: '<div>About Page</div>'
});const router = new Router({routes: [{ path: '/', component: HomeComponent },{ path: '/about', component: AboutComponent },{ path: '*', component: createComponent({ name: 'NotFound', template: '<div>404 Not Found</div>' }) }]
});// 模擬路由切換
window.setTimeout(() => {window.location.hash = '/about';
}, 2000);

Vue2設置Hash模式

import Vue from 'vue';
import VueRouter from 'vue-router';Vue.use(VueRouter);const routes = [// 路由配置
];const router = new VueRouter({mode: 'hash', // 使用 hash 模式routes
});new Vue({router,render: h => h(App)
}).$mount('#app');

Vue3設置Hash模式

import { createRouter, createWebHashHistory } from 'vue-router';// 導入組件
import Home from '../views/Home.vue';
import About from '../views/About.vue';// 定義路由
const routes = [{path: '/',name: 'Home',component: Home},{path: '/about',name: 'About',component: About}
];// 創建路由實例并配置 hash 模式
const router = createRouter({history: createWebHashHistory(), // 指定為 hash 模式routes
});export default router;

優勢

  • 兼容性: Hash 模式在不同瀏覽器之間的兼容性較好,因為瀏覽器對于哈希部分的處理方式基本一致。
  • 無需服務器支持: 不需要后端服務器的特殊配置,可以在任意靜態服務器上使用。

缺點

  • URL 美觀度: URL 中帶有 # 符號,可能不夠美觀。
  • SEO 不友好: 對搜索引擎的優化相對較差,因為搜索引擎不會將哈希部分的內容作為獨立的頁面來處理。

History模式

原理

在 Vue Router 中,History 模式基于 HTML5 的 History API 實現,通過操作瀏覽器的歷史記錄棧,在不刷新頁面的情況下改變 URL ,同時還能實現前進、后退等導航功能
https://www.doubao.com/thread/wa13961c844859854

  1. NodeJs的配置實現
const http = require('http')
const fs = require('fs')
const httpPort = 80http.createServer((req, res) => {fs.readFile('index.html', 'utf-8', (err, content) => {if (err) {console.log('We cannot open "index.html" file.')}res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'})res.end(content)})
}).listen(httpPort, () => {console.log('Server listening on: http://localhost:%s', httpPort)
})

特點

  1. History 模式下的路由切換操作(如 pushState)本身確實不需要向后端發送請求
  2. 當用戶直接訪問 / 刷新子路由(如 http://example.com/about)時,瀏覽器會主動向后端發送請求,這才是需要后端配置的原因。

正常路由切換(通過 pushState

用戶在頁面內點擊按鈕觸發 router.push('/about') 時:

  • 前端調用 history.pushState(),URL 變為 http://example.com/about(不刷新頁面)。
  • 前端路由匹配 /about,渲染 About 組件(純前端操作,無需后端參與)。

直接訪問 / 刷新子路由(如輸入 http://example.com/about 回車)

當用戶直接在地址欄輸入 http://example.com/about 并回車,或在該頁面按 F5 刷新時:

  • 瀏覽器會認為這是一個全新的 HTTP 請求,按照 URL 的路徑(/about)向服務器發送請求。

  • 服務器默認會找 /about 對應的物理文件,但前端路由是單頁應用(只有 index.html),所以服務器找不到資源,返回 404。

  • 后端配置(如 Nginx 的 try_files、Express 的 * 路由)的核心邏輯是:
    無論請求的路徑是什么(如 /about、/user),都返回前端的 index.html。

    • 這樣,當用戶直接訪問 / 刷新子路由時:

    • 服務器返回 index.html → 瀏覽器加載 HTML 和 JS。

    • 前端路由啟動,讀取當前 URL(/about),匹配并渲染組件。

為什么 Hash 模式不需要處理這種情況

  • Hash 模式的 URL 是 http://example.com/#/about,瀏覽器在發送請求時,只會把 # 前面的部分(http://example.com/)發給服務器,所以服務器始終返回 index.html,前端路由能正常運行。

  • 而 History 模式的 URL 是 http://example.com/about(無 #),瀏覽器會把完整路徑 /about 發給服務器,導致需要后端干預。

Vue3配置History模式

import { createRouter, createWebHistory } from 'vue-router'// 創建路由
const router = createRouter({history: createWebHistory(),// routes: routes 的縮寫routes, 
})

優勢

  • URL 美觀度: URL 更加美觀,不帶有 # 符號。
  • SEO 友好: 對搜索引擎的優化更好,因為搜索引擎能夠更好地處理沒有哈希部分的 URL。

缺點

  • 兼容性: 兼容性相對較差,需要服務器的支持,且在某些環境中可能需要額外的配置。
  • 需要服務器支持: 刷新頁面或直接訪問某個路由時,服務器需要正確處理這個路由。

總結

  1. History 模式的路由切換本身(pushState)不需要后端參與,但“直接訪問 / 刷新子路由”` 的場景會觸發瀏覽器向后端發送請求,因此需要后端配置兜底規則(返回 index.html)。

  2. 服務器返回 index.html 后,前端路由會接管 URL 解析和組件渲染:

    • index.html 加載前端框架和路由邏輯。
    • 前端路由根據當前 URL(/about)匹配組件。
    • 動態渲染對應組件,最終顯示你想要的頁面。
  3. 這就是單頁應用的核心:一個入口文件 + 前端路由動態渲染,實現 “看似多頁,實則單頁” 的體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92543.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92543.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92543.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過TPLink路由器進行用戶行為審計實戰

用戶行為審計是指對用戶在網絡平臺上的行為進行監控和記錄&#xff0c;以便對其行為進行分析和評估的過程。隨著互聯網的普及和發展&#xff0c;用戶行為審計在網絡安全和數據隱私保護方面起到了重要的作用。 用戶行為審計可以幫助發現和預防網絡安全威助。通過對用戶的行為進行…

MYSQL 第一次作業

新建產品庫mysql> CREATE DATABASE mydb6_product;使用產品庫mysql> USE mydb6_product;創建employess表mysql> CREATE TABLE employees (-> id INT PRIMARY KEY,-> name VARCHAR(50) NOT NULL,-> age INT,-> gender VARCHAR(10) NOT NULL DEFAULT unknow…

暑期前端訓練day7——有關vue-diff算法的思考

前言 今天分享一下我對vue的diff的探究&#xff0c;跟我一起深入底層&#xff0c;看一看vue是怎么進行diff的&#xff0c;它的復雜度如何&#xff0c;為什么性能這么高&#xff0c;diff的目標是盡可能的復用原來的真實dom&#xff0c;減少刪除真實dom和創建真實的dom的開銷&…

【Docker】Docker的初步認識以及Ubuntu下的Docker環境安裝、配置

前言 在當今快速迭代的軟件開發與部署領域&#xff0c;容器化技術已成為不可或缺的核心力量&#xff0c;而 Docker 作為容器化技術的杰出代表&#xff0c;正以其輕量、高效、可移植的特性深刻改變著開發與運維的模式。它有效解決了 “在我機器上能運行&#xff0c;在你那里卻不…

【密碼學】2. 古典密碼

目錄2. 古典密碼2.1 經典加密技術基礎2.2 代換技術2.2.1 算術密碼2.2.2 代換密碼&#xff08;Substitution Cipher&#xff09;2.3 置換技術2.4 乘積密碼2.5 歷史上的教訓2. 古典密碼 2.1 經典加密技術基礎 分類 代換&#xff08;Substitution&#xff09;&#xff1a;明文內…

CSS3文本陰影特效全攻略

CSS3文本陰影效果實現 下面我將創建一個展示各種CSS3文本陰影效果的頁面&#xff0c;包含多種樣式示例和代碼實現。 設計思路 創建具有視覺吸引力的標題區域提供多種文本陰影效果實例顯示對應的CSS代碼以供參考添加交互元素讓用戶自定義效果 實現代碼 <!DOCTYPE html&g…

JavaScript 03 嚴格檢查模式Strict字符串類型詳解

2.4 嚴格檢查模式Strict在 JavaScript 里&#xff0c;也是 有 “作用域” 這個說法的。 所以說&#xff0c;變量 也分 全局變量 和 局部變量。 當我們 直接 把 代碼 寫在 script 雙標簽里面的時候&#xff0c;我們 JS 會認為 這只是 一個 沒有名字的 函數&#xff01;&#xff…

車載診斷ECU架構

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

使用vue-pdf-embed發現某些文件不顯示內容

在使用vue-pdf-embed過程中, 突然發現有些pdf文件可以正常打開, 有些文件只顯示了一些數字, 并且控制臺報出如下警告: Warning: loadFont - translateFont failed: “UnknownErrorException: Ensure that the cMapUrl and cMapPacked API parameters are provided.”. Warning…

【設計模式C#】狀態模式(用于解決解耦多種狀態之間的交互)

一種行為設計模式。特點是用類的方式去管理狀態。優點&#xff1a;對每個狀態進行了封裝&#xff0c;提高了代碼的可維護性&#xff1b;減少了條件判斷語句的使用&#xff0c;降低維護成本&#xff1b;易于擴展&#xff0c;每次新增狀態都無需大規模修改其他類&#xff0c;符合…

WebSocket數據通過splice保持現有DOM結構僅更新文本內容?【防閃爍】。

文章目錄 前言 一、DOM更新優化機制 ?1.虛擬DOM復用性 2.?響應式系統觸發 二、性能對比 三、WebSocket場景實踐 ?1.防閃爍原理 2.代碼實現示例 四、特殊注意事項 總結 前言 開發過程中渲染websocket返回的數據時&#xff0c;經常會遇到更新數據閃爍的問題&#xff0c;咱們可…

深入解析Hadoop的Block多副本同步機制與Pipeline復制

Hadoop分布式文件系統概述作為Hadoop生態的核心存儲組件&#xff0c;HDFS&#xff08;Hadoop Distributed File System&#xff09;的設計哲學源于Google File System論文&#xff0c;其架構專門針對大規模數據集處理場景進行了優化。在理解Block多副本同步機制之前&#xff0c…

洪水預報中的序列到序列模型及其可解釋性擴展

洪水預報中的序列到序列模型及其可解釋性擴展 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家&#xff0c;覺得好請收藏。點擊跳轉到網站。 1. 引言 洪水預報是水文科學和災害管理中的重要課題&#xff…

UniApp 優化實踐:使用常量統一管理本地存儲 Key,提升可維護性

在 UniApp 項目開發中&#xff0c;隨著功能的增加&#xff0c;本地存儲&#xff08;如 uni.setStorageSync&#xff09;的使用頻率也會增加。如果直接在代碼中硬編碼 key 值&#xff0c;不僅容易出錯&#xff0c;也難以后期維護。本文將以“自定義導航欄適配狀態欄高度”為例&a…

計算機網絡:(八)網絡層(中)IP層轉發分組的過程與網際控制報文協議 ICMP

計算機網絡&#xff1a;&#xff08;八&#xff09;網絡層&#xff08;中&#xff09;IP層轉發分組的過程與網際控制報文協議 ICMP前言一、IP層轉發分組的過程第一步&#xff1a;接收數據包并解封裝第二步&#xff1a;提取目標 IP 地址第三步&#xff1a;查詢路由表第四步&…

Python爬蟲實戰:研究concurrent-futures庫相關技術

1. 引言 1.1 研究背景與意義 網絡爬蟲作為互聯網數據采集的重要工具,在信息檢索、輿情分析、學術研究等領域具有廣泛應用。隨著互聯網數據量的爆炸式增長,傳統單線程爬蟲的效率已難以滿足需求,并發爬蟲技術成為研究熱點。 1.2 相關工作 現有爬蟲框架如 Scrapy、Beautifu…

Neo4j 框架 初步簡單使用(基礎增刪改查)

Neo4j 是一個高性能的、開源的圖數據庫。它將數據存儲為圖結構&#xff0c;其中節點表示實體&#xff0c;邊表示實體之間的關系。這種圖數據模型非常適合處理復雜的關系型數據&#xff0c;能夠高效地進行關系查詢和遍歷。 Neo4j 的主要特性包括&#xff1a; 強大的圖查詢語言 C…

【iOS】鎖[特殊字符]

文章目錄前言1??什么是鎖&#x1f512;&#xff1f;1.1 基本概念1.2 鎖的分類2??OC 中的常用鎖2.1 OSSpinLock&#xff08;已棄用&#xff09;&#xff1a;“自旋鎖”的經典代表為什么盡量在開發中不使用自旋鎖自旋鎖的本質缺陷&#xff1a;忙等待&#xff08;Busy Waiting…

在easyui中如何設置自帶的彈窗,有輸入框

這個就是帶input的確認彈框&#xff08;$.messager.prompt&#xff09;// 使用prompt并添加placeholder提示 $.messager.prompt(確認, 確定要將事故記錄標記為 statusText 嗎&#xff1f;, function(r) {if (r) {// r 包含用戶輸入的內容var remark r.trim();// 驗證輸入不為…

Android-API調用學習總結

一、Postman檢查API接口是否支持1.“HTTP Request” 來創建一個新的請求。——請求構建界面&#xff0c;這是你進行所有 API 調用的地方。2.設置請求方法和 URL&#xff1a;選擇請求方法&#xff1a; 在 URL 輸入框左側&#xff0c;有一個下拉菜單。點擊它&#xff0c;選擇你想…