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

yizhihongxing

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实现获取两个日期之间所有日期的方法

    首先,我们可以利用 JavaScript 中的 Date 对象来进行日期计算和格式化,从而实现获取两个日期之间所有日期的方法。以下是实现方法的步骤: 定义一个函数,接收两个参数,表示开始日期(start)和结束日期(end)。 利用 Date.parse() 方法将日期字符串转换为时间戳,方便后面的计算。 利用 Math.abs() 方法求出两个日期之间的毫…

    JavaScript 2023年5月27日
    00
  • 同一个帐号不能同时登陆的问题

    问题描述: 在一个网站中,同一个账号不能在多个地方同时登录,否则可能会产生一些安全问题或者数据冲突。如何解决同一个账号不能同时登录的问题呢? 解决方案: 我们可以通过以下几个步骤来解决这个问题: 后台记录用户登录状态 后台服务器需要记录每个用户的登录状态,以避免同一账号多次登录的问题。具体实现的方式可以是:将用户的登录状态存储在服务器的内存中或者数据库中,并…

    JavaScript 2023年6月11日
    00
  • javascript 常用功能总结

    JavaScript 常用功能总结 1. 变量声明和赋值 在 JavaScript 中,使用 var、let 或 const 关键字可以声明变量。 // 以 var 关键字声明一个变量 var myVar; // 以 let 关键字声明一个变量 let myLet; // 以 const 关键字声明一个常量 const myConst = "Hel…

    JavaScript 2023年5月17日
    00
  • 才发现的超链接js导致网页中GIF动画停止的解决方法

    完整攻略如下: 问题背景 当我们在网页中添加一些超链接时,有时会发现网页中的GIF动画会停止播放,这是因为一些不合适的js代码导致了GIF动画的暂停。本攻略将详细介绍这个问题的解决方法。 发现问题 首先,我们需要确定是否存在这个问题。当我们添加了一个超链接,然后在网页中出现了GIF动画,观察动画是否会在超链接出现时暂停。如果动画暂停,那么就有可能是因为超链接…

    JavaScript 2023年6月10日
    00
  • vue动态菜单、动态路由加载以及刷新踩坑实战

    Vue动态菜单、动态路由加载以及刷新踩坑实战 在Vue项目中,动态菜单与动态路由的实现可以大大提升项目的扩展性和可维护性。本文将详细讲解如何实现Vue项目中的动态菜单、动态路由加载以及刷新踩坑实战。 一、动态菜单的实现 数据结构设计 首先,我们需要设计动态菜单的数据结构。我们可以将菜单数据放在以数组为基础的对象数据中,其中包含每个菜单的title、icon、…

    JavaScript 2023年6月11日
    00
  • js replace正则相关的诡异问题

    首先,我们需要了解replace方法是用于将一个字符串中的指定字符或正则表达式替换成新的字符串。在使用replace方法时,通常会用到正则表达式来匹配需要替换的字符串。 但是,在使用replace方法时,如果我们将正则表达式中的括号与g全局标记一起使用时,容易出现一些诡异的问题。下面,我将列举两个示例来说明这个问题。 示例一: const str = ’12…

    JavaScript 2023年6月10日
    00
  • 深入浅析JavaScript的API设计原则

    深入浅析JavaScript的API设计原则 在JavaScript的编程中,API设计扮演了非常重要的角色。一个优秀的API可以让开发者方便使用并且提高代码的可读性和可维护性。本文将详细讲解JavaScript API设计的原则,并提供两条示例来说明。 原则1:一致性 API的一致性是非常重要的。相似的功能应该采用相似的命名和用法。这样可以让开发者对API…

    JavaScript 2023年5月27日
    00
  • javascript判断中文的正则

    下面是关于 JavaScript 判断中文的正则表达式攻略。 正则表达式简介 正则表达式是一种强大的字符串匹配工具,它使用一种类似于字符串的模式来描述、匹配和操作文本。 若要使用正则表达式判断中文,需要掌握正则表达式的基本语法和元字符。 字符(字符表达式):表示自身字符。 字符集合(字符类):表示某个字符集合内任意字符。 特殊字符:表示特殊含义的字符。 量词…

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