hash與history的區(qū)別

hash與history的區(qū)別

兩種路由模式原因原因 對于 Vue 這類漸進式前端開發(fā)框架,
為了構建 SPA(單頁面應用)陕赃,
需要引入前端路由系統(tǒng)卵蛉,
這也就是 Vue-Router 存在的意義颁股。
前端路由的核心,就在于 —— 改變視圖的同時不會向后端發(fā)出請求傻丝。
因此有兩種路由

  1. hash: 即地址欄 URL 中的#符號(此 hash 不是密碼學里的散列運算)甘有。
    比如這個 URL:http://www.abc.com/#/hello
    hash 的值為 #/hello葡缰。它的特點在于:hash 雖然出現(xiàn)在 URL 中亏掀,
    但不會被包括在 HTTP 請求中,對后端完全沒有影響泛释,因此改變 hash 不會重新加載頁面滤愕。

  2. history: 利用了 HTML5 History Interface
    中新增的pushState()replaceState()方法。(需要特定瀏覽器支持)
    這兩個方法應用于瀏覽器的歷史記錄棧怜校,在當前已有的back间影、forward、go的基礎之上茄茁,
    它們提供了對歷史記錄進行修改的功能魂贬。只是當它們執(zhí)行修改時,雖然改變了當前的 URL裙顽,
    但瀏覽器不會立即向后端發(fā)送請求付燥。

hash 模式和 history 模式都屬于瀏覽器自身的特性,
Vue-Router 只是利用了這兩個特性
(通過調用瀏覽器提供的接口)來實現(xiàn)前端路由愈犹。

使用場景

一般場景下机蔗,hash 和 history 都可以,除非你更在意顏值甘萧,#
符號夾雜在 URL 里看起來確實有些不太美麗。

如果不想要很丑的 hash梆掸,我們可以用路由的 history 模式扬卷,這種模式充分利用
history.pushState API 來完成
URL 跳轉而無須重新加載頁面。

另外酸钦,根據(jù)Mozilla Develop Network
的介紹怪得,調用history.pushState()相比于直接修改hash,存在以下優(yōu)勢:

  • pushState()設置的新 URL 可以是與當前 URL 同源的任意 URL卑硫;而hash只可修改#
    后面的部分徒恋,因此只能設置與當前 URL 同文檔的 URL;
  • pushState()設置的新 URL 可以與當前 URL 一模一樣欢伏,這樣也會把記錄添加到棧中入挣;
    hash設置的新值必須與原來不一樣才會觸發(fā)動作將記錄添加到棧中;
  • pushState()通過stateObject參數(shù)可以添加任意類型的數(shù)據(jù)到記錄中硝拧;
    hash只可添加短字符串径筏;
  • pushState()可額外設置title屬性供后續(xù)使用葛假。
    當然啦,history也不是樣樣都好滋恬。
    SPA 雖然在瀏覽器里游刃有余聊训,但真要通過 URL 向后端發(fā)起 HTTP 請求時,
    兩者的差異就來了恢氯。尤其在用戶手動輸入 URL 后回車带斑,或者刷新(重啟)瀏覽器的時候。
  1. hash模式下勋拟,僅hash符號之前的內容會被包含在請求中勋磕,
    http://www.abc.com,因此對于后端來說指黎,即使沒有做到對路由的全覆蓋朋凉,
    也不會返回 404 錯誤。
  2. history模式下醋安,前端的 URL 必須和實際向后端發(fā)起請求的 URL 一致杂彭,
    http://www.abc.com/book/id
    。如果后端缺少對/book/id的路由處理吓揪,將返回 404 錯誤亲怠。
    Vue-Router 官網(wǎng)里如此描述:“不過這種模式要玩好,還需要后臺配置支持所以呢柠辞,
    你要在服務端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態(tài)資源团秽,
    則應該返回同一個 index.html
    頁面,這個頁面就是你 app 依賴的頁面叭首∠扒冢”

history缺點

  • 通過history api,我們丟掉了丑陋的#焙格,但是它也有個毛餐急稀:
    不怕前進,不怕后退眷唉,就怕刷新予颤,f5,
    (如果后端沒有準備的話),因為刷新是實實在在地去請求服務器的,不玩虛的冬阳。

  • 在hash模式下蛤虐,前端路由修改的是#中的信息,而瀏覽器請求時是不帶它玩的肝陪,
    所以沒有問題.但是在history下驳庭,你可以自由的修改path,當刷新時氯窍,
    如果服務器中沒有相應的響應或者資源嚷掠,會分分鐘刷出一個404來捏检。

小結

??結合自身例子,對于一般的Vue + Vue-Router + Webpack + XXX
形式的 Web 開發(fā)場景不皆,用history模式即可贯城,
只需在后端(Apache 或 Nginx)進行簡單的路由配置,
同時搭配前端路由的 404 頁面支持霹娄。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末能犯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子犬耻,更是在濱河造成了極大的恐慌踩晶,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枕磁,死亡現(xiàn)場離奇詭異渡蜻,居然都是意外死亡,警方通過查閱死者的電腦和手機计济,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門茸苇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沦寂,你說我怎么就攤上這事学密。” “怎么了传藏?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵腻暮,是天一觀的道長。 經(jīng)常有香客問我毯侦,道長哭靖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任侈离,我火速辦了婚禮试幽,結果婚禮上,老公的妹妹穿的比我還像新娘霍狰。我一直安慰自己,他們只是感情好饰及,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布蔗坯。 她就那樣靜靜地躺著,像睡著了一般燎含。 火紅的嫁衣襯著肌膚如雪宾濒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天屏箍,我揣著相機與錄音绘梦,去河邊找鬼橘忱。 笑死,一個胖子當著我的面吹牛卸奉,可吹牛的內容都是我干的钝诚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼榄棵,長吁一口氣:“原來是場噩夢啊……” “哼凝颇!你這毒婦竟也來了?” 一聲冷哼從身側響起疹鳄,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拧略,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘪弓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垫蛆,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年腺怯,在試婚紗的時候發(fā)現(xiàn)自己被綠了袱饭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓢喉,死狀恐怖宁赤,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情栓票,我是刑警寧澤决左,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站走贪,受9級特大地震影響佛猛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜坠狡,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一继找、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逃沿,春花似錦婴渡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至假消,卻和暖如春柠并,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工臼予, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸣戴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓粘拾,卻偏偏與公主長得像窄锅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子半哟,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容