博客地址:https://ainyi.com/69

三月来了,春天还会远吗、、

在这里,隆重宣布本博客告别 Vue 传统的 hash 路由,迎接好看而优雅的 history 路由~~

映照官方说法

vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载

如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面

export default new Router({
mode: 'history',
routes: [...]
)}

当使用 history 模式时,URL 就像正常的 url,例如 https://ainyi.com/about,好看又优雅!

不过这种模式要玩好,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 https://ainyi.com/about 就会返回 404,因为后端没有 /about 相应的拦截器,自然 404

所以,要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是 app 依赖的页面

后端实现

本博客后端使用的是 java 的 ssm 框架,原本只做了后端接口,只提供接口

对于诸如 /about 的 url,SpringMVC 的 @RequestMapping() 没有做映射,自然是报 404 错误的

考虑到除了接口,其他访问的 history 全都是返回 404 页面,想到一个方法,就是直接做 404 页面的跳转转发,这就解决了 history 路由的问题

就是在 web.xml 中进行 404 页面的配置跳转,在 web-app 标签中配置 error-page

<web-app>
...
<!-- 未匹配到 url 的跳转页面,用于 vue history 路由,未匹配的路径自动转发到 index.html -->
<error-page>
<error-code>404</error-code>
<location>/index.html</location>
</error-page>
</web-app>

完美,

但又有一个问题出现了,点击跳转可以进入二级路由,例如进入了 https://ainyi.com/tag/vue

当点击刷新的时候,会报一个找不到资源的错误,也就是 js 静态资源没找到 qaq

这就要前端来解决这个问题

刷新找不到资源

由于之前是使用 hash 路由,npm run build 打包之后,直接打开 index.html 会报找不到资源的情况,这我在之前写的博客记录解决方案:https://ainyi.com/47

当时是这么做的:

文件路径出错解决:在 config 的 index.js 下 build 的设置:assetsPublicPath: ‘./’,

而如今变成 history 路由,此字段应设置成 assetsPublicPath: ‘/’

原因如下:

'./' 是指用户所在的当前目录(相对路径)
'/' 是指根目录,也就是项目的根目录
对于 hash 模式,根路径是固定的,就是项目的根目录
但是 history 模式下,以 / 开头的嵌套路径会被当作根路径
所以当使用 './' 引入文件,就会找不到文件了
因为文件本身就是在项目根目录下的,并不在嵌套 history 的路径目录下

设置好之后,重新打包,测试,部署上线,完美解决~

提醒

后端做了 404 页面自动跳转到 index.html 之后,服务器就不再返回 404 错误页面,因为对于所有路径都会返回 index.html 文件

为了避免这种情况,应该在 vue-router 里面设置无法匹配正确路由的情况跳转到前端的 404 页面

export default new Router({
mode: 'history',
routes: [
// TODO
{
path: '*',
component: () => import('../components/NotFound'),
name: 'NotFound',
meta: {title: '404 - 找不到页面'},
}
]
)}

博客地址:https://ainyi.com/69

告别 hash 路由,迎接 history 路由的更多相关文章

  1. 前端路由的两种模式: hash 模式和 history 模式

    随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...

  2. 【前端路由】Vue-router 中hash模式和history模式的区别

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

  3. 前端路由的两种模式:hash(#)模式和history模式(转)

    随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...

  4. 前端路由原理之 hash 模式和 history 模式

    什么是路由? 个人理解路由就是浏览器 URL 和页面内容的一种映射关系. 比如你看到我这篇博客,博客的链接是一个 URL,而 URL 对应的就是我这篇博客的网页内容,这二者之间的映射关系就是路由. 其 ...

  5. hash和history路由的区别

    在了解路由模式前,我们先看下 什么是单页面应用,vue-router  的实现原理是怎样的,这样更容易理解路由. SPA与前端路由 SPA(单页面应用,全程为:Single-page Web appl ...

  6. Router和History (路由控制)-backbone

    Router和History (路由控制) Backbone.Router担任了一部分Controller(控制器)的工作,它一般运行在单页应用中,能将特定的URL或锚点规则绑定到一个指定的方法(后文 ...

  7. 如何去除vue项目中的 # — vue路由的History模式

    前言 在创建的 router 对象中,如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化为 #! 开头. 添加 mode: 'history' 之后将使用 HTML5 his ...

  8. history路由模式下的nginx配置

    路由模式 众所周知,浏览器下的单页面应用的路由模式有下面两种: hash 模式和 history 模式.hash 模式通用性好,而且不依赖服务器的配置,省心省力,但是缺点是不够优雅.相比于 hash ...

  9. 单页面应用的History路由模式express后端中间件配合

    这篇文章主要分享一下通过HTML5的history API的时候,使用NodeJS后端应该如何配置,来避免产生404的问题,这里是使用的express的框架,主要是通过connect-history- ...

随机推荐

  1. Spring事务管理----事物回滚

    Spring的事务管理默认只对未检查异常(java.lang.RuntimeException及其子类)进行回滚,如果一个方法抛出Checked异常,Spring事务管理默认不进行回滚. 改变默认方式 ...

  2. 解决 'boost/iterator/iterator_adaptor.hpp' file not found’ 及控制台":CFBundleIdentifier", Does Not Exist

    "react-native": "0.46.1" 这个问题产生原因: * /Users/Vanessa/.rncache 中 boost_1_63_0.tar. ...

  3. Charles 如何破解与连接手机进行抓包

    破解charles: 由于本人工作原因,现使用的为mac笔记本,但是基本的使用原理都是一样的,以下为如何破解charles与连接手机进行抓包详解.工具如有需要着请留言. 当前下载使用的版本为:char ...

  4. 【SAP HANA】新建表以及操作数据(3)

    账号和数据库都创建好之后,接下来就可以创建表了.来见识一下这个所谓“列式”存储方式的表是长啥样的! 一.可视化新建表 然后输入所需栏位,设置好类型和长度: 上图右上角可以看到类型是Column Sto ...

  5. 基于ZigBee模块与51单片机之间的简化智能家居项目简介(学生版本)

    5月份学校举行比赛,我们团队报名<智能家居>的项目,设计的总体思路用:QT写的上位机与ZigBee无线通信加51作为终端的简易版智能家居 电路连接:PC机->cc2530(协调器)- ...

  6. ASP.NET Core 项目实战(持续更新~~~)

    一.前言 准备写这个系列文章的设想开始于今年9月,毫无意外,期间又又又又拖了很长时间,文章主要是为了记录自己学习使用 ASP.NET Core Web API 与 Vue 创建一个前后端分离的项目的整 ...

  7. 【JVM虚拟机】(5)---深入理解JVM-Class中常量池

    深入理解Class---常量池 一.概念 1.jvm生命周期 启动:当启动一个java程序时,一个jvm实例就诞生了,任何一个拥有main方法的class都可以作为jvm实例运行的起点. 运行:mai ...

  8. python爬虫踩坑教程

    我们的目标是爬取下面这个个网址上的2010~2018年的数据 http://stockdata.stock.hexun.com/zrbg/Plate.aspx?date=2015-12-31 获取我们 ...

  9. 小程序顶部navbar(非Slider)

    wxml(该导航栏的实现原理是当你要显示哪个view在最前端的时候隐藏其他的view): <!-- 顶部navbar导航栏 --> <view class="navbar& ...

  10. Python之路【第八篇】:Python模块

    阅读目录 一.模块和包 模块(module)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到 ...