前端路由原理及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 一致

相关推荐
金灰4 分钟前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
茶卡盐佑星_6 分钟前
说说你对es6中promise的理解?
前端·ecmascript·es6
Манго нектар34 分钟前
JavaScript for循环语句
开发语言·前端·javascript
蒲公英100142 分钟前
vue3学习:axios输入城市名称查询该城市天气
前端·vue.js·学习
天涯学馆1 小时前
Deno与Secure TypeScript:安全的后端开发
前端·typescript·deno
以对_1 小时前
uview表单校验不生效问题
前端·uni-app
程序猿小D2 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
奔跑吧邓邓子3 小时前
npm包管理深度探索:从基础到进阶全面教程!
前端·npm·node.js
前端李易安3 小时前
ajax的原理,使用场景以及如何实现
前端·ajax·okhttp
汪子熙3 小时前
Angular 服务器端应用 ng-state tag 的作用介绍
前端·javascript·angular.js