标准答案

  1. hash 模式把前端路径放在 URL 的 # 后面,例如 /#/users/1。
  2. 改变 hash 不会触发浏览器向服务器请求新文档。
  3. 前端通过 hashchange 事件或页面初始化时读取 location.hash。
  4. 路由器根据 hash 对应的路径查表,渲染匹配组件。
  5. hash 模式部署简单,但 URL 不够干净,SEO 和服务端感知能力有限。

题目解析

hash 路由依赖浏览器对片段标识符的处理。# 后面的内容原本用于页面内锚点,改变它不会让服务器重新返回 HTML,所以单页应用可以用它承载前端路径。

实现上最小路由器只需要一张 path 到 render 函数的表,再在 hashchange 时重新匹配。首次进入页面也要执行一次渲染,否则刷新后不会显示对应视图。

它的优势是部署简单,任何路径都还是请求同一个 HTML;代价是 URL 带 #,服务端和搜索引擎通常不直接理解 # 后面的应用状态。

代码示例

hash 路由的核心是监听 hashchange 并按路径渲染。

JavaScript
const routes = {
  '/': () => renderHome(),
  '/users': () => renderUsers()
}

function getHashPath() {
  return location.hash.slice(1) || '/'
}

function renderRoute() {
  const path = getHashPath()
  const render = routes[path] || renderNotFound
  render()
}

window.addEventListener('hashchange', renderRoute)
renderRoute()

常见误区

  • 认为 hash 变化会请求服务器,混淆了 hash 路由和 history 路由。
  • 只监听 hashchange,忘记页面首次加载也要根据当前 hash 渲染。
  • 不处理未知路径和默认重定向,导致空白页。

作者信息