vue 项目挂载 刷新后报404

4 篇文章 0 订阅

咱们今天说说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啦。

以上摘自:hash模式和history模式的区别

这是HTML5 History 模式

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

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

首先,这个router有两种模式:hash模式(默认)、history模式(需配置mode: ‘history’)

  • hash与history的区别
#hashhistory
url显示有#,很Low无#,好看
回车刷新可以加载到hash值对应页面一般就是404掉了
支持版本支持低版本浏览器和IE浏览器HTML5新推出的API

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

  • 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 打开正常!

  • 解决方案

1.Vue2
mode:‘history’–>mode:‘hash’

2.Vue3(以下为报错内容,由jexus挂载)
在这里插入图片描述

将历史模式由当前的HTML5模式改为Hash模式:

import { createRouter, createWebHashHistory } from 'vue-router' 
const router = createRouter({
  history: createWebHistory(),
  routes: [
    //...
  ],
})

createWebHistory换成了createWebHashHistory,这样就完成了修改。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值