Vue Router

单页应用的路由原理

两种模式

Hash 模式

URL 带 #example.com/#/home

┌────────────────────────────────────────────┐ │ URL: http://example.com/#/home │ │ │ │ │ │ │ └─ hash: /home │ │ └─ origin,不发送给服务器 │ └────────────────────────────────────────────┘

原理:监听 hashchange 事件

window.addEventListener("hashchange", () => {
  // URL 变化了,获取新 hash
  const hash = window.location.hash;
  // 渲染对应组件
  render(hash.slice(1));
});
// 跳转时只改 hash,不会刷新页面
function push(path) {
  window.location.hash = path;
}

特点

  • # 后面的内容不会发送给服务器
  • 兼容性好,IE8+ 都支持
  • 刷新不会 404
  • URL 较丑

History 模式

URL 干净:example.com/home

原理:HTML5 History API

// 改 URL 但不刷新页面
history.pushState({ path: "/home" }, "", "/home");

// 监听后退
window.addEventListener("popstate", (e) => {
  const path = e.state?.path || "/";
  render(path);
});
// 完整跳转
function push(path) {
  history.pushState({ path }, "", path);
  render(path);
}

// 替换当前记录
function replace(path) {
  history.replaceState({ path }, "", path);
}

问题:需要服务端配置

刷新 http://example.com/home 时 浏览器 ──GET /home──> 服务器 │ 没有这个文件,返回 404 │ 浏览器显示 404 页面

服务端配置(Nginx):

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

保证

  • /home 存在 → 返回文件
  • /home 不存在 → 返回 index.html,让前端路由处理

总结

模式原理服务端配置
Hashhashchange不需要
HistorypushState需要
Abstract内存不需要

推荐:开发用 History,生产看服务器情况配置。