前端路由模式详解

uniapp打包H5时如何优化URL结构:去除#符号的实战指南 本文详细介绍了如何优化UniApp打包H5应用时的URL结构,通过将默认的Hash路由模式切换为History模式,从而去除地址栏中的“#”符号。指南涵盖了从manifest.json配置、自定义HTML模板创建,到关键的服务器端(以Nginx为例)部署配置的全流程,并提供了常见问题排查方法,旨在提升H5应用的专业度与SEO友好性。 阅读详情

一、路由模式解析

  要讲vue-router的路由模式,首先要了解的一点就是路由是由多个URL组成的,使用不同的URL可以相应的导航到不同的位置。

  如果有进行过服务器开发或者对http协议有所了解就会知道,浏览器中对页面的访问是无状态的,所以我们在切换不同的页面时都会重新进行请求。而实际使用vue和vue-router开发就会明白,在切换页面时是没有重新进行请求的,使用起来就好像页面是有状态的,这是什么原因呢。

  这其实是借助了浏览器的History API来实现的,这样可以使得页面跳转而不刷新,页面的状态就被维持在浏览器中了。

  vue-router中默认使用的是hash模式,也就是会出现如下的URL:,URL中带有#号

  我们可以用如下代码修改成history模式:

import Vue from 'vue'
import Router from 'vue-router'
import Main from '@/components/Main'
Vue.use(Router)

export default new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      component: Main
    }
  ]
})

  这样子URL中的#号就被去除了。

  实际上存在三种模式:

  Hash: 使用URL的hash值来作为路由。支持所有浏览器。

  History: 以来HTML5 History API 和服务器配置。参考官网中HTML5 History模式

  Abstract: 支持所有javascript运行模式。如果发现没有浏览器的API,路由会自动强制进入这个模式。

二、两种模式的区别

1、hash模式

  hash模式背后的原理是onhashchange事件,可以在window对象上监听这个事件:

window.onhashchange = function(event){
    console.log(event.oldURL, event.newURL);
    let hash = location.hash.slice(1);
    document.body.style.color = hash;
}

  上面的代码可以通过改变hash来改变页面字体颜色,虽然没什么用,但是一定程度上说明了原理。

  更关键的一点是,因为hash发生变化的url都会被浏览器记录下来,从而你会发现浏览器的前进后退都可以用了,同时点击后退时,页面字体颜色也会发生变化。这样一来,尽管浏览器没有请求服务器,但是页面状态和url一一关联起来,后来人们给它起了一个霸气的名字叫前端路由,成为了单页应用标配。

  我们写个简单的方法来测试一下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div>测试一下</div>
    <script type="text/javascript">
        window.onhashchange = function(event){
            console.log(event.oldURL,event.newURL)
            let hash = location.hash.slice(1);
            document.body.style.color = hash;
        }
    </script>
</body>
</html>

 

  并且通过浏览器的前进、后退页面均可以变化。

  网易云音乐,百度网盘就采用了hash路由,看起来就是这个样子:

http://music.163.com/#/friend
https://pan.baidu.com/disk/home#list/vmode=list

 2、history路由

  随着history api的到来,前端路由开始进化了,前面的hashchange,你只能改变#后面的url片段,而history api则给了前端完全的自由

  history api可以分为两大部分:切换和修改

(1)切换历史状态

  包括back、forward、go三个方法,对应浏览器的前进,后退,跳转操作,有同学说了,(谷歌)浏览器只有前进和后退,没有跳转,嗯,在前进后退上长按鼠标,会出来所有当前窗口的历史记录,从而可以跳转(也许叫跳更合适):

history.go(-2);//后退两次
history.go(2);//前进两次
history.back(); //后退
hsitory.forward(); //前进

(2)修改历史状态

  包括了pushState、replaceState两个方法,这两个方法接收三个参数:stateObj,title,url

history.pushState({color:'red'}, 'red', 'red')

window.onpopstate = function(event){
    console.log(event.state)
    if(event.state && event.state.color === 'red'){
        document.body.style.color = 'red';
    }
}

history.back();

