问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

hashhistory 与 browserhistory有什么区别

发布网友 发布时间:2022-05-14 17:24

我来回答

4个回答

懂视网 时间:2022-05-14 21:45

本篇文章给大家分享的是关于关于vue-router中hash和history两种模式的区别分析,内容很不错,有需要的朋友可以参考一下,希望可以帮助到大家。

众所周知,vue-router有两种模式,hash模式和history模式,这里来谈谈两者的区别。

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一一关联起来,后来人们给它起了一个霸气的名字叫前端路由,成为了单页应用标配。

1016471-20170907211959179-793927527.gif

网易云音乐,百度网盘就采用了hash路由,看起来就是这个样子:
http://music.163.com/#/friend

https://pan.baidu.com/disk/home#list/vmode=list

history路由

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

timg?image&quality=80&size=b9999_10000&sec=1504800942114&di=860578b9b35c22dfe6ad4825ea52eae5&imgtype=0&src=http%3A%2F%2Fwww.goumin.com%2Fattachments%2Fkedit%2F0%2F0%2F0%2F212%2F54472.jpg

history api可以分为两大部分,切换和修改,参考MDN

切换历史状态

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

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

修改历史状态

包括了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模式怕啥

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

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

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

所以,如果你想在github.io上搭一个单页博客,就应该选择hash模式。

热心网友 时间:2022-05-14 18:53

hashHistory和browserHistory
React-router是为react专门构建的一个路由插件,他可以帮助我们实现简单的单页应用效果,学习react的人,避免不了学习react-router的用法。
hashHistory : 不需要服务器配置,在URL生成一个哈希来跟踪状态,通常在测试环境使用,也可以作为发布环境使用。
import { Provider } from 'react-rex'
import { Router, hashHistory} from 'react-router'
ReactDOM.render((
<Provider store={store}>
<Router history={hashHistory}>
<Route>
//你的route
</Route>
</Router>
</Provider>),
document.getElementById('root')
);
browserHistory : 需要服务器端做配置,路径是真实的URL,是官方推荐首选。
客户端配置
import { Provider } from 'react-rex'
import { Router, browserHistory } from 'react-router'
ReactDOM.render((
<Provider store={store}>
<Router history={browserHistory}>
<Route>
//你的route
</Route>
</Router>
</Provider>),
document.getElementById('root')
);
服务端配置
const express = require('express')
const path = require('path')
const port = process.env.PORT || 8080
const app = express()
// 通常用于加载静态资源
app.use(express.static(__dirname + '/public'))
// 在你应用 JavaScript 文件中包含了一个 script 标签
// 的 index.html 中处理任何一个 route
app.get('*', function (request, response){
response.sendFile(path.resolve(__dirname, 'public', 'index.html'))
})
app.listen(port)
console.log("server started on port " + port)
解释一下为什么browserHistory需要服务端配置,因为真实URL其实是指向服务器资源,比如我们经常使用的API接口,也是一个真实URL的资源路径,当通过真实URL访问网站的时候,第一次访问的是网站的域名,这个时候可以正常加载我们的网站js等文件,而用户手动刷新网页时,由于路径是指向服务器的真实路径,服务器端没有做路由配置,就会导致资源不存在,用户访问的资源不存在,返回给用户的是404错误。
通过hashHistory来生成的URL就不会出现这样的问题,因为他不是指向真实的路由。

热心网友 时间:2022-05-14 20:11

使用 hashHistory,浏览器上看到的 url 会是这样的: /#/user/haishanh?_k=adseis
使用 browserHistory,浏览器上看到的 url 会是这样的:/user/haishanh
看起来当然 browserHistory 很好很理想,但 browserHistory 需要 server 端支持。 而使用hashHistory的时候,因为 url 中 # 符号的存在,从 /#/ 到 /#/user/haishanh 浏览器并不会去发送一次 request,react-router 自己根据 url 去 render 相应的模块。
而使用 browserHistory 的时候,浏览器从 / 到 /user/haishanh 是会向 server 发送 request 的。所以 server 端是要做特殊配置的。比如用的 express 的话,你需要 handle 所有的路由 app.get('*', (req, res) => { ... }),使用了 nginx 的话,nginx也要做相应的配置。 具体见这里36,还有这个例子23。
所以你的 App 是静态,没有服务端的话,只能用 hashHistory。

热心网友 时间:2022-05-14 21:46

区别是:
hash history 指的是搞砸的历史。
browser history 指的是浏览器历史记录。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
儿童散学归来早描述的是什么季节(儿童散学归来早描写的是什么季节) 超级死神进化论章节目录 我们没有忘记读后感458字作文 贷15万贷10年每月还多少钱 15万10年贷款月供多少 15万贷10年月供多少钱 15万贷款10年一月多少钱 贷款15万10年每月还多少 在银行贷款15万十年还清想知道利息和月供……(还望亲们提供的的2013年... 今天去刷qq空间 看到了一个同学的头像 说明他发了说说 可是怎么刷新... 杨小艾基本资料 2020青海海北州的事业单位招聘考试咨询电话是什么? 门源县卫生局招聘护理专业人士会同工同酬吗? 门源县哪里有吕塑厂招聘的,本人制作,安装什么都会 门源县|管家网里有什么东西?是干什么的? 别人身份证办的手机号也是别人帮办的,现在想把改成自己的身份证_百度问一问 海北门源安贞医院护士最新招聘 我的是用我妈妈的身份证号绑定的,要换成我的身份证号怎么办? 幼儿园奖状最后的“特发此状,以资鼓励”换成别的话,比较适合幼儿的更可爱点的话!给个意见啊! WOW黑下讲学厅怎么进? 找一本舰娘同人小说 黑下在哪? - 信息提示 黑石塔下层入口在哪!!! 魔兽跑尸迷路求图,东部黑石山地宫怎么跑进去拿尸体,嘿嘿~~急急急~~~ 找一部同人小说的名字 在一段感情里双方感情投入不对等,该如何继续? 黑上和黑下怎么走 有无fgo或fate同人,要晋江上的? 不对等的爱情还有没有坚持下去的必要? 中国有哪些男说唱歌手、较好的 海北州门源县创业商机在哪里? 锡压制成锡薄片金属什么性质 这个小品名字叫什么?有视频吗?有团支书、小艾..... 校园小品 人物(小玲小艾小伍) 求名字和动作 毕业表演 四人小品 找个小品!!! 给点小品 寻找一个喜剧,要很搞笑的!!! 赣州到信丰怎么座车? 众娱平台可以提现吗 山东众娱文化传媒有限公司怎么样? 昆山爱众文化传媒有限公司怎么样? 为什么「快男」最火的不是陈楚生而是张杰,能从营销的角度解释吗? 浙江大学计算机程序设计能力考试的PAT联盟企业清单 谁知道8非你莫属20120312 非诚勿扰20120312 天下足球20120312?康熙来了? 敬一丹配乐散文老了的时侯 请问拼多多取消订单后会怎么样? 在返利拼多多买了货,取消了订单会怎么样