vue路由hash和history

一辫继、路由原理

1腔召、SPA

SPA,即單頁面應(yīng)用(Single Page Application)搂抒。就是只有一張 web頁面的應(yīng)用艇搀。單頁應(yīng)用程序 (SPA) 是加載單個html頁面并在用戶與應(yīng)用程序交互時動態(tài)更新該頁面的web應(yīng)用程序。瀏覽器一開始會加載必需的html求晶、css和 js 焰雕,所有的操作都在這張頁面上完成,都由js來控制

2誉帅、什么時候需要路由

對于現(xiàn)代開發(fā)的項目來說淀散,稍微復(fù)雜一點的SPA,都需要用到路由蚜锨。而 vue-roter 正是 vue 的路由標(biāo)配档插,且 vue-router 有兩種模式hashhistory

二亚再、Hash模式

1郭膛、定義

hash 模式是一種把前端路由的路徑用井號 # 拼接在真實 url 后面的模式。當(dāng)井號 # 后面的路徑發(fā)生變化時氛悬,瀏覽器并不會重新發(fā)起請求则剃,而是會觸發(fā) onhashchange 事件。

2如捅、網(wǎng)頁url組成部分

(1)了解幾個url的屬性

屬性 含義
location.protocal 協(xié)議
location.hostname 主機(jī)名
location.host 主機(jī)
location.port 端口號
location.patchname 訪問頁面
location.search 搜索內(nèi)容
location.hash 哈希值

(2)演示

下面用一個網(wǎng)址來演示以上屬性:

//http://127.0.0.1:8001/01-hash.html?a=100&b=20#/aaa/bbb
location.protocal // 'http:'
localtion.hostname // '127.0.0.1'
location.host // '127.0.0.1:8001'
location.port //8001
location.pathname //'01-hash.html'
location.serach // '?a=100&b=20'
location.hash // '#/aaa/bbb'

3棍现、hash的特點

  • hash變化會觸發(fā)網(wǎng)頁跳轉(zhuǎn),即瀏覽器的前進(jìn)和后退镜遣。
  • hash 可以改變 url 己肮,但是不會觸發(fā)頁面重新加載(hash的改變是記錄在 window.history 中),即不會刷新頁面悲关。即所有頁面的跳轉(zhuǎn)都是在客戶端進(jìn)行操作谎僻。因此,這并不算是一次 http 請求寓辱,所以這種模式不利于 SEO 優(yōu)化艘绍。hash 只能修改 # 后面的部分,所以只能跳轉(zhuǎn)到與當(dāng)前 url 同文檔的 url 秫筏。
  • hash 通過 window.onhashchange 的方式诱鞠,來監(jiān)聽 hash 的改變挎挖,借此實現(xiàn)無刷新跳轉(zhuǎn)的功能。
  • hash 永遠(yuǎn)不會提交到 server 端(可以理解為只在前端自生自滅)般甲。

三肋乍、History模式

1、定義

history APIH5 提供的新特性敷存,允許開發(fā)者直接更改前端路由墓造,即更新瀏覽器 URL 地址而不重新發(fā)起請求

2锚烦、與hash的區(qū)別

hashhistory 在瀏覽器下刷新時的區(qū)別:

正常頁面瀏覽

https://github.com/xxx 刷新頁面

https://github.com/xxx/yyy 刷新頁面

https://github.com/xxx/yyy/zzz 刷新頁面

改造H5 history模式

https://github.com/xxx 刷新頁面

https://github.com/xxx/yyy 前端跳轉(zhuǎn)觅闽,不刷新頁面

https://github.com/xxx/yyy/zzz 前端跳轉(zhuǎn),不刷新頁面

3涮俄、history的API

HTML5新增的API:

API 定義
history.pushState(data, title [, url]) pushState主要用于往歷史記錄堆棧頂部添加一條記錄蛉拙。各參數(shù)解析如下:①data會在onpopstate事件觸發(fā)時作為參數(shù)傳遞過去;②title為頁面標(biāo)題彻亲,當(dāng)前所有瀏覽器都會忽略此參數(shù)孕锄;③url為頁面地址,可選苞尝,缺少時表示為當(dāng)前頁地址
history.replaceState(data, title [, url]) 更改當(dāng)前的歷史記錄畸肆,參數(shù)同上; 上面的pushState是添加宙址,這個更改
history.state 用于存儲以上方法的data數(shù)據(jù)轴脐,不同瀏覽器的讀寫權(quán)限不一樣
window.onpopstate 響應(yīng)pushState或者replaceState的調(diào)用

