使用VitePress静态网站生成器创建组件库文档网站并部署到GitHub

news2024/11/28 14:10:52

Vue3+TS+Vite开发组件库并发布到npm

网站在线预览:

Vue Amazing UI | Amazing UI Components LibraryAmazing UI 组件库https://themusecatcher.github.io/vue-amazing-ui/参考文档: 

  • VitePress

目录

一、安装依赖及配置

1、安装 vitepress

2、在 package.json 中添加指令

3、创建文档网站目录和文件

①创建 docs/ 目录

②在 docs/ 下新建 index.md 首页文件

③在 docs/ 下新建 public/ 文件夹

4、 启动项目

二、编写组件库文档

1、创建相关文件及目录

2、编写网站首页

3、编写文档全局样式

4、引入默认主题、全局样式与组件库

5、 配置网站

6、配置 Algolia 搜索

①申请搜索服务

②等待申请通过的邮件

③回复邮件

④等待回复邮件

⑤配置并引入 algolia 搜索服务

 三、网站内容目录

1、创建内容目录文件

2、创建各个组件文档

四、打包静态网站并部署到 GitHub

1、创建脚本目录

2、 在 package.json 添加指令

3、打包部署

4、配置 github


一、安装依赖及配置

1、安装 vitepress

推荐使用 pnpm,安装pnpm:

npm install -g pnpm

安装vitepress: 

pnpm add vitepress -D
# or
yarn add vitepress -D

2、在 package.json 中添加指令

在 script 中添加文档网站启动和打包指令,启动时指定端口 8000,并自动打开

"scripts": {
    "docs:dev": "vitepress dev docs --port 8000 --open",
    "docs:build": "vitepress build docs"
}

完整 package.json 文件如下: 

{
  "name": "vue-amazing-ui",
  "version": "0.0.30",
  "private": false,
  "type": "module",
  "files": [
    "dist"
  ],
  "main": "./dist/vue-amazing-ui.umd.cjs",
  "module": "./dist/vue-amazing-ui.js",
  "exports": {
    "./dist/style.css": "./dist/style.css",
    "./css": "./dist/style.css",
    ".": {
      "import": "./dist/vue-amazing-ui.js",
      "require": "./dist/vue-amazing-ui.umd.cjs"
    }
  },
  "scripts": {
    "dev": "vite --port 9000 --open --force",
    "build": "run-p type-check build-only",
    "docs:dev": "vitepress dev docs --port 8000 --open",
    "docs:build": "vitepress build docs",
    "docs:deploy": "sh script/deploy.sh",
    "pub": "sh script/publish.sh",
    "preview": "vite preview",
    "build-only": "vite build",
    "type-check": "vue-tsc --noEmit",
    "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore"
  },
  "dependencies": {
    "@vuepic/vue-datepicker": "^4.5.1",
    "@vueuse/core": "^10.1.2",
    "@vueuse/integrations": "^10.1.2",
    "ant-design-vue": "^3.2.20",
    "core-js": "^3.30.2",
    "date-fns": "^2.30.0",
    "qrcode": "^1.5.3",
    "swiper": "^9.3.2",
    "vue": "^3.3.4",
    "vue-amazing-ui": "^0.0.30",
    "vue-router": "^4.2.1"
  },
  "devDependencies": {
    "@rushstack/eslint-patch": "^1.3.0",
    "@types/node": "^18.16.14",
    "@vitejs/plugin-vue": "^4.2.3",
    "@vue/eslint-config-typescript": "^11.0.3",
    "@vue/tsconfig": "^0.1.3",
    "eslint": "^8.41.0",
    "eslint-plugin-vue": "^9.14.0",
    "less": "^4.1.3",
    "npm-run-all": "^4.1.5",
    "prettier": "^2.8.8",
    "rollup-plugin-visualizer": "^5.9.0",
    "terser": "^5.17.6",
    "typescript": "~4.7.4",
    "unplugin-vue-components": "^0.25.0",
    "vite": "^4.3.8",
    "vitepress": "1.0.0-beta.1",
    "vue-tsc": "^1.6.5"
  },
  "description": "This template should help get you started developing with Vue Amazing UI in Vue 3.",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/themusecatcher/vue-amazing-ui.git"
  },
  "keywords": [
    "Vue3",
    "TS",
    "Vite",
    "Amazing",
    "UI",
    "Components"
  ],
  "author": "theMuseCatcher",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/themusecatcher/vue-amazing-ui/issues"
  },
  "homepage": "https://github.com/themusecatcher/vue-amazing-ui#readme"
}

