
在早期 Web 前端還沒那麼強大的時候,一直都是由後端主導路由,例如 JSP、PHP 等等,在不同的網址對伺服器發出請求,取得 HTML 後渲染到網頁上同時刷新頁面。這種做法直到 SPA 的出現才逐漸改變。
SPA 全名為 Single Page Application(單頁應用程式),這種做法使用 Ajax 不斷渲染網頁,網站也不必每頁都向伺服器發出請求,使得使用者體驗更好、不過相對的對 SEO 效果較差。
有了 SPA 後,前端路由也隨之誕生。
在網頁上我們習慣使用上下頁來切換網頁,不過在 SPA 的網頁上一切都是使用 JavaScript 來渲染,哪來的上下頁?好家在我們可以使用 Hash 和 HTML5 新規範所提供的 History API 來達成。如果有玩過 vue-router 的話應該會發現有這兩種模式可以選。
以下簡單講兩者的特點:
hash 是存在 URL 上的一種狀態,也就是 URL 中從 # 開始的字串,例如下面的網址:
https://example.com#123
hash 的特性是不會重新整理網頁,也可透過 hashchange 事件、或瀏覽器的上下頁來取得 hash。
window.addEventListener('hashchange', (e) => {
console.log(window.location.hash)
})
在有 HTML5 規範後的 History 模式以前,大部分都是使用 Hash 模式。
另外使用 Hash 模式的缺點是網址醜、會導致錨點失效。
History 模式就是我們平常看到沒有帶 # 的網址,前端框架中的路由大部分都是透過 history 這個 API 來完成。
較為重要的 API 是這三個:
history.pushState: 添加新的狀態。history.replaceState: 取代當前狀態。popstate:執行上下頁時觸發。pushState 能讓我們新增新的狀態(歷史紀錄)、同時不重整頁面,pushState 可以帶三個參數:
state:合法的 Javascript 对象,可以用在 popstate 事件中。title:瀏覽器忽略參數、可以傳 null 替代。url:歷史紀錄的 URL。history.pushState({ name: "qq" }, null, "qq.html");
方法與 pushState 相同,差別在於 會取代最新的一筆狀態。
123 會在執行上下頁時觸發,下面的 log 會印出上面兩種方法的 state,也就是 { name: "qq" } 這段。
window.addEventListener("popstate", function (e) {
console.log(e.state);
});