为了构建 SPA(单页面应用)
前端路由的核心,
改变视图的同时不会向后端发出请求
前端路由模式有两种:
hash 模式 和 history 模式
两者分别利用浏览器自由特性
实现单页面导航
hash 模式:
window.location 或 a 标签改变锚点值,
window.hashchange() 监听锚点变化
history 模式:
history.pushState()、history.replaceState() 定义目标路由,
window.onpopstate() 监听浏览器操作导致的 URL 变化
React Router 匹配路由由 mathPath 通过 path-to-regexp 进行,
<Route> 相当于一个高阶组件,
以不同的优先级和匹配模式渲染匹配到的子组件
hash
url #
history
HTML5 History - pushState() 和 replaceState()
history.pushState URL 跳转而无须重新加载页面
相比于直接修改 hash,存在以下优势:
新 URL 可以是与当前 URL 同源的任意 URL;
只可修改 # 后面的部分,
因此只能设置与当前 URL 同文档的 URL;
新 URL 可以与当前 URL 一模一样,这样也会把记录添加到栈中;
新值必须与原来不一样才会触发动作将记录添加到栈中;
通过 stateObject 参数可以添加任意类型的数据到记录中;
只可添加短字符串;
pushState() 可额外设置 title 属性供后续使用。
SPA 虽然在浏览器里游刃有余,
但真要通过 URL 向后端发起 HTTP 请求时,
两者的差异就来了。
尤其在用户手动输入 URL 后回车,
或者刷新(重启)浏览器的时候。
个人在接入微信的一个活动开发过程中
开始使用的hash模式,
但是后面后端无法获取到我#后面的url参数,
于是就把参数写在#前面,
但是讨论后还是决定去掉这个巨丑的#
于是乎改用history模式,
但是开始跑流程的时候是没问题,
但是后来发现跳转后刷新或者回跳,
会报一个404的错误,找不到指定的路由,
最后后端去指向正确的路由
加了/hd/xxx 去匹配是否有这个/hd/{:path}
才得以解决
总结**
1 hash 模式下,
仅 hash 符号之前的内容会被包含在请求中,
如 [http://www.abc.com](https://link.zhihu.com/?target=http%3A//www.abc.com),
因此对于后端来说,
即使没有做到对路由的全覆盖,
也不会返回 404 错误。
2 history 模式下,
前端的 URL 必须和实际向后端发起请求的 URL 一致,
如[http://www.abc.com/book/id](https://link.zhihu.com/?target=http%3A//www.abc.com/book/id)
如果后端缺少对 /book/id 的路由处理,
将返回 404 错误。
Vue-Router 官网里如此描述:
“不过这种模式要玩好,还需要后台配置支持……
所以呢,你要在服务端增加一个覆盖所有情况的候选资源:
如果 URL 匹配不到任何静态资源,
则应该返回同一个 index.html 页面,
这个页面就是你 app 依赖的页面。”
3 结合自身例子,
对于一般的 Vue + Vue-Router + Webpack + XXX 形式的 Web 开发场景,
用 history 模式即可,
只需在后端(Apache 或 Nginx)进行简单的路由配置,
同时搭配前端路由的 404 页面支持。
网友评论