vue部署后刷新白屏404?前端路由模式详解(hash和history)

news/2024/7/10 1:16:33 标签: vue, js, javascript, html5

文章目录

  • 前言
  • 一、为什么要有前端路由?
  • 二、前端路由模式
    • 1.hash
      • 优点
      • 缺点
    • 2.history
      • 优点
      • 缺点
  • 三、为什么history会404呢?
    • 1.原因
    • 2.解决方式
  • 总结


前言

不知道大家有没有遇到过一种情况,当自己的vue部署在服务器上时,一切都如想象办运转,然后脑袋duang的一下,突然想去刷新,然后网页就duang的一下,白屏了。

不出意外的话,我猜你用的一定是history的路由模式。

没错,这就是history中的一个问题,接下来让我们带着问题一起探索一下前端路由吧!

一、为什么要有前端路由?

对于 Vue 这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义。前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求。

二、前端路由模式

为了达到这一目的,浏览器当前提供了以下两种支持:

hash模式和history 模式,接下来让我们一起来分析一下这两种路由模式吧!

1.hash

hash 模式是一种把前端路由的路径用井号 # 拼接在真实 URL 后面的模式。当井号 # 后面的路径发生变化时,浏览器并不会重新发起请求,而是会触发 hashchange 事件。

即地址栏 URL 中的 # 符号。比如这个 URL:http://www.test.com/#/testhash 的值为 #/test。它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求 中,对后端完全没有影响,因此改变 hash 不会重新加载页面。

优点

  • 由于在hash模式下,仅hash符号之前的内容会被包含在请求中,即使在后端没有做到全覆盖,也不会造成影响而返回404错误
  • 兼容性较好,支持IE8

缺点

  • 路径带有#字符,比较丑陋,在现在这个追求用户体验的时代,大家都希望把用户体验提升到最佳。
  • 只能前进和后退一级路由。

2.history

history是利用了 HTML5 History Interface 中新增的 pushState()replaceState() 方法,允许开发者直接更改前端路由,即更新浏览器 URL 地址而不重新发起请求。

这两个方法应用于浏览器的历史记录栈,在当前已有的 backforwardgo 的基础之上,它们提供了对历史记录进行修改的功能。所以只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。

优点

  • 路径优美,不会携带#字符。
  • 前进后退操作可多级,例如 history.go(-2) 可回退两次。

缺点

  • 由于使用了H5的方法,所以兼容性较差,只支持IE10及以上。
  • 前端的 URL 必须和实际向后端发起请求的 URL 一致,否则需要服务端支持。

三、为什么history会404呢?

前面已经大致介绍了两种路由,那么为什么history路由在线上环境后刷新会404呢?

1.原因

SPA 虽然在浏览器里游刃有余,但真要通过 URL 向后端发起 HTTP 请求时,两者的差异就来了。尤其在用户手动输入 URL 后回车,或者刷新(重启)浏览器的时候。

  • 在 hash 模式下,仅 hash 符号(也就是#)之前的内容会被包含在请求中,如 http://www.test.com ,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误。
  • history 模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致,如 http://www.test.com/user/id。如果后端缺少对 /user/id 的路由处理,将返回 404 错误

2.解决方式

那么如果我就是嫌#太丑,就是想用history该怎么办呢?别慌,这就来!

我们可以在Nginx里面配置的 location / 中增加一行

try_files $uri /index.html;

$uri表示的是与当前路由匹配的内容,举个例子:

当前路由为http://www.test.com,此时$uri=http://www.test.com;

总结

通过对两种路由的了解,我们在解决了404问题的同时,也懂得了两种路由的实现原理,也对两种路由的使用方法有了更深层次的理解。


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

相关文章

手把手带你在vue中封装axios(含携带token)

文章目录前言一、认识axios1、axios是什么?2、为什么要用axios?特性二、封装axios1.引入库2.建立封装axios实例文件3.导入所需依赖4.创建axios实例5.axios拦截器请求拦截器响应拦截器5.封装成请求6.完整代码代码代码中的setLocalStorage和getLocalStorag…

防抖节流原理及实现(含演示图)

文章目录前言一、防抖(debounce)1、什么是防抖?2、防抖实现二、节流(throttle)1.什么是节流?2.节流实现总结前言 随着前端飞速的发展,用户体验也越来越重要。大家在逛一些网站时,会…

【css定位】超详细!手把手带你体验position属性(含sticky属性与效果图)

文章目录前言一、relative1.介绍2.场景相对自身定位二、absolute1.介绍2.场景相对于除static外的父元素定位父元素都是static相对于谁定位脱离文档流会占位吗三、fixed1.介绍2.场景四、sticky1.介绍2.场景总结前言 面试官:说说position的属性吧。 我:哦…

超超超超详细!手把手带你用js实现简易版position:sticky

文章目录一、基本思路二、实现过程1.准备工作1.获取dom元素,设置偏移量2.给滑动添加事件3.判断是否在可视区4.脱离可视区触发回调函数总结# 前言 前面我们在介绍position属性时(不知道的小伙伴可以去看看我的另一篇说position的博客哟,传送门…

一路摸爬滚打,我终于踏上了我的程序员之路!

我正在参与CSDN《新程序员》有奖征文活动,活动链接: https://marketing.csdn.net/p/52c37904f6e1b69dc392234fff425442 文章目录前言浑浑噩噩开学季自信心被重击虚度光阴初识编程你好,前端我的第一个轮播图期末课设前端是没有前途的开始前端之…

$set解决vue中修改数组或对象视图不更新的问题

文章目录前言一、案例二、解决方法$set总结前言 相信大家和我一样,在开发中总是遇到一个问题。 为啥我修改v-for遍历的数组,视图却没有更新???当我点击其他操作重新渲染后,又更新了?&#xff…

MongoDB入门学习

文章目录前言一、MongoDB是什么?二、MongoDB的基本操作1.基本指令2.插入文档3.查询文档4.修改文档5.删除文档6.简单操作总结前言 虽说现在关系型数据库还是主流,但是面对某些需求的时候,需要非关系型数据库来补充它,学习一个主流…

使用mongoose在express中操作数据库

文章目录前言一、Mongoose是什么?二、使用步骤1.引入库2.连接数据库3.操作数据库操作前的准备工作增加文档查询文档更新文档删除文档3.将增删查改操作写成接口总结前言 前面我们已经学会怎么去在命令行里操作数据库了,但是我们肯定不能让用户去操作命令…