美文网首页
从vue-router看前端路由的两种实现

从vue-router看前端路由的两种实现

作者: __越过山丘__ | 来源:发表于2019-01-09 15:52 被阅读0次

    https://zhuanlan.zhihu.com/p/27588422

    通过 mode 参数来实现控制路由

    1. HashHistory

    通过Vue.mixin()方法,全局注册一个混合,影响注册之后所有创建的每个 Vue 实例,
    该混合在beforeCreate钩子中通过Vue.util.defineReactive()定义了响应式的_route属性。
    当_route值改变时,会自动调用Vue实例的render()方法,更新视图。

    $router.push() --> HashHistory.push() --> History.transitionTo() --> 
    
    History.updateRoute() --> {app._route = route} --> vm.render()
    
    1. HTML5History

    从HTML5开始,History interface提供了两个新的方法:pushState(), replaceState()使得我们可以对浏览器历史记录栈进行修改:

    代码结构以及更新视图的逻辑与hash模式基本类似,只不过将对window.location.hash直接进行赋值window.location.replace()改为了调用history.pushState()和history.replaceState()方法。

    除此之外vue-router还为非浏览器环境准备了一个abstract模式,其原理为用一个数组stack模拟出浏览器历史记录栈的功能。

    history模式的一个问题

    我们知道对于单页应用来讲,理想的使用场景是仅在进入应用时加载index.html,后续在的网络操作通过Ajax完成,不会根据URL重新请求页面,但是难免遇到特殊情况,比如用户直接在地址栏中输入并回车,浏览器重启重新加载应用等。

    hash模式仅改变hash部分的内容,而hash部分是不会包含在HTTP请求中的:

    http://oursite.com/#/user/id   // 如重新请求只会发送http://oursite.com/
    

    故在hash模式下遇到根据URL请求页面的情况不会有问题。

    而history模式则会将URL修改得就和正常请求后端的URL一样

    http://oursite.com/user/id
    

    在此情况下重新向后端发送请求,如后端没有配置对应 /user/id 的路由处理,则会返回404错误。官方推荐的解决办法是在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。同时这么做以后,服务器就不再返回 404 错误页面,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面。或者,如果是用 Node.js 作后台,可以使用服务端的路由来匹配 URL,当没有匹配到路由的时候返回 404,从而实现 fallback。

    相关文章

      网友评论

          本文标题:从vue-router看前端路由的两种实现

          本文链接:https://www.haomeiwen.com/subject/iydgrqtx.html