3、创建文档网站目录和文件

①创建 docs/ 目录

②在 docs/ 下新建 index.md 首页文件

③在 docs/ 下新建 public/ 文件夹

用于存放各种静态资源,例如:网站logo、首页图片等 

4、 启动项目

 启动后项目会在自动 /docs 下生成 .vitepress/ 目录

pnpm docs:dev

二、编写组件库文档

1、创建相关文件及目录

在 docs/.vitepress 中

创建 config.ts 配置文件

创建 theme/ 文件夹

在 theme/ 中创建 index.ts 文件

在 theme/ 中创建 global.less 存放全局样式(使用 less 文件需要安装相应依赖 )

创建 utils/ 文件夹(用于存放自定义 ts 方法,一会首页自定义显示版本标签会用到)

(文档内使用了 less)安装 less 预处理器: 相关文档

pnpm add less -D

2、编写网站首页

首页配置参考文档

在 docs/index.md 中编写首页相关内容,其中 fetchVersion() 自定义方法用于在首页 tagline 后添加自定义版本标签

---
layout: home

title: Vue Amazing UI
titleTemplate: Amazing UI Components Library

hero:
  name: Vue Amazing UI
  text: Amazing UI 组件库
  tagline: 基于 Vue3 + TS + Vite 开发
  image:
    src: /logo-with-shadow.png
    alt: Vue Amazing UI
  actions:
    - theme: brand
      text: Get Started
      link: /guide/features
    - theme: alt
      text: View on GitHub
      link: https://github.com/themusecatcher/vue-amazing-ui
    - theme: alt
      text: View on NPM
      link: https://www.npmjs.com/package/vue-amazing-ui
---

<script setup lang="ts">
import { onMounted } from 'vue'
import { fetchVersion } from './.vitepress/utils/fetchVersion'

onMounted(() => {
  fetchVersion()
})
</script>

在 docs/.vitepress/utils/ 中创建 fetchVersion.ts 文件

// 远程读取 github 仓库中 package.json 文件中的 version 版本号
// 方式一:
  // 读取规则:https://api.github.com/repos/<username>/<repo>/contents/<file>?ref=<branch 可选,默认master>
  // return fetch('https://api.github.com/repos/themusecatcher/vue-amazing-ui/contents/package.json?ref=master', {
  //   headers: {
  //     // See https://docs.github.com/en/rest/overview/media-types
  //     Accept: 'application/vnd.github.v3.raw',
  //     // See https://docs.github.com/en/rest/guides/getting-started-with-the-rest-api#authentication
  //     // Authorization: 'token ${GITHUB_TOKEN}',
  //   }
  // })
  // 方式二:
  // 读取规则:https://raw.githubusercontent.com/<username>/<repo>/<branch>/<file>
export function fetchVersion() {
  return fetch('https://raw.githubusercontent.com/themusecatcher/vue-amazing-ui/master/package.json')
    .then(res => res.json())
    .then(json => json.version ?? '')
    .then(version => {
      if (!version) return
      const tagLineParagragh = document.querySelector('div.VPHero.has-image.VPHomeHero > div > div.main > p.tagline')
      const docsVersionSpan = document.createElement('samp')
      docsVersionSpan.classList.add('version-tag')
      docsVersionSpan.innerText = version
      tagLineParagragh?.appendChild(docsVersionSpan)
    })
}

在 docs/.vitepress/theme/global.less 中写入标签样式

.version-tag {
  font-size: 14px;
  line-height: 1.571;
  font-weight: bold;
  padding: 4px 6px;
  margin-left: 6px;
  background: #bd34fe;
  color: #FFF;
  border-radius: 10px;
  display: inline-block;
  vertical-align: top;
  margin-top: 4px;
}

效果如下图,版本标签:0.0.30

3、编写文档全局样式

在 theme/global.less 中写入样式,以下样式皆源自 vite 官网项目中使用的全局样式,并稍加修改:

/**
 * Colors
 * -------------------------------------------------------------------------- */

:root {
  --vp-c-brand: #646cff;
  --vp-c-brand-light: #747bff;
  --vp-c-brand-lighter: #9499ff;
  --vp-c-brand-lightest: #bcc0ff;
  --vp-c-brand-dark: #535bf2;
  --vp-c-brand-darker: #454ce1;
  --vp-c-brand-dimm: rgba(100, 108, 255, 0.08);
  --c-brand: #646cff;
  --c-brand-light: #747bff;
}

