标准答案

  1. history 模式使用正常路径,例如 /users/1,而不是 /#/users/1。
  2. 前端跳转时调用 history.pushState 或 replaceState 更新地址栏。
  3. 浏览器前进后退会触发 popstate,路由器需要重新匹配并渲染。
  4. 点击内部链接时通常要 preventDefault,避免浏览器做整页刷新。
  5. 服务器必须把前端路由子路径都返回同一个 index.html,否则刷新深层路径会 404。

题目解析

history 模式的用户体验更接近传统网站,URL 更干净,也更利于服务端日志和部分 SEO 场景。但它要求服务端配合,这是和 hash 模式最大的部署差异。

实现时要处理两类导航:应用内主动跳转用 pushState,用户点击浏览器前进后退会触发 popstate。两者最终都要走同一个路径匹配和渲染逻辑。

刷新 404 是 history 模式最常见问题。因为浏览器会请求 /users/1,服务器如果没有兜底到 SPA 入口,就会按真实文件路径查找并失败。

代码示例

history 路由需要手动 pushState,并监听 popstate。

JavaScript
function navigate(path) {
  history.pushState(null, '', path)
  renderRoute()
}

function renderRoute() {
  const path = location.pathname
  const render = routes[path] || renderNotFound
  render()
}

window.addEventListener('popstate', renderRoute)

document.addEventListener('click', (event) => {
  const link = event.target.closest('a[data-link]')
  if (!link) return

  event.preventDefault()
  navigate(link.getAttribute('href'))
})

常见误区

  • 只调用 pushState,不触发视图重新渲染。
  • 忘记监听 popstate,浏览器前进后退时页面内容不变。
  • 部署时没有配置服务器兜底,刷新二级路由直接 404。

作者信息