- 深入理解React Router:从原理到实践
- 李杨韬
- 718字
- 2025-02-26 04:47:07
2.3 hashHisotry
2.3.1 创建hashHisotry
hashHistory在浏览器中使用,在不兼容pushState等原生接口的浏览器中,可使用hashHistory管理地址导航。hashHistory的特点是路径的所有部分都在浏览器地址的hash中,即“#”号之后,读取window.location.hash得到的将是hashHistory管理的整个地址信息。
如果不希望在页面切换时刷新页面,同时希望将页面的URL存储在浏览器地址的hash中,则可使用hashHistory。创建hashHistory的方式如下:

在创建hashHistory时,除了能传入getUserConfirmation、basename,还可设置hashHistory的hash类型,其配置如下:

注意,hashHistory不接受keyLength、forceRefresh的创建配置,这意味着其缺少了hashHistory.location中的key与强刷模式。
getUserConfirmation与basename在2.1节中有过介绍,分别是配置弹窗确认函数及配置基准地址。
从TypeScript类型HashType中可以看到,hashType支持hashbang、noslash及slash3种类型,如果在创建时不指明hashType,则默认的hashType为slash。

对于slash类型的hashHistory,其hash符号“#”后都将跟上“/”,如:

若创建的hashType为noslash类型:

则“#”后没有“/”:

若创建的hashType为hashbang类型:

则对应的hash路径“#”后会接上“!”与“/”:

hashbang是UNIX操作系统中的一种写法,名称叫作Shebang或hashbang。hashbang是一个由“#”和“!”构成的字符序列“#!”,其出现在文本文件的第一行的前两个字符。在Web应用中,“#”后面的内容默认不会被爬虫爬取到。近年来,页面hash有着与业务相关的含义,不同hash对应的网页内容也有所不同。例如路由地址,为了有效地区别这种情况,让搜索引擎更好地抓取数据,Google提出的解决方案是用“#!”进行区分,即hashbang。当网页爬虫遇到类似的带有hashbang的URL时,就会对URL中的hash进行抓取,从而获得更全面的信息。
注意,即使在创建hashHistory时没有进行任何操作,路径也可能发生变化。例如在浏览器中输入https://example.com/,在createHashHistory被调用后,默认的hashType为slash时,浏览器URL会变为https://example.com/#/。这是因为createHashHistory在被调用时,会进行一次准备工作:

由于encodedPath变量为“/”,与path变量为空字符串不相同,因而会执行一次replaceHashPath('/')。执行该操作的目的是初始化hashType,如果hashType为hashbang,则路径为https://example.com/#!/。