Files
website/.vitepress/config.mts
T
Dai0814 39209ef591
mirror-to-gitee / mirror (push) Successful in 3s
fix(portal): 导航栏锚点项点击后正确高亮
问题:点「产品功能 / 核心能力 / 界面预览 / 官方文档」跳转后图标不变蓝。
根因:VitePress 的 isActive() 只比较 path,不看 hash。nav 里
「首页 /」「产品功能 /#features」「核心能力 /#core」的路径部分都是 `/`,
默认逻辑要么把首页和当前锚点同时点亮,要么只亮首页。

改动
- 新增 .vitepress/theme/nav-anchor.ts 接管首页内锚点项的激活判定:
  用 data-anchor-active 属性标记,规则为
  在首页且有 hash → 只有 hash 匹配项亮;在首页无 hash → 只有「首页」亮;
  不在首页 → 清标记交回 VitePress 默认逻辑
- 样式侧用 html.portal-nav-home 限定压制默认 active 的作用域,
  只影响首页,不影响 /projects/ 与 /about 的正常高亮
- 导航「项目」加 activeMatch: '^/projects/',
  使 /projects/iotlcm/ 等详情页也保持高亮
- MutationObserver 监听导航 DOM 变化(SPA 切换、主题切换会重建)

踩的坑
- Layout 是函数式组件,onMounted 在其中无效(Vue 报"no active component
  instance"),改用 nextTick 调度
- 初版用 hashOf(a) 判空来识别「首页」,但 /projects/ 与 /about 也没有 hash,
  被误判成首页项一起点亮;改为判断 href 解析后是否为 '/'
- 抑制规则最初没加作用域,导致非首页页面的正常 active 也被压成黑字

验证(8 个场景逐个实测)
首页顶部→首页 / 四个锚点→各自高亮 / 项目页→项目 /
关于页→关于 / iotLCM 详情→项目;构建 13 页 274 引用 0 失效
2026-11-04 15:23:37 +08:00

82 lines
2.4 KiB
TypeScript

import { defineConfig } from 'vitepress'
import { projects } from '../data/projects'
/**
* 门户站构建配置
*
* SITE_BASE 由构建参数注入:
* - /www/ 过渡形态:挂在已有网关的 /www/ 路径下(没有独立域名时用)
* - / 独立域名形态:站点独占域名根路径
* 两者内容完全同源,只有资源前缀与路由前缀不同,所以用构建参数而不是改代码。
*/
const SITE_BASE = process.env.SITE_BASE ?? '/www/'
/** 代码仓组织(雪羊科技企业仓) */
const ORG_URL = process.env.ORG_URL ?? 'https://gitee.com/snowgoat'
/** 各项目的文档站地址(按项目 id 覆盖) */
const DOCS_URL: Record<string, string> = {
iotlcm: 'http://open.5iot.com:5051/docs/',
}
export default defineConfig({
srcDir: './pages',
base: SITE_BASE,
title: '雪羊科技开源',
description: '雪羊科技开源项目门户:物联网卡管理、DTU 设备管理、中后台开发框架',
lang: 'zh-CN',
cleanUrls: true,
lastUpdated: false,
head: [
['link', { rel: 'icon', type: 'image/svg+xml', href: `${SITE_BASE}favicon.svg` }],
],
themeConfig: {
siteTitle: '雪羊科技',
logo: { src: '/snowgoat-logo.png', alt: '雪羊科技' },
nav: [
{ text: '首页', link: '/' },
{ text: '产品功能', link: '/#features' },
{ text: '核心能力', link: '/#core' },
{ text: '界面预览', link: '/#preview' },
// activeMatch:进入任一项目详情页时「项目」保持高亮
{ text: '项目', link: '/projects/', activeMatch: '^/projects/' },
{ text: '官方文档', link: '/#docs' },
{ text: '关于', link: '/about' },
],
sidebar: {
'/projects/': [
{
text: '项目',
collapsed: false,
items: projects.map((p) => ({ text: p.name, link: p.page })),
},
],
'/guide/': [
{
text: '门户',
collapsed: false,
items: [{ text: '门户部署', link: '/guide/portal-deploy' }],
},
],
},
socialLinks: [
{ icon: 'github', link: ORG_URL },
],
footer: {
message: '雪羊科技开源 · Apache-2.0',
copyright: 'Copyright © 雪羊科技',
},
search: {
provider: 'local',
},
outline: {
level: [2, 3],
label: '本页目录',
},
docFooter: {
prev: '上一页',
next: '下一页',
},
},
})