4、history的特點

主要有以下特點:

  • 新的 url 可以是與當(dāng)前 url 同源的任意 url 抡砂,也可以是與當(dāng)前 url 一樣的地址大咱,但是這樣會導(dǎo)致的一個問題是,會把重復(fù)的這一次操作記錄到棧當(dāng)中注益。
  • 通過 history.state 碴巾,添加任意類型的數(shù)據(jù)到記錄中。
  • 可以額外設(shè)置 title 屬性丑搔,以便后續(xù)使用厦瓢。
  • 通過 pushStatereplaceState 來實現(xiàn)無刷新跳轉(zhuǎn)的功能低匙。

5、存在問題

對于 history 來說碳锈,確實解決了不少 hash 存在的問題顽冶,但是也帶來了新的問題:

  • 使用 history 模式時,在對當(dāng)前的頁面進(jìn)行刷新時售碳,此時瀏覽器會重新發(fā)起請求强重。如果 nginx 沒有匹配得到當(dāng)前的 url 绞呈,就會出現(xiàn) 404 的頁面。
  • 而對于 hash 模式來說间景, 它雖然看著是改變了 url 佃声,但不會被包括在 http 請求中。所以倘要,它算是被用來指導(dǎo)瀏覽器的動作圾亏,并不影響服務(wù)器端。因此封拧,改變 hash 并沒有真正地改變 url 志鹃,所以頁面路徑還是之前的路徑, nginx 也就不會攔截泽西。
  • 因此曹铃,在使用 history 模式時,需要通過服務(wù)端來允許地址可訪問捧杉,如果沒有設(shè)置陕见,就很容易導(dǎo)致出現(xiàn) 404 的局面。

6味抖、兩者選擇

在實際的項目中评甜,如何對這兩者進(jìn)行選擇:

  • to B 的系統(tǒng)推薦用 hash ,相對簡單且容易使用非竿,且因為 hashurl 規(guī)范不敏感
  • to C 的系統(tǒng)蜕着,可以考慮選擇 H5 history ,但是需要服務(wù)端支持
  • 能先用簡單的红柱,就別用復(fù)雜的
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末承匣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锤悄,更是在濱河造成了極大的恐慌韧骗,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件零聚,死亡現(xiàn)場離奇詭異袍暴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)隶症,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門政模,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚂会,你說我怎么就攤上這事淋样。” “怎么了胁住?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵趁猴,是天一觀的道長刊咳。 經(jīng)常有香客問我,道長儡司,這世上最難降的妖魔是什么娱挨? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮捕犬,結(jié)果婚禮上跷坝,老公的妹妹穿的比我還像新娘。我一直安慰自己或听,他們只是感情好探孝,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著誉裆,像睡著了一般顿颅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上足丢,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天粱腻,我揣著相機(jī)與錄音,去河邊找鬼斩跌。 笑死绍些,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耀鸦。 我是一名探鬼主播柬批,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袖订!你這毒婦竟也來了氮帐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤洛姑,失蹤者是張志新(化名)和其女友劉穎上沐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楞艾,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡参咙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了硫眯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蕴侧。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖两入,靈堂內(nèi)的尸體忽然破棺而出净宵,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布塘娶,位于F島的核電站,受9級特大地震影響痊夭,放射性物質(zhì)發(fā)生泄漏刁岸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一她我、第九天 我趴在偏房一處隱蔽的房頂上張望虹曙。 院中可真熱鬧,春花似錦番舆、人聲如沸酝碳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疏哗。三九已至,卻和暖如春禾怠,著一層夾襖步出監(jiān)牢的瞬間返奉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工吗氏, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留芽偏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓弦讽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親往产。 傳聞我的和親對象是個殘疾皇子被碗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容