/**
 * Component: Button
 * -------------------------------------------------------------------------- */

:root {
  --vp-button-brand-border: var(--vp-c-brand-light);
  --vp-button-brand-text: var(--vp-c-white);
  --vp-button-brand-bg: var(--vp-c-brand);
  --vp-button-brand-hover-border: var(--vp-c-brand-light);
  --vp-button-brand-hover-text: var(--vp-c-white);
  --vp-button-brand-hover-bg: var(--vp-c-brand-light);
  --vp-button-brand-active-border: var(--vp-c-brand-light);
  --vp-button-brand-active-text: var(--vp-c-white);
  --vp-button-brand-active-bg: var(--vp-button-brand-bg);
}

/**
 * Component: Home
 * -------------------------------------------------------------------------- */

:root {
  --vp-home-hero-name-color: transparent;
  --vp-home-hero-name-background: -webkit-linear-gradient(
    120deg,
    #bd34fe 30%,
    #41d1ff
  );

  --vp-home-hero-image-background-image: linear-gradient(
    -45deg,
    #bd34fe 50%,
    #47caff 50%
  );
  --vp-home-hero-image-filter: blur(40px);
}

@media (min-width: 640px) {
  :root {
    --vp-home-hero-image-filter: blur(56px);
  }
}

@media (min-width: 960px) {
  :root {
    --vp-home-hero-image-filter: blur(72px);
  }
}

/**
 * Component: Custom Block
 * -------------------------------------------------------------------------- */

:root {
  --vp-custom-block-tip-border: var(--vp-c-brand);
  --vp-custom-block-tip-text: var(--vp-c-brand-darker);
  --vp-custom-block-tip-bg: var(--vp-c-brand-dimm);
}

.dark {
  --vp-custom-block-tip-border: var(--vp-c-brand);
  --vp-custom-block-tip-text: var(--vp-c-brand-lightest);
  --vp-custom-block-tip-bg: var(--vp-c-brand-dimm);
}

/**
 * Component: Algolia
 * -------------------------------------------------------------------------- */

.DocSearch {
  --docsearch-primary-color: var(--vp-c-brand) !important;
}

/**
 * VitePress: Custom fix
 * -------------------------------------------------------------------------- */

/*
  Use lighter colors for links in dark mode for a11y.
  Also specify some classes twice to have higher specificity
  over scoped class data attribute.
*/
.dark .vp-doc a,
.dark .vp-doc a > code,
.dark .VPNavBarMenuLink.VPNavBarMenuLink:hover,
.dark .VPNavBarMenuLink.VPNavBarMenuLink.active,
.dark .link.link:hover,
.dark .link.link.active,
.dark .edit-link-button.edit-link-button,
.dark .pager-link .title {
  color: var(--vp-c-brand-lighter);
}

.dark .vp-doc a:hover,
.dark .vp-doc a > code:hover {
  color: var(--vp-c-brand-lightest);
  opacity: 1;
}
.vp-doc a {
  font-weight: normal;
}
.vp-doc p {
  margin: 0;
}
/* Transition by color instead of opacity */
.dark .vp-doc .custom-block a {
  transition: color 0.25s;
}
a:hover {
  text-decoration: none !important;
}
summary {
  font-weight: 600;
  &:hover {
    cursor: pointer;
    color: var(--vp-c-brand-lighter);
  }
}
svg {
  fill: var(--vp-c-text-1);
}
.VPNavBarTitle .title {
  transition: all 0.25s;
  &:hover {
    color: var(--vp-c-brand);
  }
}
.version-tag {
  font-size: 14px;
  line-height: 1.571;
  font-weight: bold;
  padding: 4px 6px;
  margin-left: 6px;
  background: #bd34fe;
  color: #FFF;
  border-radius: 10px;
  display: inline-block;
  vertical-align: top;
  margin-top: 4px;
}

4、引入默认主题、全局样式与组件库

安装组件库

pnpm add vue-amazing-ui

在 theme/index.ts 中引入默认主题、全局样式并全局注册组件库

import DefaultTheme from 'vitepress/theme'
import './global.less' // global less
import VueAmazingUI from 'vue-amazing-ui'
import 'vue-amazing-ui/css'
// import VueAmazingUI from '../../../dist/vue-amazing-ui'
// import '../../../dist/style.css'

export default {
  extends: DefaultTheme, // or ...DefaultTheme
  enhanceApp ({ app }) {
    app.use(VueAmazingUI)
  }
}

5、 配置网站

