Vue Router的两种模式区别以及使用注意事项

Vue Router 是Vue官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。vue-router 默认 hash 模式,还有一种是 history 模式。

const router = new VueRouter({ mode: 'history', // 这里可以配置是那种模式 routes: [...] })

hash模式

hash 模式的工作原理是 hashchange 事件,可以在window监听 hash 的变化。我们在url后面随便添加一个#xxxx就可以触发这个事件。

比如:

window.onhashchange = function(event){ console.log(event); // { // ... // oldUrl: 'http://xxxx#web', // newUrl: 'http://xxxx#webxiu', // } }

打印对象里面包含两个字段,oldUrlnewUrl,这样我们就能根据对应的hash值,做出相应操作。

尽管改变hash,浏览器本身是没有任何请求服务器动作的,但是页面状态和url已经关联起来了,这就是所谓的前端路由,单页应用的标配。

history模式

HTML5新增的API

1、history.pushState(data, title [, url]):向历史记录堆栈顶部添加一条记录; data会在onpopstate事件触发时作为参数传递过去;title为页面标题,当前所有浏览器都会 忽略此参数;url为页面地址,可选,缺省为当前页地址;

2、history.replaceState(data, title [, url]) :更改当前的历史记录,参数同上;

3、history.state:用于存储以上方法的data数据,不同浏览器的读写权限不一样;

4、window.onpopstate:响应pushState或replaceState的调用;有了这几个新的API,针对支持的浏览器,我们可以构建用户体验更好的应用了。就像刚提到的Facebook相册,虽然是AJAX的方式,但用户可以直接复 制页面地址分享给好友,

如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。

当你使用 history 模式时,URL 就像正常的 url,例如 http://xxx/webxiu

不过使用 history 模式时也需要注意,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://xxx/webxiu 就会返回 404,这就是非常不好的。

所以呢,我们需要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。

比如:

nginx(添加到vhosts.conf)

location / { try_files $uri $uri/ /index.html; }

Apache

<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </IfModule>

如果我们的服务器完成了上面的配置,这时服务器就不会返回404错误页面了,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,你应该在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面。

const router = new VueRouter({ mode: 'history', routes: [ { path: '*', component: NotFoundComponent } ] })