history.forward();

 

  通过pushstate把页面的状态保存在state对象中,当页面的url再变回这个url时,可以通过event.state取到这个state对象,从而可以对页面状态进行还原,这里的页面状态就是页面字体颜色,其实滚动条的位置,阅读进度,组件的开关的这些页面状态都可以存储到state的里面。

  通过history api,我们丢掉了丑陋的#,但是它也有个毛病:

  不怕前进,不怕后退,就怕刷新,f5,(如果后端没有准备的话),因为刷新是实实在在地去请求服务器的。

  在hash模式下,前端路由修改的是#中的信息,而浏览器请求时是不带它玩的,所以没有问题。但是在history下,你可以自由的修改path,当刷新时,如果服务器中没有相应的响应或者资源,会分分钟刷出一个404来。

(3)popstate实现history路由拦截,监听页面返回事件

  当活动历史记录条目更改时,将触发popstate事件。

  1、如果被激活的历史记录条目是通过对  history.pushState()  的调用创建的,或者受到对  history.replaceState()  的调用的影响,popstate事件的state属性包含历史条目的状态对象的副本。

  2、需要注意的是调用  history.pushState()  或  history.replaceState()  用来在浏览历史中添加或修改记录,不会触发popstate事件;

  只有在做出浏览器动作时,才会触发该事件,如用户点击浏览器的回退按钮(或者在Javascript代码中调用history.back())

  我们测试一下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div>测试一下</div>
    <script type="text/javascript">
        if (window.history && window.history.pushState) {
           window.onpopstate = function(event) {
              console.log("location: " + document.location + ", state: " + JSON.stringify(event.state));
              //window.history.go(1)
              //window.history.back()
           };
         
           //window.addEventListener("popstate", function(e) {
           //   window.location = 'http://www.baidu.com';
           //}, false);
         
           !function() {
              var state = {
                 title: "title",
                 url: "#"
              };
              window.history.pushState(state, "title", "#");
           }();
        }
    </script>
</body>
</html>

  刷新时不打印,刷新多次,再后退,每次都有,直到为null

RuoYi前后端分离框架将前端dist资源集成到Jar包中独立部署 将ruoyi-ui前端工程编译打包后的dist目录集成到后端Jar包中,直接采用jar包部署的完整集成过程 阅读详情

相关推荐

前端路由模式详解 JavaScript

