前端路由hash、history原理

本文参考https://www.cnblogs.com/tugenhua0707/p/10859214.html

先来看下后端路由的实现方式:

1. 浏览器向服务器发出请求。
2. 服务器监听到80端口,如果有请求过来,那么就解析url地址。
3. 服务器根据客户端的路由配置,然后就返回相应的信息(比如html字符串、json数据或图片等)。
4. 浏览器根据数据包的 Content-Type来决定如何解析数据。

缺点: 每次路由切换的时候都需要去刷新页面,然后发出ajax请求,然后将请求数据返回回来,那么这样每次路由切换都要刷新页面对于用户体验来说就不好了。因此为了提升用户体验,我们前端路由就这样产生了。它就可以解决浏览器不会重新刷新了。

那么前端路由也有2种模式,第一种是hash模式,第二种是history模式。我们来分别看下这两种知识点及区别如下:

1. hash模式

hash路由模式是这样的:http://xxx.abc.com/#/xx。 有带#号,后面就是hash值的变化。改变后面的hash值,它不会向服务器发出请求,因此也就不会刷新页面。并且每次hash值发生改变的时候,会触发hashchange事件。因此我们可以通过监听该事件,来知道hash值发生了哪些变化。比如我们可以如下简单的监听:

function hashAndUpdate () {
   // todo 匹配 hash 做 dom 更新操作
}

window.addEventListener(‘hashchange‘, hashAndUpdate);
// 完整的url
location.href  

// 当前URL的协议,包括 :; 比如 https:
location.protocol   

/* 主机名和端口号,如果端口号是80(http)或443(https), 那就会省略端口号,比兔 www.baidu.com:8080 */
location.host  

// 主机名:比如:www.baidu.com
location.hostname

// 端口号;比如8080
location.port

// url的路径部分,从 / 开始; 比如 https://www.baidu.com/s?ie=utf-8,那么 pathname = ‘/s‘了
location.pathname

// 查询参数,从?开始;比如 https://www.baidu.com/s?ie=utf-8 那么 search = ‘?ie=utf-8‘
location.search

// hash是页面中的一个片段,从 # 开始的,比如 https://www.baidu.com/#/a/b 那么返回值就是:"#/a/b"
location.hash 

hash 和 pushState 对比有如下缺点:

1. hash只能修改url的片段标识符的部分。并且必须从#号开始,但是pushState且能修改路径、查询参数和片段标识符。pushState比hash更符合前端路由的访问方式,更加优雅(因为不带#号)。

2. hash必须和原先的值不同,才能新增会话浏览历史的记录,但是pushState可以新增相同的url的记录

2. history模式

HTML5的History API为浏览器的全局history对象增加了该扩展方法。它是一个浏览器的一个接口,在window对象中提供了onpopstate事件来监听历史栈的改变,只要历史栈有信息发生改变的话,就会触发该事件。提供了如下事件:

window.addEventListener(‘popstate‘, function(e) {
  console.log(e)
});

history提供了两个操作历史栈的API: history.pushState 和 history.replaceState

history.pushState(data[,title][,url]); // 向历史记录中追加一条记录

history.replaceState(data[,title][,url]); // 替换当前页在历史记录中的信息。

如上html5中新增了上面这两个方法,该两个方法也可以改变url,页面也不会重新刷新。下面我们也可以来做个demo,来监听下popstate事件,现在在我js里面放入如下js代码:

