博客地址: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. java 判断是否为中文字符,部分,。中文符号不能识别

    public static void main(String[] args) { int i = 0; for (char c : ",.判断一个字符串是否有中文一般情况是利用Unicode ...

  2. 分布式缓存技术redis学习系列

    分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...

  3. MFC多语言程序版本,在不同的windows系统上的使用

    如何使MFC程序界面支持多国语言?这次使用后给自己做一个总结. 我们使用vc6.0的版本来试验 1. 切换到资源视图,右键Dialog->Insert Copy 2. ok后,会出来一个语言的选 ...

  4. 解决:git push error: failed to push some refs to

    出现错误的原因是github中的README.md文件不在本地代码目录中. 也就是说我们需要先将远程代码库中的任何文件先pull到本地代码库中,才能push新的代码到github代码库中. 使用如下命 ...

  5. 负载,性能测试工具-Gatling

    前言 Gatling Gatling是一款功能强大的负载测试工具,它为易于使用,高可维护性和高性能而设计. 开箱即用,Gatling由于对HTTP协议的出色支持,使其成为负载测试任何HTTP服务器的首 ...

  6. java代码之美(11)---java代码的优化

    java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...

  7. 【效率神奇】Github丧心病狂的9个狠招

    Github,一个被业内朋友成为「全球最大的同性交友社区」的平台. 小时候遇到不会的字可以查新华字典.后来写作文我们可以通过作文书.或者文摘去找合适的素材.同样,写代码可以去Github上找适合自己的 ...

  8. 最详细的Windows平台安装MongoDB教程

    一.MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB将数据存储为一个文档,数据结构由键值(ke ...

  9. 小程序 wepy框架 + iview-weapp的用法

    最近在弄wepy的时候在想有没有什么ui比较合适一点的wepy的,也是在网上看了好久发现iview还不错.引用简单,上手超快,组件绚丽!当然,这里还介绍下微信官方建议的框架也是和不错的,有需要的可以看 ...

  10. U盘制作微pe工具箱(实战)

    分享人:广州华软 浩言 前言 相信大家平时生活中还是工作上使用电脑的时间还是比较多的,有时候电脑出现故障,比如系统文件损坏,没办法正常开机,或者是开机密码忘了,想要重装系统等,下面我推荐一个U盘启动项 ...