後端實現的路由本質是通過伺服器**與路徑的配合去訪問伺服器上的靜態資源。
而我們現在的專案都是單頁面,路由控制權都是放在前端了。
前端框架現在都是單頁面模式,了解他們實現的本質變得重中之重。
前端實現路由有兩種方式 hash 與 history
hash原本是作為頁面定位使用,本身會在url後攜帶#,切換路由只改變#後面的值,他不會改變瀏覽器訪問伺服器資源的位址(#前的才會被用在請求中),所以改變hash值就像我們改變url引數一樣不會導致頁面的過載
history路由直接會更改url,沒有任何特殊符號參雜,瀏覽器會識別為訪問伺服器具體的路徑造成訪問404現象,所以我們一般會配置404重定向到index頁面,然後交由index頁面處理
思考:比如history模式上線我們都要配置服務端,請求不到路徑就走404,那每次路由跳轉應該都會404,走服務端的重定向,network裡都會有請求index.html才對,,而實際卻沒有,這是為什麼?
其實無論hash還是history內部都是除了首次載入路由完全脫離了瀏覽器控制,後續的頁面內的路由跳轉事件都是前端處理的,瀏覽器的位址列就相當於改了個樣式,並不會實際傳送請求到後端,也就不會經過**伺服器的的重定向。
框架中就是轉化我們的路由配置,如果是內部跳轉,根據我們跳轉的位址,改變相應的url的顯示,內部監聽這次轉變,對相應模組片段進行載入與解除安裝。如果是重新整理或者瀏覽器回車式載入等,就是訪問伺服器上的index頁面,再根據當前的url載入相應的片段
我們只需要呼叫location.hash就可以設定當前路由的hash值,接下來就是要監聽了,有兩種監聽方式
(_=>)(
)1. window.
onhashchange
=(e)
=>
2. window.
addeventlistener
('hashchange',(
)=>
)
然後就可以在方法中執行頁面的載入解除安裝
history 模式依靠呼叫 history.pushstate 方法以及監聽 popstate 事件
pushstate將url放入歷史記錄,顯示在路由中,replacestate將url替換當前的歷史記錄,都不會向後端發起請求。
pushstate 的時候,並不會觸發 popstate 事件, popstate只會監聽前進後退時候的變化,所以pushstate後就要根據url處理元件的邏輯,返回前進可以利用onpopstate來處理
(_=>
,null
,"index"
)...
// 首次元件處理})
()1. window.
onpopstate
=(e)
=>
2. window.
addeventlistener
('popstate',(
)=>
)
pushstate接收三個引數,一是傳遞的引數,二是頁面設定的標題,三是改變後的url
最近在用vue3,於是用vue3簡單實現乙個history 的 route hooks,僅供參考
import routeconfig from
'./custompage'
import
from
'vue'
// 簡單實現個路由hook
export
default
function
initroute()
:array
}routechange
(activeroute.value)
// 前進後退處理
window.
addeventlistener
('popstate'
,(e)
=>})
return activeroute
}const
routechange
=(routename: string)
=>,''
, routename)
activeroute.value=routename
}return
[ routeconfig,
getcomponent,
routechange
]}
// 渲染元件
"freshnum"
:is=
"activename"
>
<
/component>
const
[ routeconfig, getcomponent, routechange ]
=initroute()
const activename =
getcomponent()
// 當前選中元件名
const menulist: string[
]= object.
keys
(routeconfig)
// 路由選單
routechange()
//路由跳轉執行
兩種方式雖然有些不同,但是實現理念與效果差距並不大實際上的使用差距並不大。
前端路由的核心原理並不難,繼續往下要有很多細節的處理,理解了hash 和 history 兩種模式,可以幫我們更好的理解vue/react路由的運作原理
原生實現前端路由
在 web spa 中,前端路由描述的 url 與 ui 之間的單向對映關係,即 url 變化引起 ui 頁面的更新 無需重新整理頁面 上面我們提到,在前端路由中,當 url 發生變化時,我們需要在不重新整理頁面的情況下,觸發 ui 頁面的更新。因此,在實現前端路由時,我們需要解決以下兩個核心的問題...
前端路由實現原理
路由 router 這個概念最先是後端出現的,是用來跟後端伺服器進行互動的一種方式,通過不同的路徑,來請求不同的資源,請求不同的頁面是路由的其中一種功能。前端隨著 ajax 的流行,資料請求可以在不重新整理瀏覽器的情況下進行。非同步互動體驗中最盛行的就是 spa 單頁應用。單頁應用不僅僅是在頁面互動...
前端 前端路由優缺點以及實現
ssm時代,多頁面時代,需要頁面渲染模板,如 freemark,jsp 等模板引擎。前後端沒有分離時,路由是由後端處理的,瀏覽器接收到 do action的請求,傳到後台對應 spring mvc 會進行邏輯處理返回對應的頁面,實現路由的分發 return jsp 或者 return modelan...