在 docs/.vitepress/config.ts 中进行网站配置

import { defineConfig } from 'vitepress'

export default defineConfig({
  title: `Vue Amazing UI`,
  description: 'Amazing UI 组件库',
  base: '/vue-amazing-ui/',

  head: [ // 网站图标
    ['link', { rel: 'icon', type: 'image/svg+xml', href: 'logo.svg' }],
    // ['link', { rel: 'icon', type: 'image/x-icon', href: 'favicon.ico' }],
  ],
  appearance: true, // 默认 true,设为 false 则无法切换dark/light主题,可选 'dark' true false
  markdown: {
    lineNumbers: false // 是否显示行数,默认false
  },
  themeConfig: {
    logo: '/logo.svg',

    editLink: {
      pattern: 'https://github.com/themusecatcher/vue-amazing-ui/tree/master/docs/:path',
      text: 'Suggest changes to this page',
    },
    // 默认支持icon包括:'discord'|'facebook'|'github'|'instagram'|'linkedin'|'mastodon'|'slack'|'twitter'|'youtube'
    socialLinks: [
      { icon: 'github', link: 'https://github.com/themusecatcher/vue-amazing-ui' },
      // 自定义icon
      // {
      //   icon: {
      //     svg: '<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Dribbble</title><path d="M12...6.38z"/></svg>'
      //   },
      //   link: 'https://www.npmjs.com/package/vue-amazing-ui'
      // }
    ],

    // search: { // vitepress 内置 search
    //   provider: 'local'
    // },

    algolia: { // algolia 搜索服务 与 内置 search 可二选一
      appId: 'SHDNEYGA8Z',
      apiKey: '91419401b0b0efd31b610e54e5b97249',
      indexName: 'vue-amazing-ui'
    },

    footer: {
      message: 'Released under the MIT License.',
      copyright: 'Copyright © 2023-present The Muse Catcher',
    },

    nav: [
      { text: '组件', link: '/guide/features', activeMatch: '/guide/' },
      { text: '工具', link: '/utils/started', activeMatch: '/utils/' },
      {
        text: '链接',
        items: [
          { text: 'My Github', link: 'https://github.com/themusecatcher' },
          { text: 'My CSDN', link: 'https://blog.csdn.net/Dandrose?type=blog' },
          {
            items: [
              {
                text: 'vue',
                link: 'https://cn.vuejs.org/',
              },
              {
                text: 'vitepress',
                link: 'https://vitepress.dev/',
              }
            ]
          }
        ]
      }
    ],

    sidebar: {
      '/guide/': [
        {
          text: '指引',
          items: [
            {
              text: '特性',
              link: '/guide/features'
            },
            {
              text: '快速上手',
              link: '/guide/started'
            }
          ]
        },
        {
          text: '组件',
          items: [
            {
              text: '面包屑 Breadcrumb',
              link: '/guide/components/breadcrumb'
            },
            {
              text: '按钮 Button',
              link: '/guide/components/button'
            },
            {
              text: '走马灯 Carousel',
              link: '/guide/components/carousel'
            },
            {
              text: '级联选择 Cascader',
              link: '/guide/components/cascader'
            },
            {
              text: '多选框 Checkbox',
              link: '/guide/components/checkbox'
            },
            {
              text: '折叠面板 Collapse',
              link: '/guide/components/collapse'
            },
            {
              text: '倒计时 Countdown',
              link: '/guide/components/countdown'
            },
            {
              text: '日期选择 DatePicker',
              link: '/guide/components/datepicker'
            },
            {
              text: '对话框 Dialog',
              link: '/guide/components/dialog'
            },
            {
              text: '分割线 Divider',
              link: '/guide/components/divider'
            },
            {
              text: '空状态 Empty',
              link: '/guide/components/empty'
            },
            {
              text: '图片 Image',
              link: '/guide/components/image'
            },
            {
              text: '数字输入框 InputNumber',
              link: '/guide/components/inputnumber'
            },
            {
              text: '全局提示 Message',
              link: '/guide/components/message'
            },
            {
              text: '信息提示 Modal',
              link: '/guide/components/modal'
            },
            {
              text: '通知提醒框 Notification',
              link: '/guide/components/notification'
            },
            {
              text: '分页器 Pagination',
              link: '/guide/components/pagination'
            },
            {
              text: '进度条 Progress',
              link: '/guide/components/progress'
            },
            {
              text: '二维码 QRCode',
              link: '/guide/components/qrcode'
            },
            {
              text: '单选框 Radio',
              link: '/guide/components/radio'
            },
            {
              text: '评分 Rate',
              link: '/guide/components/rate'
            },
            {
              text: '选择器 Select',
              link: '/guide/components/select'
            },
            {
              text: '滑动输入条 Slider',
              link: '/guide/components/slider'
            },
            {
              text: '加载中 Spin',
              link: '/guide/components/spin'
            },
            {
              text: '步骤条 Steps',
              link: '/guide/components/steps'
            },
            {
              text: '触摸滑动插件 Swiper',
              link: '/guide/components/swiper'
            },
            {
              text: '开关 Switch',
              link: '/guide/components/switch'
            },
            {
              text: '表格 Table',
              link: '/guide/components/table'
            },
            {
              text: '标签页 Tabs',
              link: '/guide/components/tabs'
            },
            {
              text: '文字滚动 TextScroll',
              link: '/guide/components/textscroll'
            },
            {
              text: '时间轴 Timeline',
              link: '/guide/components/timeline'
            },
            {
              text: '文字提示 Tooltip',
              link: '/guide/components/tooltip'
            },
            {
              text: '上传 Upload',
              link: '/guide/components/upload'
            },
            {
              text: '播放器 Video',
              link: '/guide/components/video'
            },
            {
              text: '瀑布流 Waterfall',
              link: '/guide/components/waterfall'
            }
          ]
        }
      ],
      '/utils/': [
        {
          text: '指引',
          items: [
            {
              text: '快速上手',
              link: '/utils/started'
            }
          ]
        },
        {
          text: '工具',
          items: [
            {
              text: 'date 日期格式化',
              link: '/utils/date-format'
            },
            {
              text: 'raf 动画帧',
              link: '/utils/animation-frame'
            },
            {
              text: 'raf 定时器',
              link: '/utils/raf-timeout'
            },
            {
              text: 'throttle 节流',
              link: '/utils/throttle'
            },
            {
              text: 'debounce 防抖',
              link: '/utils/debounce'
            },
            {
              text: 'add 加法',
              link: '/utils/add'
            },
            {
              text: 'downloadFile 下载文件',
              link: '/utils/download-file'
            }
          ]
        }
      ]
    }
  }
})

