记录使用VitePress中遇到的各种问题

第一次使用 VitePress 做文档,边开发边记录,是个好习惯!

文档根目录docs,publicPath helpCenter

❤️ 已基本解决的问题

logo配置

logo文件放到 docs/public 文件夹下

配置favicon

js 复制代码
const base = '/helpCenter/'

export default defineConfig({
  head: [['link', { rel: 'icon', href: base + 'favicon.ico' }]],

使用CSS预处理器

VitePress 内置支持 CSS 预处理器:.scss.sass、.less.styl.stylus 文件。无需为它们安装 Vite 专用插件,但必须安装相应的预处理器:

bash 复制代码
# .scss and .sass
npm install -D sass

# .less
npm install -D less

# .styl and .stylus
npm install -D stylus

自动生成侧边栏

js 复制代码
// siderbar.ts

import path from 'path'
import fs from 'fs'

function genSideFiles(file): string[] {
  const list = fs.readdirSync(file)
  let results: string[] = []
  list.forEach((file2: string) => {
    file2 = file + '/' + file2
    if (path.extname(file2) === '.md') results.push(file2.replace('./docs/src', ''))
  })
  return results
}

// 动态生成侧边栏函数
export const walk = function (dir, subDir = '') {
  let results: string[] = []
  const list = fs.readdirSync(dir + subDir)

  list.forEach((file: string) => {
    file = dir + subDir + '/' + file

    const stats = fs.statSync(file)

    // 如果是下级目录
    if (stats.isDirectory()) {
      const list2 = fs.readdirSync(file)

      list2
        .forEach((file2: string) => {
          file2 = file + '/' + file2
          if (path.extname(file2) === '.md') results.push(file2.replace('./docs/src', ''))
        })
        ?.sort((a, b) => {
          const index1 = Number(a.text.split('.')[0])
          const index2 = Number(b.text.split('.')[0])
          return index1 - index2
        })
    }
    // 找到md文件
    if (path.extname(file) === '.md') {
      results.push(file.replace('./docs/src', ''))
    }
  })
  const items = results.map((item) => {
    return {
      text: path.basename(item, '.md'),
      link: item.replace('./docs/src', '').replace('.md', '')
    }
  })

  return {
    text: subDir,
    collapsible: true,
    collapsed: false,
    items: items
  }
}
js 复制代码
// config.mts
 sidebar: [
      {
        text: '常见问题',
        collapsed: false,
        items: [walk(baseDir + '/常见问题', '')]
      }

中文国际化

js 复制代码
// zh.ts
export default {
  outline: { label: '页面导航' },
  docFooter: { prev: '上一页', next: '下一页' }
}

在theme/config.mts中引入

js 复制代码
import zh from "./zh";
export default defineConfig({
  // ...

  themeConfig: {
    // https://vitepress.dev/reference/default-theme-config
    
    ...zh,
    
    // 下面代码是搜索框的中文国际化
    search: {
      provider: "local",
      options: {
        translations: {
          button: {
            buttonText: "搜索帮助中心",
            buttonAriaLabel: "搜索帮助中心",
          },
          modal: {
            noResultsText: "无法找到相关结果",
            resetButtonTitle: "清除查询条件",
            footer: {
              selectText: "选择",
              navigateText: "切换",
              closeText: "关闭",
            },
          },
        },
      },
    },
  },
});

使用 element-plus

安装 element-plus

bash 复制代码
pnpm add element-plus -w

在theme/index.ts中引入

js 复制代码
// https://vitepress.dev/guide/custom-theme
import { h } from 'vue'
import type { Theme } from 'vitepress'
import DefaultTheme from 'vitepress/theme'
import './style.css'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

import Home from './Home.vue'

export default {
  extends: DefaultTheme,

  Layout: () => {
    return h(DefaultTheme.Layout, null, {
      // https://vitepress.dev/guide/extending-default-theme#layout-slots
    })
  },
  // Layout,
  enhanceApp({ app, router, siteData }) {
    // ...
    app.use(ElementPlus)
    app.component('Home', Home)
  }
} satisfies Theme

然后和平常一样使用就好了

html 复制代码
<el-button>click me</el-button>

判断当前环境是否 dev

打印import.meta.env,我们可以在控制台看到

consle 复制代码
{
    "BASE_URL": "/helpCenter/",
    "MODE": "development",
    "DEV": true,
    "PROD": false,
    "SSR": false
}
js 复制代码
if (import.meta.env.DEV) {
  // 当前是 dev
}

增加权限控制/登录后查看

现在的解决办法是判断 localstorage,感觉并不是多好的方法

js 复制代码
const hasToken = localStorage.getItem('token')
if (!hasToken) {
    // 跳转到登录
}

Hydration completed but contains mismatches

当我如以上代码使用localstorage时,本地运行是没问题的。但当我发布到服务器上,Hydration completed but contains mismatches,并且刷新某些文档时,文档内容消失了,但是有的文档是好的。

这好像是碰到 SSR 使用localstorage的问题,然而我对 SSR 的了解几乎为0,只好继续搜索解决办法,还好让我找到了一篇文章www.cnblogs.com/changxue/p/... 加上onMounted顺利解决该问题。

js 复制代码
onMounted(() => {
  const hasToken = window.localStorage.getItem('main_accessToken')
  if (!import.meta.env.DEV) {
    if (!hasToken) window.location.href = 'http://' + location.hostname + '/cloud'
  }
})

🌟 待解决问题

添加图片放大预览效果

相关推荐
懒大王爱吃狼27 分钟前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
逐·風4 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫5 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
尚梦6 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子6 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
前端青山6 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
毕业设计制作和分享7 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
清灵xmf9 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询
大佩梨9 小时前
VUE+Vite之环境文件配置及使用环境变量
前端
GDAL9 小时前
npm入门教程1:npm简介
前端·npm·node.js