【转载】Vue路由 hash与history 的区别

两种路由模式原因 对于 Vue 这类渐进式前端开发框架,

为了构建 SPA(单页面应用),

需要引入前端路由系统,

这也就是 Vue-Router 存在的意义。

前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求。

因此有两种路由

  1. hash: 即地址栏 URL 中的#符号(此 hash 不是密码学里的散列运算)。

    比如这个 URL:http://www.abc.com/#/hello

    hash 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中,

    但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。
  2. history: 利用了 HTML5 History Interface

    中新增的pushState()replaceState()方法。(需要特定浏览器支持)

    这两个方法应用于浏览器的历史记录栈,在当前已有的back、forward、go的基础之上,

    它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,

    但浏览器不会立即向后端发送请求。

hash 模式和 history 模式都属于浏览器自身的特性,Vue-Router只是利用了这两个特性

(通过调用浏览器提供的接口)来实现前端路由。

使用场景

一般场景下,hash 和 history 都可以,除非你更在意颜值,#符号夹杂在 URL 里看起来确实有些不太美丽。

如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用

history.pushState API 来完成

URL 跳转而无须重新加载页面。

调用history.pushState()相比于直接修改hash,存在以下优势:

  • pushState()设置的新 URL 可以是与当前 URL 同源的任意 URL;而hash只可修改#

    后面的部分,因此只能设置与当前 URL 同文档的 URL;

  • pushState()设置的新 URL 可以与当前 URL 一模一样,这样也会把记录添加到栈中;

    hash设置的新值必须与原来不一样才会触发动作将记录添加到栈中;

  • pushState()通过stateObject参数可以添加任意类型的数据到记录中;

    hash只可添加短字符串;

  • pushState()可额外设置title属性供后续使用。

    当然啦,history也不是样样都好。

    SPA 虽然在浏览器里游刃有余,但真要通过 URL 向后端发起 HTTP 请求时,

    两者的差异就来了。尤其在用户手动输入 URL 后回车,或者刷新(重启)浏览器的时候。

  1. hash模式下,仅hash符号之前的内容会被包含在请求中,

    http://www.abc.com,因此对于后端来说,即使没有做到对路由的全覆盖,

    也不会返回 404 错误。
  2. history模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致,

    http://www.abc.com/book/id如果后端缺少对/book/id的路由处理,将返回 404 错误。

    Vue-Router 官网里如此描述:“不过这种模式要玩好,还需要后台配置支持所以呢,

    你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,

    则应该返回同一个 index.html页面,这个页面就是你 app 依赖的页面。”

history缺点

  • 通过history api,我们丢掉了丑陋的#,但是它也有个毛病:不怕前进,不怕后退,就怕刷新,f5,

    (如果后端没有准备的话),因为刷新是实实在在地去请求服务器的,不玩虚的。

  • 在hash模式下,前端路由修改的是#中的信息,而浏览器请求时是不带它玩的,所以没有问题.但是在history下,

    你可以自由的修改path,当刷新时,如果服务器中没有相应的响应或者资源,会分分钟刷出一个404来。

小结

结合自身例子,对于一般的Vue + Vue-Router + Webpack + XXX

形式的 Web 开发场景,用history模式即可,

只需在后端(Apache 或 Nginx)进行简单的路由配置,

同时搭配前端路由的 404 页面支持。

转载自:https://www.jianshu.com/p/ab085ae33ee5

【转载】Vue路由 hash与history 的区别的更多相关文章

  1. vue router mode 设置"hash"与"history"的区别

    router官网的说明如下: ********************************************我是官网说明分隔符--开始**************************** ...

  2. Vue路由Hash模式分析

    Vue路由Hash模式分析 Vue-router是Vue的核心组件,主要是作为Vue的路由管理器,Vue-router默认hash模式,即使用URL的Hash来模拟一个完整的URL,当URL改变时页面 ...

  3. vue前端路由的两种模式,hash与history的区别

    1.直观区别: hash模式url带#号,history模式不带#号. 2.深层区别: hash模式url里面永远带着#号,我们在开发当中默认使用这个模式. 如果用户考虑url的规范那么就需要使用hi ...

  4. vue中mode hash 和 history的区别

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

  5. hash和history的区别

    vue-router 中hash模式和history模式. 在vue的路由配置中有mode选项,最直观的区别就是在url中hash 带了一个很丑的 # ,而history是没有#的.vue默认使用ha ...

  6. 前端路由hash、history原理及简单的实践下

    阅读目录 一:什么是路由?前端有哪些路由?他们有哪些特性? 二:如何实现简单的hash路由? 三:如何实现简单的history路由? 四:hash和history路由一起实现 回到顶部 一:什么是路由 ...

  7. vue路由两种传参的区别

    //定义路由 { path:"/detail", name:"detail", component:home } //这种做法是错误的,这是query传参的方式 ...

  8. Vue路由的hash模式与history模式的区别?

    1.首先router有两种模式:hash模式(默认).history模式(需配置mode: 'history') hash和history的区别?   hash                    ...

  9. hash和history路由的区别

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

  10. Vue中hash模式和history模式的区别

    vue-router 中hash模式和history模式. 在vue的路由配置中有mode选项,最直观的区别就是在hash模式下的地址栏里的URL夹杂着‘#’号 ,而history模式下没有.vue默 ...

随机推荐

  1. vue+element-ui项目搭建实战

    1.使用vue ui创建vue工程 利用vue-cli提供的图形化工具快速搭建vue工程: 命令行运行:vue ui 工程结构说明 build:项目构建webpack(打包器)相关代码 config: ...

  2. Spring Boot图书管理系统项目实战-10.借还统计

    导航: pre:  9.归还图书 next:11.检索图书 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 bookStat. ...

  3. Java集合框架学习(十一) Hashtable详解

    Hashtable介绍 1. 继承自Dictionary; 2. 线程安全: 3. 支持Iterator和Enumeration: 4. key和value都不可为null; 5. 一般用于多线程环境 ...

  4. Innodb存储引擎的文件

    目录 概述 参数文件 日志文件 错误日志 慢查询日志 查询日志 二进制日志 binary log 二进制日志的配置 二进制日志的作用 二进制日志的保存 socket 套接字文件 pid文件 MySQL ...

  5. pikachu sql inject header 注入

    使用admin登录 显示以下内容 朋友,你好,你的信息已经被记录了:点击退出 你的ip地址:172.17.0.1 你的user agent:Mozilla/5.0 (X11; Ubuntu; Linu ...

  6. 李宏毅2022机器学习HW4 Speaker Identification下

    Task Sample Baseline模型介绍 class Classifier(nn.Module): def __init__(self, d_model=80, n_spks=600, dro ...

  7. 解密Spring中的Bean实例化:推断构造方法(上)

    在Spring中,一个bean需要通过实例化来获取一个对象,而实例化的过程涉及到构造方法的调用.本文将主要探讨简单的构造推断和实例化过程,让我们首先深入了解实例化的步骤. 实例化源码 protecte ...

  8. 20个Python random模块的代码示例

    本文分享自华为云社区<Python随机数探秘:深入解析random模块的神奇之处>,作者:柠檬味拥抱. 标准库random函数大全:探索Python中的随机数生成 随机数在计算机科学和数据 ...

  9. TornadoFx中的css美化

    原文地址:TornadoFx中的css美化 - Stars-One的杂货小窝 TornadoFx中使用类重新对css进行了封装,所以可以用代码的形式来书写样式 说明 除了Text,其他的若是要修改文字 ...

  10. Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

    Javabase64macmd5sha     加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实 ...