6、配置 Algolia 搜索

申请搜索服务

申请地址 

填写部署到公网的网站地址、邮箱和代码仓库地址,全部勾选,然后提交!

②等待申请通过的邮件

③回复邮件

I am the maintainer of the website, I can modify the code ~

④等待回复邮件

获取 appId、apiKey、indexName

⑤配置并引入 algolia 搜索服务

 在 docs/.vitepress/config.ts 中写入以下配置 

import { defineConfig } from 'vitepress'

export default defineConfig({
  themeConfig: {
    algolia: {
      appId: 'SHDNEYGA8Z',
      apiKey: '91419401b0b0efd31b610e54e5b97249',
      indexName: 'vue-amazing-ui'
    }
  }
})

algolia 搜索效果如下图:

网站整体目录结构如下图:

网站首页效果如下图:

 三、网站内容目录

1、创建内容目录文件

在 docs/ 下新建 /guide 文件夹

注意:目录结构需要与 docs/.vitepress/config.ts 配置文件中的 sidebar 属性相对应

创建 components/ 目录用于存放每个组件对应的文档页

创建 features.md 和 started.md 用与编写网站指引中的 特性 和 快速上手页面

features.md 文件:

# 特性

## 简要介绍

该组件库采用 Vue3 + TS + Vite3 + Less 实现!

开箱即用!

## 三种使用方式