前端路由模式基于浏览器的 History API 或者 URL 的 hash(#)部分来实现页面间的导航。它允许我们在单页应用中创建多个虚拟页面,每个页面对应一个 URL 路径,用户在不刷新页面的情况下,通过点击链接或者执行一些操作来切换页面。常见的前端路由模式有两种:基于 History API 的路由和基于 hash 的路由。下面我们将逐步介绍这两种模式的实现。前端路由模式是单页应用开发中的重要技术,它通过改变 URL 来实现页面间的切换和导航,为用户提供更好的交互体验。

python_bug262的博客 196

前端路由模式

在 history 下,你可以自由的修改 path,但刷新页面时,如果服务器中没有相应的响应或者资源,则会出现404页面,因为刷新页面会发送 http 请求。也就是说,使用 history 路由模式,需要通过服务端来允许地址可访问,后端也必须配置了当前资源路径地址才行。hash 模式不会向后端发送 http 请求,所有的 hash 值操作都与后端无关。即,在同一文档的两个历史记录条目之间导航会触发该事件。的简写模式,是 History 构造函数的实例化对象。拼接在真实 url 后面的模式,通过。

fmk1023的博客 1834

PID不够用?试试给PID加上‘预言’能力:史密斯预测器(SP)在温控、液位控制中的实战配置

本文深入探讨了史密斯预测器(SP)在温控和液位控制中的应用,特别针对大滞后系统的PID控制难题。通过详细解析SP的核心组件、参数整定技巧及进阶应用FSP,结合西门子PLC的实战配置方案,帮助工程师有效提升控制精度和系统稳定性。文章还提供了S7-1200的完整实现步骤和调试技巧,为工业自动化控制提供了实用解决方案。

weixin_33686714的博客 465

vue-router路由模式详解

一、路由模式解析   要讲vue-router的路由模式,首先要了解的一点就是路由是由多个URL组成的,使用不同的URL可以相应的导航到不同的位置。   如果有进行过服务器开发或者对http协议有所了解就会知道,浏览器中对页面的访问是无状态的,所以我们在切换不同的页面时都会重新进行请求。而实际使用vue和vue-router开发就会明白,在切换页面时是没有重新进行请求的,使用起来就好...

weixin_30522095的博客 425

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 445

Dify+工作流,通过多模态实现发票自动识别

上个章节我们用Dify实现了基于本地知识库的聊天助手,本节我们通过工作流 ,可视化界面快速构建复杂的工作流和自动化流程。结合 OCR(光学字符识别)技术和工作流引擎,可以实现发票的自动识别、数据提取以及后续的审批流程。本文将详细介绍如何使用 Dify 和工作流来实现发票的自动识别与审批。

odin2005的博客 7424

前端路由模式详解(hash和history)

前端路由模式详解(hash和history) 前端路由有两种模式:hash 模式和 history 模式,接下来分析这两种模式的实现方式和优缺点。 hash 模式 hash 模式是一种把前端路由的路径用井号 # 拼接在真实 URL 后面的模式。当井号 # 后面的路径发生变化时,浏览器并不会重新发起请求,而是会触发 hashchange 事件。 示例: 我们新建一个 hash.html 文件,内容为: <a href="#/a">A页面</a> <a href="#/b">

weixin_43758377的博客 2457

Codex 命令行高效操作指南

本文详细介绍了Codex命令行工具的高效使用方法,包括安装配置、核心参数解析和实战技巧。通过`codex complete`、`codex explain`等指令,开发者可以快速生成代码、调试错误和重构项目,显著提升开发效率。特别推荐使用`--temperature`和`--max-tokens`参数优化生成结果。

weixin_29201313的博客 530

前端路由三种模式: Hash 模式、 History 模式、 Memory模式

一般路由实现主要有history和hash两种方式hash的实现全部在前端,不需要后端服务器配合,兼容性好,主要是通过监听hashchange事件,处理前端业务逻辑history的实现,需要服务器做以下简单的配置,通过监听pushState及replaceState事件,处理前端业务逻辑。

qq_44376306的博客 2703

手把手教你用C#实现TwinCAT 3 ADS通讯(附完整代码示例)

本文详细解析了如何使用C#实现TwinCAT 3 ADS通讯,包括协议核心价值、开发环境配置、变量通信实践及高级应用场景。通过完整代码示例和性能优化技巧,帮助开发者高效实现工业自动化系统中的实时数据交换,特别适合倍福(Beckhoff)平台用户。

weixin_29230901的博客 117

删除结点

对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点。 1 由键盘输入值,换行表示输入结束,根据输入建立单链表。 2 输入链表中的一个元素值,从链表中删除这个元素的前驱结点。 3 对删除元素后的链表元素在屏幕上显示。 测试用例1 11 22 33 44 55 66 77↵ 44↵ 期待输出1 11 22 44 55 66 77↵ #include <iostre...

SChenlyx 1615

前端路由模式详解:Hash 模式、History 模式与 Memory 模式

本文将详细解析Hash 模式、History 模式与 Memory 这三种路由模式的工作原理、优缺点以及适用场景,帮助你在实际项目中做出最佳选择。

驴大毛的博客 1756

Mike 21如何制作随水深变化的糙率文件

MIKE 21如何制作随水深变化的糙率文件

zhuzhujiayoua的博客 2248

Qiankun微前端框架实战教程:路由模式选择与部署方案详解

微前端架构在现代前端开发中扮演着越来越重要的角色,而qiankun作为一款优秀的微前端解决方案,提供了完整的微前端架构支持。本文将深入探讨qiankun框架中的两个核心主题:微应用路由模式的选择和不同场景下的部署方案。 ## 一、微应用路由模式选择指南 在qiankun中,微应用的路由模式选择直接影响主应用与微应用之间的交互方式。我们需要根据实际场景选择最合适的路由模式。 ### 1. 基于...

gitblog_00048的博客 460

Windows10下安装VMware16虚拟机

由于本人系统为Windows 10 家庭中文版,无法安装Linux子系统WSL,虽然网上也有强制安装的方法,但为保险起见,还是把之前的VMware虚拟机重新进行安装,并浅浅记录一下安装过程。

沉香best的博客 861

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

前端路由模式:Vue Router的hash模式和history模式详解

Vue Router的两种模式各有特点:Hash模式兼容性好、部署简单,适合需要支持老旧浏览器或快速上线的项目,但URL带#号且SEO不友好;History模式URL美观、SEO友好,但需要服务器配置和现代浏览器支持。选择时应根据项目需求:内部系统可用Hash,用户产品推荐History,需兼容IE则必须Hash,重视SEO选History。服务器配置上,Nginx、Apache等都需要重定向到index.html以支持History模式。

sg_knight的专栏 1003

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

前端路由模式的区别详解(hash 与 history)

前端路由模式的区别详解(hash 与 history)

小文同学的博客 655

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

前言 不知道大家有没有遇到过一种情况,当自己的vue部署在服务器上时,一切都如想象办运转,然后脑袋duang的一下,突然想去刷新,然后网页就duang的一下,白屏了。 不出意外的话,我猜你用的一定是history的路由模式。 没错,这就是history中的一个问题,接下来让我们一起探索一下前端路由吧! 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np impo

hhhhhhhssss的博客 4160

一文彻底学会Vue3路由:全面讲解路由流程、路由模式、传参等——全栈开发之路--前端篇(7)路由详解

本文将带你从头到尾将Vue3中的路由学透,学完之后所有的跳转需求都可以实现。

m0_74475812的博客 1万+

一文彻底学会Vue3路由全面讲解路由流程、路由模式、传参等——全栈开发之路--前端篇(7)路由详解

在创建路由器的时候,我们可以多配置一项name,我们可以依次为跳转标识。至此,我们有三种方法可以跳转,字符串,name和path,以后多用后两种写法,他们更方便传参。

m0_74823933的博客 2230

11_17_第六阶段:大前端进阶||07-Vue详解||P19:路由模式与 404【显示当前登录的用户||路由模式与404||在钩子函数中使用异步请求】【观看狂神随笔】

路由模式与 404 【业务功能1】显示当前登录的用户 登录时将用户名传到Main页面 *【通过登录表单,通过请求链接传了一个name】 *【name走完就会进如Main页面】 1、修改Login.vue,当前用户的名字push回去 2、修改index.js,来接收name,要去取 3、Login.vue传过来一个参数,index.js接收到之后,修改前端Main.vue来取,取到后上面就可以用了 4.效果 路由模式与404 路由模式有两种 hash:路径带 # 符号,如 http://loca

qq_40572023的博客 185

详解 Nginx 部署 Vite+Vue 项目(History 路由模式)

本文详细介绍了如何通过Nginx部署Vite+Vue项目(History路由模式)。关键在于确保前端配置、服务器文件夹路径和Nginx配置三者一致。主要内容包括:1)前端项目中Vite的base配置和Vue Router的基础路径设置;2)服务器端将dist文件夹重命名为目标路径并上传;3)Nginx配置中需正确设置alias和try_files指令,解决History模式的路由刷新404问题。文章还提供了常见问题解决方案,强调一致性是避免部署问题的核心原则。

