首先 browserHistory
其实使用的是 HTML5 的 History API
,浏览器提供相应的接口来修改浏览器的历史记录;而 hashHistory
是经过改变地址后面的 hash 来改变浏览器的历史记录;html
History API 提供了 pushState() 和 replaceState() 方法来增长或替换历史记录。而 hash 没有相应的方法,因此并无替换历史记录的功能。但 react-router 经过 polyfill 实现了此功能,具体实现没有看,好像是使用 sessionStorage。react
另外一个缘由是 hash 部分并不会被浏览器发送到服务端,也就是说无论是请求 http://domain.com/index.html#foo
仍是 http://domain.com/index.html#bar
,服务只知道请求了 index.html 并不知道 hash 部分的细节。而 History API 须要服务端支持,这样服务端能获取请求细节。浏览器
还有一个缘由是由于有些应该会忽略 URL 中的 hash 部分,记得以前将 URL 使用微信分享时会丢失 hash 部分。微信