Vue前端路由hash与history差异深入了解

Vue前端路由hash与history差异深入了解

前言

随着前端技术的发展,单页面应用(SPA)越来越多地出现在我们的生活中,而Vue作为目前较为流行的前端框架,其前端路由功能也越来越重要。本文将详细讲解Vue前端路由中hash与history两种模式的差异,以及它们的使用注意事项。

hash模式

在vue-router中,默认使用的是hash模式。hash模式会将URL中#后的字符作为路由地址使用。

例如,当前URI为https://www.example.com,且应用的路由地址为/home时,hash模式下的URL为https://www.example.com/#/home

在hash模式下,通过修改location.hash的值,我们可以实现前端路由的跳转,例如:

// 跳转到/home页面
location.hash = '#/home';

值得注意的是,当我们使用hash模式路由时,浏览器不会向服务器发送请求。因此,一个明显的优势是我们不需要服务器支持URL重定向或django等框架的的特定设置。但是,URL带有#号,看起来并不友好。

history模式

history模式中,vue-router会使用浏览器的history API来实现前端路由。这种模式下的URL更友好,不存在hash的问题。例如:我们访问URI为https://www.example.com,且应用的路由地址为/home时,history模式下的URL为https://www.example.com/home

在history模式下,我们可以使用router.push()来实现路由跳转:

// 跳转到/home页面
router.push('/home');

在history模式下,我们需要在服务器端配置,以保证刷新浏览器的时候不会404。在Nginx中,我们可以添加以下配置实现:

location / {
    try_files $uri $uri/ /index.html;
}

这个是由于浏览器在刷新的时候,会根据URL路径从服务器请求资源,因为history模式下的URL跟真实的URI是一样的,不做任何服务器端配置会直接返回404错误。而使用上面的Nginx配置,服务器会先尝试加载URL中指定的文件,如果没有找到,则返回index.html,这样就保证了单页面应用的正常运行。

类似的,如果你使用Apache作为服务器,在.htaccess文件中可以加入以下配置实现:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.html$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.html [L]
</IfModule>

综合比较

hash模式 history模式
URL友好度 较差 较好
是否向服务器发送请求
服务器端配置 不需要 需要
兼容性 更好 较差

示例

示例1

在Vue项目中,我们可以通过以下代码来判断当前应用的路由模式:

if (window.history && window.history.pushState) {
  // 支持history模式
  router.mode = 'history';
} else {
  // 不支持history模式,则使用hash模式
  router.mode = 'hash';
}

示例2

在Nginx配置文件中添加上述Nginx配置,以支持history模式下的刷新。

server {
    listen 80;
    server_name example.com;

    root /path/to/your/root;

    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

当浏览器以history模式的URL访问网站时,Nginx服务器会尝试获取对应的路径,如果存在则返回文件;否则,返回index.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue前端路由hash与history差异深入了解 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • js字符串转换成数字与数字转换成字符串的实现方法

    JS 字符串转换成数字和数字转换成字符串分别涉及到 JS 数据类型的转换。下面,我们分别详细讲解这两种数据类型间的转换实现方法: JS 字符串转换成数字 JS 字符串转换成数字主要用到以下两个函数: 1. parseInt(string, radix) 这个函数将给定的字符串参数转换成整数类型,并返回其整数值。 string:需要被转换成整数的字符串 rad…

    JavaScript 2023年5月28日
    00
  • 一些主流JS框架中DOMReady事件的实现小结

    下面我介绍一下“一些主流JS框架中DOMReady事件的实现小结”的完整攻略。 标题 概述 文档对象模型(DOM)由浏览器创建,表示网页的结构。DOM Ready(文档已准备就绪)是在页面加载完成后,但在所有图像和外部资源完成加载和处理之前运行的代码的事件。 在浏览器解析DOM、CSS,执行脚本、布局和绘制期间,大多数浏览器都支持两个事件:load 和 DO…

    JavaScript 2023年6月10日
    00
  • JS简单获取当前日期和农历日期的方法

    当我们需要在网页中展示当前日期时,可以使用JavaScript来获取当前日期。而获取农历日期则需要用到一些计算方法。下面,我们就来介绍一下JS简单获取当前日期和农历日期的方法。 获取当前日期 方法一:使用Date对象 Date对象是JavaScript中用来处理日期和时间的对象。获取当前日期可以通过创建一个Date对象,并调用其方法来获取。以下是获取当前日期…

    JavaScript 2023年5月27日
    00
  • javascript学习随笔(编写浏览器脚本 Navigator Scripting )

    JavaScript学习随笔(编写浏览器脚本 Navigator Scripting) 概述 Navigator对象在JavaScript中提供了许多有用的属性和方法,可以用于检测和操作浏览器。 在编写浏览器脚本时,Navigator对象的知识非常重要。 Navigator对象中的属性和方法 Navigator对象的属性 navigator.appCodeN…

    JavaScript 2023年5月27日
    00
  • js通过地址栏给action传值(中文乱码全是问号)

    当我们通过地址栏传递参数给 action 时,由于中文默认编码方式是 UTF-8,而 action 接收到的参数为 GBK 编码方式,导致中文乱码问题。下面是完整的攻略步骤: 1. 使用 JavaScript 的 escape() 函数编码传递的中文参数 escape() 函数可以将字符串进行编码,使其在传输时不受特殊字符的影响。我们可以将要传递的中文参数使…

    JavaScript 2023年5月19日
    00
  • 详解ASP.NET Core MVC四种枚举绑定方式

    接下来我会详细讲解ASP.NET Core MVC四种枚举绑定方式的完整攻略。 ASP.NET Core MVC四种枚举绑定方式 在ASP.NET Core MVC中,我们可以使用四种方式来绑定枚举类型的值。以下是介绍这些方式的详细说明。 1. 基于字符串的方式:BindAttribute 在控制器中处理POST请求时,如果我们需要绑定到枚举类型的值,可以使…

    JavaScript 2023年6月11日
    00
  • 一篇文章教你用JavaScript使用流程控制打印九九乘法表

    一、背景介绍 九九乘法表是小学数学中比较基础的一个知识点,非常适合用来练习编程语言的流程控制。本文以JavaScript为例,介绍如何使用流程控制打印九九乘法表。 二、具体步骤 1. 确定九九乘法表的规模 在开始编写代码前,首先需要确定九九乘法表的规模,即要打印多少行和多少列。九九乘法表一般是9行9列,但也可以根据需要打印其他规模的乘法表。 2. 使用for…

    JavaScript 2023年5月28日
    00
  • JS使用cookie设置样式的方法

    使用cookie来设置样式的方法可以分为以下几步:1. 当用户点击网页中的设置按钮时,应触发一个JavaScript事件。2. 在JavaScript事件中,应该获取需要设置样式的标签元素。3. 然后,应该使用JavaScript设置样式的方法,例如style属性或者classList。4. 最后,将样式设置好的标签元素信息存储在cookie中。 下面是一个…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部