m0_58167015的博客 964

前端开发必备:TanStack Router 完全指南 - 从入门到实践(2)

大家好,我是 hyy,一个热爱技术分享的全栈工程师。作为一个有着丰富经验的商业型 TypeScript 全栈开发者,我深知技术分享的重要性。我的座右铭是"深入浅出,知其然知其所以然",因为我始终相信,只有真正理解了基础,才能在技术的道路上走得更远。在这篇文章中,我将带你深入浅出地了解 TanStack Router 这个强大的路由工具。无论你是初学者还是有经验的开发者,相信都能从中获得启发。🚀 一个有着丰富经验的商业型 TypeScript 全栈开发者。

weixin_50108720的博客 1650

前端面试问题汇总

前端面试知识点汇总

qq_57084525的博客 325

vue路由模式 -hash history

路由模式 前端路由的核心,就在于 ——— 改变视图的同时不会向后端发出请求。 路由有两种模式:hash、history,默认会使用hash模式,在new VueRouter的时候配置mode值可以改变路由模式 //创建Router的实例对象 const router = new Router({ mode:"hash", routes }) hash模式 即地址栏url中...

Cupid 224
上一篇: Maven 上传jar包到私服、将jar包导入本地仓库
下一篇: vue如何实现路由权限控制
shadow_zed
博客等级 码龄10年 6289粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值