龙空技术网

Vue Router的两种模式hash和history的区别

web秀 589

前言:

现在兄弟们对“html5history”大致比较注意,我们都需要了解一些“html5history”的相关文章。那么小编也在网络上收集了一些对于“html5history””的相关资讯,希望朋友们能喜欢,大家快快来学习一下吧!

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: ';,  //   newUrl: ';,  // }}

打印对象里面包含两个字段,oldUrl 和 newUrl,这样我们就能根据对应的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,例如 。

不过使用 history 模式时也需要注意,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 就会返回 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 }  ]})

标签: #html5history