Vue-Router中History模式

来源:https://www.cnblogs.com/dashnowords/archive/2019/08/19/11379815.html
-Advertisement-
Play Games

示例代碼托管在: "http://www.github.com/dashnowords/blogs" 博客園地址: "《大史住在大前端》原創博文目錄" 華為雲社區地址: "【你要的前端打怪升級指南】" [TOC] history路由 模式是指使用HTML5的 實現客戶端路由的模式, 它的典型表現就是 ...


目錄

示例代碼托管在:http://www.github.com/dashnowords/blogs

博客園地址:《大史住在大前端》原創博文目錄

華為雲社區地址:【你要的前端打怪升級指南】

history路由

history模式是指使用HTML5的historyAPI實現客戶端路由的模式,它的典型表現就是去除了hash模式中url路徑中的#。對於前端路由基本原理還不瞭解的讀者可以看這篇博文【javascript基礎修煉(6)——前端路由的基本原理】。在使用Vue-Router時開啟history模式非常容易,只需要在實例化路由時傳入mode:'history'配置項即可,但缺少服務端支持時,基於historyAPI的路由無法從url地址欄直接訪問指定頁面,這個很容易理解,因為url地址欄里輸入後回車相當於發送了一次GET請求,那麼不帶#的路由路徑就和普通的API介面是一樣的,既然服務端並沒有定義這樣的介面,那直接訪問時出現404頁面就很正常了。

官方示例

官方提供了很多處理這種場景的方式,以node.js版本的處理方案為例:

const http = require('http')
const fs = require('fs')
const httpPort = 80

http.createServer((req, res) => {
  fs.readFile('index.htm', 'utf-8', (err, content) => {
    if (err) {
      console.log('We cannot open "index.htm" 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)
})

不難看出,它的處理思路就是所有請求都強制重定向到首頁,相當於服務端屏蔽了訪問資源不存在的情況,而將路由的工作留給客戶端自己去處理,這樣啟用了history模式的前端路由在直接定位到子頁面時就不會報錯了。

Express中間件

express工程中使用connect-history-api-fallback中間件來處理後端路由的場景,它的使用方式非常簡單:

var history = require('connect-history-api-fallback');
var express = require('express');

var app = express();
app.use(history());

源碼也只有120行(地址:connect-history-api-fallback中間件源碼 ),很容易閱讀,基本邏輯是只將滿足一些特定條件的請求進行重定向,也就是將路由請求和API請求區分開,重定向的規則可以自定義,路由請求的判斷條件包括:

  • GET請求
  • headers.accept為text/html*/*(設置為application/json或非字元串時會記錄錯誤日誌);

核心邏輯就是82-85行的:

 rewriteTarget = options.index || '/index.html';
 logger('Rewriting', req.method, req.url, 'to', rewriteTarget);
 req.url = rewriteTarget;
 next();

也就是如果匹配到自定義的重定向規則就使用自定義場景,否則就使用/index.html作為預設值,然後重寫req.url屬性,接著進入下一個中間件執行其他邏輯。

客戶端兜底404

當服務端重定向後,如果沒有進行SSR的同構路由定製,對於所有路由請求都會返回index.html頁面,此時如果需要使用404頁面,就需要在客戶端路由中設定一個優先順序最低的兜底路由,由於優先順序的緣故,它不會影響其他精確匹配的路由配置:

const router = new VueRouter({
  mode: 'history',
  routes: [
    { path: '*', component: NotFoundComponent }
  ]
})

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

-Advertisement-
Play Games
更多相關文章
  • 個人使用SQL Server日常用到的一些函數(會不斷的更新完善) 1.獲取當前時間--getdate() 2.DATEPART() 函數 3.字元串截取--substring 三個參數,第一個參數需要截取的,第二個參數,截取字元串的起始位置(起始位置是1),第三個參數需要截取字元串的長度。 4.日 ...
  • 背景 資料庫中有一張叫 的表,每天都有幾百萬新的小姐姐插到表中,光陰荏苒,夜以繼日,日久生情,時間長了,表中就有了幾十億的 數據,看到幾十億的小姐姐,每到晚上,我可愁死了,這麼多小姐姐,我翻張牌呢? 辦法當然是精兵簡政,刪除那些 的,給年輕的小姐姐們留位置... 於是我在資料庫中添加了一個定時執行的 ...
  • 喜接新項目往往預示的會出一堆問題。解決問題的同時往往也就是學到更多東西的時候,這也許就是學習到新東西最直接最快速的方法吧! 小編經過努力,新項目終於過測試了,可是被蘋果大大給拒了,好苦啊,最近的審核真的是沒有誰了。這回被拒是因為項目中存在私有api,下圖為被拒信息。 這就坑了啊,這麼大一個項目,我如 ...
  • 本文微信公眾號「AndroidTraveler」首發。 背景 大多數應屆畢業生在大學期間使用的比較多的是 windows 電腦,因此初入職場如果拿到一臺蘋果電腦,可能一時間不能夠很快的上手。基於此,這邊出了系列視頻,通過實際的演示讓沒使用過蘋果電腦的小伙伴可以快速上手。 定位 適合以下小伙伴: 1. ...
  • CSS處理網頁時,它認為每個元素都包含在一個不可見的盒子里。• 為什麼要想象成盒子呢?因為如果把所有的元素都想象成盒子,那麼我們對網頁的佈局就相當於是擺放盒子。• 我們只需要將相應的盒子擺放到網頁中相應的位置即可完成網頁的佈局。 盒子模型 一個盒子我們會分成幾個部分:– 內容區(content)– ...
  • <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><form> <fieldset style="width:500px;"> <legend align="ce ...
  • &nbsp; 不斷行的空格 &ensp; 半方大的空格 &emsp; 全方大的空格 &lt; 小於 < &gt; 大於 > &amp; &符號 &quot; 雙引號" &copy; 版權符號© &reg; 已註冊商標® &trade; 商標(美國)TM &times; 乘號 × &divide; 除 ...
  • 當我們在做 SPA 應用的時候,為了相容老的瀏覽器(如IE9)我們不得不放棄 HTML5 browser history api 而只能採用 hash 路由的這種形式來實現前端路由,但是因為 hash 被路由占據了,導致本來不是問題的錨點功能卻成了一個不大不小的問題。 經過我自己的搜索目前有兩種方式 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...