目录
一、hash 模式
二、history模式
三、俩者区别
四、重点问题
一、hash 模式
hash 路由:监听 url 中 hash 的变化,然后渲染不同的内容,这种路由不向服务器发送请求,不需要服务端的支持;类似锚点用来定位页面展示内容,代表符号是“#”(url难看)#
拼接在真实 url
后面的模式。当井号 #
后面的路径发生变化时(获取页面的hash值相当于可以直接获取路由的变量),浏览器并不会重新发起请求,而是会触发 onhashchange
事件,实现子页面加载。
注意:
- hash值为url中#后面的部分,可用window.location.hash获取
- hash变化会触发网页跳转,即浏览器的前进和后退。
hash
可以改变url
,但是不会触发页面重新加载(hash的改变是记录在window.history
中),即不会刷新页面。所有页面的跳转都是在客户端进行操作,不算是http
请求,所以这种模式不利于SEO
优化。hash
通过window.onhashchange
的方式,来监听hash
的改变,借此实现无刷新跳转的功能。hash
只能修改#
后面的部分,所以只能跳转到与当前url
同文档的url
。即使刷新页面hash
也不会提交到server
端(区别与history模式)。
二、history模式
history API
是 H5
提供的新特性,允许开发者直接更改前端路由(更新浏览器 URL
地址),而不重新发起请求。但刷新页面时会!
window.history
中的方法,常见操作有:
调用这几种方式时,都会只是修改了当前页面的 URL,页面的内容没有任何的变化。但前 3 个方法只是路由历史记录的前进或者后退,无法跳转到指定的 URL;而pushState
和replaceState
可以跳转到指定的 URL。 通过history的api调整,并不会向后端发起请求,所以也就达到了前端路由的目的。
三、俩者区别
- hash模式url较丑但兼容IE8以上,而history只兼容IE10以上
- pushState设置的新URL可以是与当前URL同源的任意URL;而hash只可修改#后面的部分,故只可设置与当前同文档的URL
- pushState可以设置与当前一模一样的新URL,且会把记录添加到栈中;而hash须设置与原来不一样的url才会添加到栈中
- pushState通过stateObject可以添加任意类型的数据到记录中;而hash只可添加短字符串
四、重点问题
- 使用
history
模式时,在对当前的页面进行刷新时,此时浏览器会重新发起请求。如果nginx
没有匹配得到当前的url
,就会出现404
的页面。解决:需要通过服务端来允许地址可访问,或配置重定向到index.html - 对于
hash
模式来说, 它虽然看着是改变了url
,但不会被包括在http
请求中。所以,它算是被用来指导浏览器的动作,并不影响服务器端。因此,改变hash
并没有真正地改变url
,所以页面路径还是之前的路径,nginx
也就不会拦截。