/* ===================================================================== * 路由与页面壳(router.js) * --------------------------------------------------------------------- * 【这个文件是干什么的?】 * 博客是"单页面应用"(SPA):全程只有一个 index.html, * 切换页面不会刷新整个网页,而是由 JavaScript 根据网址决定显示哪块内容。 * * 【核心概念:History API】 * - history.pushState(url, "", path):只修改地址栏网址,不刷新页面 * - window 的 popstate 事件:用户点浏览器"后退 / 前进"按钮时触发 * 两者配合,就能实现"地址变了 → 内容跟着变",而且前进后退都好用。 * 相关代码在 main.js 里:window.addEventListener("popstate", render) * * 【本文件的四个主要职责】 * 1. renderNav / renderAuthArea:渲染顶栏的导航链接和登录 / 用户菜单 * 2. parsePath:把网址字符串"翻译"成路由对象(/article/3 -> {name:"article", id:3}) * 3. navigate:点击链接时更新地址栏并重新渲染(SPA 的跳转核心) * 4. render:根据当前地址分发任务,调用对应的页面渲染函数 * 其他模块(main.js / auth.js / manage.js 等)都会 import 这里的函数。 * ===================================================================== */ import { FRIEND_STATUS_TEXT, PARTITIONS, ROLE_NAMES, state } from "./state.js"; import { $, escapeHtml, showToast } from "./utils.js"; import { logout, openLoginModal, openProfileModal, openRegisterModal, refreshUser } from "./auth.js"; import { applyFriend, openFriendListModal, openFriendManageModal } from "./friend.js"; import { renderArticle, renderHome, renderNotFound, renderPartition, renderProjectDetail } from "./article.js"; import { renderManage } from "./manage.js"; /* ---------------- 导航与顶栏 ---------------- */ /** 渲染顶部导航栏 * 把导航链接拼成 HTML 字符串,塞进