前端路由原理及hash模式和history模式和Abstract模式

1.前端路由原理:

前端路由的核心在于改变视图的同时不会向后端发出请求,而是去加载路由对应的组件;

vue-router是将组件映射到路由,然后在渲染出来,并且实现Hash、History、Abstract这三种模式,一般默认Hash模式。

2.Hash模式、History模式、Abstract模式

2.1 Hash模式:

Hash模式是指url尾巴后的 # 号以及后面的字符。hash虽然出现在url中,但不会被包括在http请求中,对后端完全没有影响,因此改变hash不会被重新加载页面。

原理:

基于浏览器的hashchange事件,地址变化时,通过window.location.hash获取地址上的hash值,并通过构造Router类,配置routes对象设置hash值与对应的组件内容。

优点:

1.hash值会出现在url中,但是不会被包含在Http请求中,因此hash值改变不会重新加载页面

2.hash改变会触发hashchange事件,能控制浏览器的前进后退

3.兼容性好

缺点:

1.地址栏中携带 # ,不美观

2.只可修改 # 后面的部分,因此只能设置与当前url同文档的 url

3.hash有体积限制,只能添加短字符串

4.设置的新值必须与原来不一样才会触发hashchange事件,并将记录添加到栈中

5.每次url的改变不属于一次http请求,所以不利于SEO优化

2.2 History模式:

在history模式中url就像正常的url,不过这种模式需要后台配置的支持,因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器中直接访问的时候就会返回404;(类似格式:http://CSDN/user/123456)

原理:

基于HTML5新增的pushState()和replaceState()两个api,以及浏览器的popstate事件,地址变化时,通过window.location.pathname找到对应的组件。并通过构造Router类,配置routes对象设置pathname值与对应的组件内容

优点:

1.没有 # ,更美观

2.pushState()设置的新url 可以是与当前url 同源的任意url

3.pushState()设置的新url 可以与当前url一模一样,这样也会把记录添加到栈中

4.pushState()通过stateObject参数可以添加任意类型的数据到记录中

5.pushState()可额外设置title属性拱后续使用

6.浏览器的前进后退能触发浏览器的popstate事件,获取window.location.pathname来控制页面的变化

缺点:

  1. URL的改变属于http请求,借助history.pushState实现页面的无刷新跳转,因此会重新请求服务器。所以前端的 URL 必须和实际向后端发起请求的 URL 一致。如果用户输入的URL回车或者浏览器刷新或者分享出去某个页面路径,用户点击后,URL与后端配置的页面请求URL不一致,则匹配不到任何静态资源,就会返回404页面。所以需要后台配置支持,覆盖所有情况的候选资源,如果 URL 匹配不到任何静态资源,则应该返回app 依赖的页面或者应用首页。

  2. 兼容性差,特定浏览器支持

2.3 Abstract模式:

Abstract模式支持所有的js运行模式。vue-router自身会对环境做校验,如果发现没有浏览器的API,路由会自动强制进入abstract模式,在移动端原生环境中也是使用abstract模式。

**修改路由模式:**在实例化路由对象时,传入mode选项和值修改。

哈希路由和history路由的区别和原理:

路由模块的本质就是建立起url和页面之间的映射关系,"更新视图但不重新请求页面"是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有两种方式:利用 url 中的hash('#') 和利用History在 Html5中新增的方法

hash模式:在浏览器中符号 # 以及 # 后面的字符称之为hash ,用window.location.hash读取,使用hashchange事件来监听hash值的变化,从而对页面进行跳转(渲染)

History模式:history模式采用html5的新特性,并且提供了两个新的方法:pushState(), replaceState()可以对浏览器历史记录栈进行修改,以及popState事件可以监听状态变更;

为什么history模式下路由跳转会报404

  1. URL的改变属于http请求,借助history.pushState实现页面的无刷新跳转,因此会重新请求服务器

  2. 所以前端的 URL 必须和实际向后端发起请求的 URL 一致

相关推荐
小码哥_常6 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮8 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
她说可以呀9 小时前
Vue插槽
前端·javascript·vue.js
qq_448011169 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan10 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_9583529010 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝11 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing0312 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel12 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放12 小时前
Python基础语法练习题(73)
java·前端·python