路由
路由其实根据url分配不同的资源或者说对资源的一种定位,在前端三大框架(vue,react,angular)中分别使用了vue-router,react-router,angular/router去各自实现了自己的路由逻辑,但其实底层原理是一样的
hash路由
核心就是利用location.hash 和hashchange event去实现的前端路由跳转,同时链接上会有一个#号
// 在跳转后会得到跳转前和当前url
window.onhashchange = (e) => {
console.log(e.oldUrl, e.newUrl);
}
// 这样就可以触发hashchange回调了
location.hash = '#test';
特点:
- #是链接上的一部分,请求的时候如果不特意加上,不会被带到服务器
- hash刷新时,页面不会向服务器发送请求
- 每次hashchange的时候,都会在浏览器的访问历史中增加一个记录,所以可以通过浏览器的前进后退来管理页面
history路由
链接上不会有#,路由管理是通过popState和history api去管理的,hisotry的请求在每次刷新都会向服务器去请求,所以服务端要注意有一个兜底返回首页的操作
history api有以下几个api:
- history.go 可以指定返回的个数,-1就是返回上一级
- history.forward 前进到下一个路由
- history.back 返回上一个路由
- pushState 往路由中加入一个堆栈,并且跳转,不刷新页面
- replaceState 替换当前路由,不刷新页面
特点:
- 是一个常规的链接
- 只有pushState和replaceState不会去刷新页面
- popState不能监听到pushState和replaceState的事件
- 刷新页面向服务器请求资源,资源不存在会404,服务器要兜底
区别
- hash路由链接有hash,并且是一个纯客户端路由,history链接一般没hash,需要服务端进行兜底操作,否则页面会404
- api不同,hash路由监听hashchange,history监听popstate,并且history有提供比较多api进行页面跳转管理,hash需要自己去管理这些堆栈
- hash路由对seo不友好