window.addEventListener(‘popstate‘, function(e) {
  console.log(e)

hash模式的特点:

hash模式在浏览器地址栏中url有#号这样的,比如(http://localhost:3001/#/a). # 后面的内容不会传给服务端,也就是说不会重新刷新页面。并且路由切换的时候也不会重新加载页面。

history模式的特点:

浏览器地址没有#, 比如(http://localhost:3001/a); 它也一样不会刷新页面的。但是url地址会改变。

原文地址:https://www.cnblogs.com/wsk1576025821/p/10868676.html

时间: 2024-08-30 05:50:39

前端路由hash、history原理的相关文章

vue-learning:38 - router - 前端路由的发展

前端路由的发展 参考博客 前端路由是什么东西? 什么是路由 在jQuery时代,我们使用<a href="https://www.example.com/example/home.html">实现页面切换. 其响应过程是这样的 1.浏览器发出请求 2.服务器监听到指定端口的请求,并解析url路径 3.浏览器根据数据包的Content-Type来决定如何解析数据 4.根据服务器的路由配置,返回相应信息(比如返回html文件的字串,也可以是 json 数据,图片等) 5.浏览器

前端路由模式hash和history

hash模式hash模式的原理是依据window对象的onhashchange事件进行监听,它的特点是:虽然hash路径出现在URL中,但是不会出现在HTTP请求中,对后端完全没有影响,因此改变hash值不会重新加载页面. window.onhashchange = function(e){ console.log(e); } 打印出来的结果可以通过location.hash获得浏览器url路径中的#部分内容,上图是#bvc,如果想获取#后面的内容可通过location.hash.slice(1

原生JS实现一个简单的前端路由(原理)

说一下前端路由实现的简要原理,以 hash 形式(也可以使用 History API 来处理)为例, 当 url 的 hash 发生变化时,触发 hashchange 注册的回调,回调中去进行不同的操作,进行不同的内容的展示. 直接看代码或许更直观. 1 function Router() { 2 this.routes = {}; 3 this.currentUrl = ''; 4 } 5 Router.prototype.route = function(path, callback) {

前端路由的原理

什么是路由?简单的说,路由是根据不同的 url 地址展示不同的内容或页面 使用场景?前端路由更多用在单页应用上, 也就是SPA, 因为单页应用, 基本上都是前后端分离的, 后端自然也就不会给前端提供路由. 前端的路由和后端的路由在实现技术上不一样,但是原理都是一样的.在 HTML5 的 history API 出现之前,前端的路由都是通过 hash 来实现的,hash 能兼容低版本的浏览器. 两种实现前端路由的方式HTML5 History两个新增的API:history.pushState 和

前端路由简介以及vue-router实现原理

后端路由简介 路由这个概念最先是后端出现的.在以前用模板引擎开发页面时,经常会看到这样 http://www.xxx.com/login 大致流程可以看成这样: 浏览器发出请求 服务器监听到80端口(或443)有请求过来,并解析url路径 根据服务器的路由配置,返回相应信息(可以是 html 字串,也可以是 json 数据,图片等) 浏览器根据数据包的 Content-Type 来决定如何解析数据 简单来说路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径,来请求不同的资源,请求不同的页

前端路由原理及vue-router介绍

前端路由原理本质就是监听 URL 的变化,然后匹配路由规则,显示相应的页面,并且无须刷新.目前单页面使用的路由就只有两种实现方式 hash history www.test.com/##/ 就是 Hash URL,当 ## 后面的哈希值发生变化时,不会向服务器请求数据,可以通过 hashchange 事件来监听到 URL 的变化,从而进行跳转页面. vue-router hash实现源码(完整源码访问https://github.com/vuejs/vue-router/blob/dev/src

前端路由实现原理 - 王汉镇的博客

前端路由的方式有两种 history路由:history.pushState()+popState事件 hash路由:location.hash+hashchange事件 history路由 history API是HTML5新增的API,跟路由有关的两个API是 history.pushState()和history.repalceState() 这两个api都可以操作浏览器的历史记录,而且不会引起刷新.不过前者会向浏览器新增一条历史记录,而后者是直接替换当前的历史记录. 这两个api都接受三

哈希路由(hash模式)和历史路由(history模式)的区别

随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记录当前页面的状态(保存或分享当前页的url,再次打开该url时,网页还是保存(分享)时的状态): 可以使用浏览器的前进后退功能(如点击后退按钮,可以使页面回到使用ajax更新页面之前的状态,url也回到之前的状态): 作为开发者,要实现这两个功能,我们需要做到: 改变url且不让浏览器向服务器发出请

通过hash实现前端路由

router.js //构造函数 function Router() { this.routes = {}; this.currentUrl = ''; } Router.prototype.route = function(path, callback) { this.routes[path] = callback || function(){};//给不同的hash设置不同的回调函数 }; Router.prototype.refresh = function() { //console.l