Vue-router 中hash模式和history模式的区别

news/2024/9/3 0:32:26

咱们今天说说VUE路由的hash模式与history模式的区别,这个也是面试常问的问题,不要小看这道题其实问到这里的时候那个面试官应该是个大牛,开发经验丰富,这个题其实就是考验你的开发经验是否属实。

咱们来看看小白的回答。

小白回答:hash模式url带#号,history模式不带#号。

回答总结:这个回答其实和没有回答是一样,百度一下都知道了,官网文档也有,如果这样回答就能通过,那么那个面试官问这个问题又有什么意义呢?其实这个问题的意义是考验你的开发经验,与实际场景的应用和与后端人员的配合。

大牛解答:hash模式url里面永远带着#号,我们在开发当中默认使用这个模式。那么什么时候要用history模式呢?如果用户考虑url的规范那么就需要使用history模式,因为history模式没有#号,是个正常的url适合推广宣传。当然其功能也有区别,比如我们在开发app的时候有分享页面,那么这个分享出去的页面就是用vue或是react做的,咱们把这个页面分享到第三方的app里,有的app里面url是不允许带有#号的,所以要将#号去除那么就要使用history模式,但是使用history模式还有一个问题就是,在访问二级页面的时候,做刷新操作,会出现404错误,那么就需要和后端人配合让他配置一下apache或是nginx的url重定向,重定向到你的首页路由上就ok啦。

以上摘自:VUE路由的hash模式与history模式的区别?
官方介绍:HTML5 History 模式

关于Vue的路由一直以来个人都觉得是一件很神奇的事情,一个单页面应用居然可以做到多路由跳转并按需加载页面代码。以往的做法都是通过锚点来定位对应的页面代码,而这种古老的操作方式最大的问题就是首屏加载缓慢,一次性加载了所有页面代码。

那么Vue-router又是怎么实现的呢?

首先,这个router有两种模式:hash模式(默认)、history模式(需配置mode: ‘history’)
在这里插入图片描述

然后,我们来研究下两者的原理:

hash模式
我们先来认识下这位朋友#,这个#就是hash符号,中文名哈希符或锚点,当然这在我们前端领域姑且这么称呼。

然后哈希符后面的值,我们称之为哈希值。OK,接下来我们继续分析他的原理。路由的哈希模式其实是利用了window可以监听onhashchange事件,也就是说你的url中的哈希值(#后面的值)如果有变化,前端是可以做到监听并做一些响应(搞点事情),这么一来,即使前端并没有发起http请求他也能够找到对应页面的代码块进行按需加载。

后来人们给他起了一个霸气的名字叫前端路由,成为了单页应用标配。

大伙可以围观下网易云音乐的url模式:https://music.163.com/#/friend
history模式
我们先介绍一下H5新推出的两个神器:pushState与replaceState

具体自行百度,简而言之,这两个神器的作用就是可以将url替换并且不刷新页面,好比挂羊头卖狗肉,http并没有去请求服务器该路径下的资源,一旦刷新就会暴露这个实际不存在的“羊头”,显示404。

那么如何去解决history模式下刷新报404的弊端呢,这就需要服务器端做点手脚,将不存在的路径请求重定向到入口文件(index.html),前后端联手,齐心协力做好“挂羊头卖狗肉”的完美特效。

至此,我们的前端路由在实现与展示效果上又更进了一步!

总之,pushState方法不会触发页面刷新,只是导致history对象发生变化,地址栏会有反应。

总结
传统的路由指的是:当用户访问一个url时,对应的服务器会接收这个请求,然后解析url中的路径,从而执行对应的处理逻辑。这样就完成了一次路由分发。
而前端路由是不涉及服务器的,是前端利用hash或者HTML5的history API来实现的,一般用于不同内容的展示和切换。

history模式下,build之后本地 index.html 打开是无效的。

hash模式下,build之后本地 index.html 打开正常!


http://www.niftyadmin.cn/n/874736.html

相关文章

浪潮服务器u盘装机步骤_用U盘PE启动安装系统教程

本教程讲述如何通过优启通制作U盘PE启动盘来安装纯净无捆绑的系统镜像,U盘装系统的优点在于灵活性更强兼容性更好,支持BIOSMBR和EFIGPT下安装,即使原系统启动不了也能装。下面以安装装机工作室Win10系统为示例作演示,此方法也适用…

linux mysql 关闭ssl_MySql 关闭ssl

查看是否启用$ mysql -u root -pEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 3Server version: 5.7.12 MySQL Community Server (GPL)Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved…

http的“无连接”指的是_一份TCP、HTTP面试指南,常考点都给你了

来自:掘金,作者:白伟业链接:https://juejin.im/post/6844903592164343821TCP要说http就绕不开tcp,TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。但是&…

HTTP跨域请求的发两次的原因

开发项目当中,发现了一个请求发送了两次,很奇怪,我只调用了一次啊,在浏览器中查却是调用了两次 查了查百度搜到下面这段,顺便记录一下 浏览器的同源策略 就是出于安全考虑,浏览器会限制从脚本发起的跨域H…

python 图像mode是什么_骚操作 | 用 Python 实现 GIF 倒放

简介 提到 GIF,大家应该都比较熟悉,它与 JPG、PNG 等文件格式一样,可用于制作静态图像,但是 GIF 格式还具有一项独有技能:可以用于创建动态图像。不知大家有没有想过:如果将 GIF 倒放会是一种怎么样的景象&…

vue中使用js基于正则实现数字千分位用逗号分割

这个需求用到的还是蛮多,虽说我们有组件,可以直接代替,但是直接在js里,还是得需要自己封装一个函数,也方便复用嘛。 直接上代码吧 //数字千分位逗号分割 let c (item.value.toString().indexOf(.) ! -1) ? item.va…

C mysql connect_mysql-connect-c 简略配置

mysql-connect-c 简单配置真的很喜欢mysql的,小巧又强大,容易使用。这次因为项目需要,想要在windows的vs 2008下,用c语言连接mysql数据库。网上找到的是C的设置,将就吧,在参考与猜测之下,还真的…

element ui 上传组件 before-upload返回false自动调用before-remove on-remove钩子问题

在用elementUI的上传组件的时候,我们单纯的如下图所示可以筛选符合的格式上传 但存在个问题,他仍然可以自己选所有文件 在上传的 时候就会报错,这时只能在上传之前给他做个类型判断,当他上传不符合的类型事直接返回法false&#…