- 全局引入所有组件
- 按需引入部分组件
- git clone [vue-amazing-ui](https://github.com/themusecatcher/vue-amazing-ui) 到本地后,从 packages 下单独拷贝单文件组件 (SFC) 到项目内使用

started.md 文件:

# 快速上手

## 安装

**With PNPM**

```bash
$ pnpm i vue-amazing-ui
# or
$ pnpm add vue-amazing-ui
```

**With Yarn**

```bash
$ yarn add vue-amazing-ui
```

**With NPM**

```bash
$ npm i vue-amazing-ui
```

## 使用

**Global**

```ts
import { createApp } from 'vue'
import App from './App.vue'

import VueAmazingUI from 'vue-amazing-ui'
import 'vue-amazing-ui/css'

const app = createApp(App)
app.use(VueAmazingUI)

app.mount('#app')
```

**Local**

```vue
<script setup lang="ts">
import { Button } from 'vue-amazing-ui'
import 'vue-amazing-ui/css'
</script>

<template>
  <Button></Button>
</template>
```

2、创建各个组件文档

在 components/ 目录下分别创建组件对应 md 文件

例如:编写 面包屑 breadcrumb 组件文档:

# 面包屑 Breadcrumb

<br/>

*显示当前页面在系统层级结构中的位置,并能向上返回*

## 何时使用

- 当系统拥有超过两级以上的层级结构时
- 当需要告知用户『你在哪里』时
- 当需要向上导航的功能时

<script setup lang="ts">
const routes = [
    {
      path: '/first', // 路由地址
      query: { id: 1, tab: 2 }, // 路由参数
      name: '一级路由' // 路由名称
    },
    {
      path: '/second',
      name: '二级路由'
    },
    {
      path: '/third',
      name: '三级路由三级路由三级路由三级路由'
    }
  ]
</script>

## 基本使用

<Breadcrumb :routes="routes" />

::: details Show Code

```vue
<script setup lang="ts">
const routes = [
    {
      path: '/first', // 路由地址
      query: { id: 1, tab: 2 }, // 路由参数
      name: '一级路由' // 路由名称
    },
    {
      path: '/second',
      name: '二级路由'
    },
    {
      path: '/third',
      name: '三级路由三级路由三级路由三级路由'
    }
  ]
</script>
<template>
  <Breadcrumb :routes="routes" />
</template>
```

:::

## 自定义分隔符

<Breadcrumb :routes="routes" separator="/" />

::: details Show Code

```vue
<script setup lang="ts">
const routes = [
    {
      path: '/first', // 路由地址
      query: { id: 1, tab: 2 }, // 路由参数
      name: '一级路由' // 路由名称
    },
    {
      path: '/second',
      name: '二级路由'
    },
    {
      path: '/third',
      name: '三级路由三级路由三级路由三级路由'
    }
  ]
</script>
<template>
  <Breadcrumb :routes="routes" separator="/" />
</template>
```

:::

## 自定义样式

<Breadcrumb :routes="routes" :font-size="16" />

::: details Show Code

```vue
<script setup lang="ts">
const routes = [
    {
      path: '/first', // 路由地址
      query: { id: 1, tab: 2 }, // 路由参数
      name: '一级路由' // 路由名称
    },
    {
      path: '/second',
      name: '二级路由'
    },
    {
      path: '/third',
      name: '三级路由三级路由三级路由三级路由三级路由'
    }
  ]
</script>
<template>
  <Breadcrumb :routes="routes" :font-size="16" />
</template>
```

:::

## 新页面打开目标链接

<Breadcrumb :routes="routes" target="_blank" />

::: details Show Code

```vue
<script setup lang="ts">
const routes = [
    {
      path: '/first', // 路由地址
      query: { id: 1, tab: 2 }, // 路由参数
      name: '一级路由' // 路由名称
    },
    {
      path: '/second',
      name: '二级路由'
    },
    {
      path: '/third',
      name: '三级路由三级路由三级路由三级路由'
    }
  ]
</script>
<template>
  <Breadcrumb :routes="routes" target="_blank" />
</template>
```

:::

## APIs

参数 | 说明 | 类型 | 默认值 | 必传
-- | -- | -- | -- | --
routes | 路由数组 | Route[] | [] | true
fontSize | 字体大小,单位px | number | 14 | false
height | 面包屑高度 | number | 36 | false
maxWidth | 文本最大显示宽度,超出后显示省略号,单位px | 180 | false
separator | 分隔符,默认''时为箭头 | string | '' | false
target | 如何打开目标URL | '_self' &#124; '_blank' | '_self' | false

## Route Type

名称 | 说明 | 类型 | 必传
-- | -- | -- | --
path | 路由地址 | string | true
query | 路由查询参数 | [propName: string]: any | false
name | 路由名称 | string | true

四、打包静态网站并部署到 GitHub

1、创建脚本目录

在项目根目录 创建 script/ 目录,主要用于存放各种脚本文件,方便日后自动化开发流程!

创建 deploy.sh 用于打包静态网站,并部署到 Github

创建 publish.sh 用于打包升级组件库 ,并发布到 npm,同时自动升级项目内组件库依赖版本到最新

deploy.sh 文件:

# /bin/bash

# 确保脚本抛出遇到的错误
set -e

# 重新打包组件库

pnpm build

# 打包生成静态文件
pnpm docs:build

# 进入待发布的 dist/ 目录
cd docs/.vitepress/dist

git init
git add .
git commit -m 'deploy'

# 部署到 https://<username>.github.io/<repo>
git push -f git@github.com:themusecatcher/vue-amazing-ui.git master:github-pages

# 提交所有代码到github
cd ../../../
git add .
git cm -m 'update'
git push

publish.sh 文件(需提前登录 npm 账户,否则无法直接发布): 

# /bin/bash

# 确保脚本抛出遇到的错误
set -e

 # 读取package.json中的version
version=`jq -r .version package.json`

 # 打包构建
pnpm build

 # 提交代码到github
git add .
git commit -m "update $version"
git push

 # 发布到npm,pnpm(高性能的npm)
pnpm publish

# 升级 vue-amazing-ui 依赖版本
pnpm up vue-amazing-ui@$version

# 提交版本更新代码到github
git add .
git cm -m "update $version"
git push

2、 在 package.json 添加指令

"scripts": {
    "docs:deploy": "sh script/deploy.sh",
    "pub": "sh script/publish.sh"
}

3、打包部署

pnpm docs:deploy

4、配置 github

save 成功之后,点击 Visit site 打开查看网站:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

想要精通算法和SQL的成长之路 - 反转链表

想要精通算法和SQL的成长之路 - 反转链表 前言一. 反转链表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 反转链表 原题链接 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 思路如下&#xff1a; 我们可以通过一次遍历&#xff…

该怎么用设计测试用例测网上银行转账?

目录 前言 1、网上银行转账是怎么测的&#xff0c;设计一下测试用例。 回答思路&#xff1a; 2、测试工作的流程?缺陷状态有什么?设计测试用例有几种方法&#xff1f; 修改完以后&#xff0c;有两种处理情况&#xff1a; 3、在项目中找到的经典BUG是什么&#xff1f; 4、定期…

kali系统渗透

用kali远程ssh时&#xff0c;如果不能的话 按照以下方法 ┌──(root㉿kali)-[~]└─# mkdir ~/.ssh┌──(root㉿kali)-[~]└─# vim ~/.ssh/configHost *HostkeyAlgorithms ssh-rsaPubkeyAcceptedKeyTypes ssh-rsa msfconlole -q //进入马上发不显示内容&#xff0c;所以加…

编程实现人脸识别

1.更改url 用翔云平台下的人脸识别的API文档 把他贴到url中&#xff1a; 2.定义参数 &#xff08;根据平台给定的这些串口接收参数来定义&#xff09; key和secret在这里找&#xff1a; 3.指定post内容 把这部分定义成一个postString 4.字符串的拼接 sprintf函数调用的主…

使用粒子群优化算法(PSO)辨识锂电池二阶RC模型参数(附MATLAB代码)

目录 一、原理部分 二、代码详解部分 三、结果及分析 一、原理部分 PSO算法由美国学者于 1995 年提出&#xff0c;因其算法简单、效果良好&#xff0c;而在很多领域得到了广泛应用。该算法的起源是模拟鸟群的觅食过程&#xff0c;形成一种群体智能搜索算法。 其核心是&#…

使用Flask高效构建Web应用

1、聊聊Flask框架 Flask官方文档 Flask是Armin ronacher基于Python开发的微型Web框架&#xff0c;诞生于2010年&#xff0c;它依赖于jinja2模板和Werkzeug WSGI服务。Flask的核心简单易于扩展&#xff0c;它不会替你做出太多决策比如使用何种数据库或模板引擎&#xff0c;这些都…

抖音seo矩阵系统源码解析

抖音SEO矩阵系统源码是一种用于优化抖音视频内容的工具&#xff0c;可以帮助用户提高抖音视频的搜索排名和流量&#xff0c;从而增加视频曝光和转化率。该系统包括两部分&#xff0c;即数据收集和分析模块以及SEO策略和实施模块。 数据收集和分析模块主要负责从抖音平台上收集…

认识功能安全

01、什么是功能安全 1-背景简介 由于汽车的复杂性&#xff0c;整个行业正在致力于提供符合安全要求的零部件系统。比如&#xff0c;线控油门系统&#xff0c;当驾驶员踩下油门踏板&#xff0c;踏板上的传感器向控制器发送信号时&#xff0c;控制器会综合分析如发动机转速、车…

ERP系统实施,8个需要了解的关键绩效指标

实施ERP系统是一项复杂的、耗时的工作&#xff0c;但它也代表了企业重新思考其战略、目标和流程的绝佳机会。成功的ERP实施可以激发创新&#xff0c;改善企业的所有领域。例如&#xff0c;通过集中企业各部门不断增长的财务和业务数据&#xff0c;所有的决策者都在同一个页面上…

非煤矿山电子封条系统算法方案 opencv

非煤矿山电子封条系统算法部署方案是基于pythonopencv网络模型Ai视频图像识别技术&#xff0c;非煤矿山电子封条系统算法部署方案对出入井人员、人员变化及非煤矿山生产作业状态等状况&#xff0c;及时发现处理异常动态将自动发出警报。OpenCV的全称是Open Source Computer Vis…

亲身经历告诉你,0基础转行学Python,毕业就能15000

对生活现状的不满&#xff0c;对自己浑浑噩噩的厌恶&#xff0c;以及对互联网行业的憧憬&#xff0c;让我下定决心选择去黑马程序员开启转行之旅。 学科 | Python大数据开发 薪资 | 15000 时间总是在你回忆往事时才会觉得短暂&#xff0c;来黑马之前觉得六个月将是一段很漫长…

操作系统原理 —— 内存动态分区分配算法(二十一)

在上一个章节我们讲了内存连续分配的几种方式&#xff0c;有单一、固定、动态这三种&#xff0c;在固定、动态这种里面&#xff0c;操作系统会记录空闲分区表&#xff0c;这个表是用来记录当前空闲的内存。 那么在之后有新的进程装入内存&#xff0c;需要从空闲分区表中找到一…

从零手写操作系统之RVOS内存管理模块简单实现-02

从零手写操作系统之RVOS内存管理模块简单实现-02 内存管理分类内存映射表&#xff08;Memory Map)Linker Script 链接脚本语法基于符号定义获取程序运行时内存分布 基于 Page 实现动态内存分配代码讲解调试 扩展 本系列参考: 学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春 整…

qrcode.min.js下载

目录 qrcode.min.js下载步骤&#xff1a; 去官网 下载后解压&#xff1a; 如下&#xff1a;就可以得到 qrcode.min.js文件了 qrcode.min.js下载步骤&#xff1a; 去官网 可以前往qrcode官网&#xff08;https://davidshimjs.github.io/qrcodejs/&#xff09;下载qrcode.m…

培训pytorch(未完善) bp算法原理

生物的神经元 接受外部的刺激 神经网络工作流程演示

MySQL高可用集群解决方案之:MySql Cluster搭建

MySQL是当前使用最广泛的关系型数据库管理系统之一&#xff0c;但MySQL在高并发访问和大量数据处理方面存在较为明显的性能瓶颈。为了解决MySQL单点故障带来的不便和可扩展性问题&#xff0c;我们需要构建稳定性极高的MySQL集群方案。本文将介绍一种快速搭建MySQL集群的解决方案…

机器学习聚类算法——BIRCH算法、DBSCAN算法、OPTICS算法

系列文章目录 前言 本文主要介绍BIRCH算法、DBSCAN算法、OPTICS算法&#xff0c;以及相关案例举例&#xff0c;以下案例仅供参考 一、BIRCH算法 1.1、BIRCH算法简介 BIRCH&#xff08;Balanced Iterative Reducing and Clustering using Hierarchies&#xff0c;平衡迭代规约…

Kubernetes(K8s)各组件白话解释

深入springboot怎么启动tomcat NameSpacePodDeployment1. 创建多个副本2. 扩容/缩容3. 滚动更新4. 版本回退 ServiceClusterIpNodePort Ingress 个人笔记&#xff0c;仅供参考。 来源于尚硅谷视频 转载请评论。 NameSpace 名称空间&#xff0c;在K8s中用于隔离资源。对不同资源…

第十一届“泰迪杯”数据挖掘挑战赛成绩公示

第十一届“泰迪杯” 数据挖掘挑战赛成绩公示 第十一届“泰迪杯”数据挖掘挑战赛历时两个月顺利结束。竞赛采用盲审&#xff08;屏蔽参赛者信息&#xff1b;评审专家只能评阅非本区域作品&#xff1b;三位评阅专家同时评阅同一作品&#xff0c;超限调整后再取平均分&#xff0…

【小米的技术分享】数据库索引原理与底层数据结构解析

大家好&#xff0c;我是小米。今天我们来探讨一下数据库索引原理以及底层索引数据结构&#xff0c;同时还会介绍叶子节点存储的内容以及索引失效的情况。废话不多说&#xff0c;让我们开始吧&#xff01; IO操作与索引 首先&#xff0c;我们先来了解一下IO操作对于数据库索引的…