当提到路由的时候你会想到什么? 路由器?简单来讲,路由就是URL
到函数的映射前端
路由这个概念最早是后端出现的vue
HTML
页面返回给客户端显示URL
,当你输入URL的时候会将这个URL
发送到服务器,服务器经过正则进行匹配处理,最终生成HTML和数据返回给前端JSP
等页面进行修改,这种状况下HTML
页面代码和逻辑会混合在一块儿,不管是编写仍是维护都很糟糕和麻烦SPA
(单页Web
应用)中,单纯的浏览器地址改变, 利用了JavaScript
动态变换网页内容,网页不会重载Web
网页中, 页面的切换就是视图之间的切换SPA
最主要的特色就是在先后端分离基础上加了一层前端路由URL
,可是页面不进行总体的刷新说了这么多,那该如何实现呢?接下来讲到的hash
(哈希)模式和history
模式就是前端路由的实现方式react
hash
是URL
中hash(#)
及后面的那部分,经常使用做锚点在页面内进行导航,改变URL
中的hash
部分不会引发页面刷新#
号后面的路径对服务端发起路由请求,也就是说当你请求一个https://juejin.cn/#123
和https://juejin.cn/
其实到服务端都是去请求https://juejin.cn/
这个页面的内容hash
的改变会经过触发hashchange
事件监听URL
的变化,来渲染对应的页面,经过浏览器前进后退改变URL
、经过标签改变URL
、经过window.location
改变URL
,这几种状况改变URL
都会触发hashchange
事件经常使用的APIvue-router
window.location.hash = '123' // 设置 url 的hash,会在当前url后加上 '#123'
let hash = window.location.hash
console.log(hash) //#123
window.addEventListener('hashchange', function(){
// 监听hash变化
})
复制代码
window.history
属性指向history
对象,它表示当前窗口的浏览历史history
对象保存了当前窗口访问过的全部页面网址,经过window.history.length
能够得出当前窗口一共访问过几个网址,经过window.history.state
能够获得History
堆栈最上层的状态值window.history.length //4
window.history.state //null
复制代码
在history
模式中,URL
不带#
号,那他看起来就和一般的URL
同样了,那该如何改变URL
不引发页面刷新呢?后端
那么就须要用到在HTML5
的规范中,history
对象新增了的pushState
和replaceState
两个方法, 这两个方法都接受三个参数(state, title, url)
跨域
state
:须要保存的数据对象,经过pushState
方法能够将该对象内容传递到新页面中title
:指标题,但通常用不到,没有浏览器能够支持填null
便可url
:设定新的历史记录的url
,必须与当前页面处在同一个域,不指定的话则为当前的路径,若是设置了一个跨域网址,则会报错,这样设计的目的是,防止恶意代码让用户觉得他们是在另外一个网站上,由于这个方法不会致使页面跳转,url
能够是绝对路径,也能够是相对路径let state={
app:'sth'
}
window.history.pushState(state, '', '')
console.log(window.history.state) //{app:"sth"}
console.log(window.history.length)//每执行一次pushState则会改变
复制代码
url
设置了跨域网址则会报错let state={
app:'sth'
}
window.history.replaceState(state, '', '')
console.log(window.history.state) //{app:"sth"}
console.log(window.history.length)//每执行replaceState不会改变
复制代码
因为history.pushState()
和history.replaceState()
能够改变url
同时,不会刷新页面,因此在HTML5
中的histroy
也具有了实现前端路由的能力浏览器
hash | history | |
---|---|---|
外观 | 有些许丑 | 比较优雅 |
兼容性 | 兼容性较好,能够兼容IE8 | 兼容性相对较差 |
锚点功能 | 由于是在url加#致使锚点失效 | 有效 |
设置URL | 由于只可修改#后面的hash因此只可设置与当前同文档的 URL | 设置的新 URL 能够是与当前 URL 同源的任意 URL |
刷新限制 | 无需服务端配合 | 须要服务端配合 |
(vue-router,react-router)
,框架增长了不少特性,如动态路由、路由参数、路由动画等等,这些致使路由实现变的复杂前端路由是什么东西?markdown