Vuepress 文档脚手架(vue 3.x+vuepress2.x+vite+ts)

2023-10-27

在项目扩展到一定程度,我们会对项目中大量的公共业务做封装,当多人开发时就带来一个问题:如何让所有人快速使用封装好的组件,降低学习成本?

这里提供一个解决方案,那就是Vuepress框架,最新的 Vuepress2.x 框架已经蓄势待发,支持Vue3.x。

一、创建一个基础Vuepress项目

1、创建并进入一个新目录

创建VuepressDocs目录

mkdir VuepressDocs
cd VuepressDocs

2、初始化项目

git init
yarn init

3、将 VuePress 安装为本地依赖

yarn add -D vuepress@next

4、在 package.json 中添加一些 scripts

{
  "scripts": {
    "docs:dev": "vuepress dev docs",
    "docs:build": "vuepress build docs"
  }
}

5、将默认的临时目录和缓存目录添加到 .gitignore 文件中

echo 'node_modules' >> .gitignore
echo '.temp' >> .gitignore
echo '.cache' >> .gitignore

6、 创建你的第一篇文档

mkdir docs
echo '# Hello VuePress' > docs/README.md

7、在本地启动服务器来开发你的文档网站

yarn docs:dev

VuePress 会在 http://localhost:8080 启动一个热重载的开发服务器。当你修改你的 Markdown 文件时,浏览器中的内容也会自动更新。

现在,你应该已经有了一个简单可用的 VuePress 文档网站。接下来,了解一下 VuePress 配置 相关的内容。
在这里插入图片描述
在这里插入图片描述
到这里,你的第一个文档系统都跑起来了,目录结构如下:

VuepressDoc
├─ .gitignore
├─ docs
│  ├─ .vuepress
│  │  ├─ .cache
│  │  └─ .temp
│  └─ README.md
├─ node_modules
├─ package.json
├─ README.md
└─ yarn.lock

二、扩展文档系统能力

1、创建config.ts

在.vuepress中创建vuepress的初始化文件VuepressDoc/docs/.vurepress/config.ts,一个基础的 config.ts 代码如下:

import { defineUserConfig } from 'vuepress'

export default defineUserConfig({
  lang: 'zh-CN',
  title: '你好, VuePress !',
  description: '这是我的第一个 VuePress 站点',
})

2、路由映射

创建目录和文件:

mkdir docs/guide
echo "# 这里是guide目录" >> docs/guide/README.md
echo "# 这里是page页面" >> docs/guide/page.md

路由映射关系如下表:

相对路径(相对/docs目录) 路由路径 页面名称
/README.md / 首页
/guide/README.MD /guide/ guide路径
/guide/page.md /guide/page.html guide路径下page页面

效果如下:
在这里插入图片描述
在这里插入图片描述

3、支持vite

Vite 打包工具是由 @vuepress/bundler-vite 包提供的。它是 vuepress 包的依赖之一,当然你也可以单独安装它:

npm i -D @vuepress/bundler-vite@next

Vite 打包工具的配置项:
config.ts

import { viteBundler } from '@vuepress/bundler-vite'
import { defineUserConfig } from '@vuepress/cli'

export default defineUserConfig({
  bundler: viteBundler({
    viteOptions: {},
    vuePluginOptions: {},
  }),
})

4、整合vue3+vite

  1. 创建vue-vite-ts项目,npm create vite@latest demo -- --template vue-ts
    ui库一般是由文档展示模块docs、组件展示模块example、组件包模块packages构成。流程也就是:在packages中开发,在example中查看,在docs中展示。所以我们需要修改刚刚创建的vite项目结构
  2. 整改文件目录结构
    a、将vite项目demo中的所有文件移动到根目录中
    b、favicon.icon移动到根目录
    c、删除public
    d、src移动到根目录,改名为example
    e、修改index.html中对main.ts和favicon.icon的引用路径
    f、最后删除demo目录
|-- vuepress                                                                    |-- vuepress
    |-- package.json                                                             |-- package.json
    |-- yarn.lock                                                                |-- yarn.lock
    |-- docs                                                                     |-- docs
    |   |-- README.md                                                            |   |-- README.md
    |   |-- .vuepress                                                            |   |-- .vuepress
    |       |-- config.ts                                                        |       |-- config.ts
    |-- demo                                                                     |-- example
        |-- .gitignore                                                               |-- assets     
        |-- index.html                                                               |-- components 
        |-- package.json                                                             |-- App.vue
        |-- README.md                                             =>                 |-- main.ts
        |-- tsconfig.json                                                            |-- shims-vue.d.ts     
        |-- vite.config.ts                                                           |-- vite-env.d.ts
        |-- public                                                               |-- favicon.ico
        |   |-- favicon.ico                                                      |-- index.html
        |-- src                                                                  |-- tsconfig.json
            |-- App.vue                                                          |-- vite.config.ts
            |-- main.ts                                                          |-- .gitignore
            |-- shims-vue.d.ts                                                   |-- README.md
            |-- vite-env.d.ts                                                  
            |-- assets                                                  
            |-- components                                                  

注意修改移动项目过后的引用路径,以及将vite的package.json.gitignore和vuepress的package.json.gitignore等需要公用的文件整合

  1. 修改过后的package.json如下:
{
  "name": "my-ui",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "vite:vue": "vite",
    "vite:build": "vue-tsc --noEmit && vite build",
    "vite:serve": "vite preview",
    "docs:dev": "vuepress dev docs",
    "docs:build": "vuepress build docs"
  },
  "dependencies": {
    "vue": "^3.0.5"
  },
  "devDependencies": {
    "vuepress": "^2.0.0-beta.21",
    "vuepress-vite": "^2.0.0-beta.21",
    "@vitejs/plugin-vue": "^1.2.4",
    "@vue/compiler-sfc": "^3.0.5",
    "typescript": "^4.3.2",
    "vite": "^2.4.0",
    "vue-tsc": "^0.0.24"
  }
}

到这里,vite+vue+ts+vurepress项目基础已经搭建完成;
运行npm run dev,此时是跑的example演示页面,显示如下:
在这里插入图片描述
运行npm run docs:dev,此时是跑的docs文档演示页面,显示正常:
在这里插入图片描述

5、引入外部css和js文件

修改config.ts,加入配置项:

    head: [//额外的需要被注入到当前页面的 HTML <head> 中的标签
        ["link", { rel: "icon", href: "/images/favicon.ico" }],
        ["link", { rel: "stylesheet", href: "/css/style.css" }],    //自定义样式,也可以使用styles/index.styl来设置
        ["script", { charset: "utf-8", src: "/js/main.js" }],       //自定义js文件
    ],

打开页面,看到<head>*</head>中加上了上述的css和js文件,效果如图:
在这里插入图片描述

6、配置主题

主题配置主要涉及logo、头部导航、左侧菜单等,这里拆分成一共6个文件:

  • docs\.vuepress\config.js 配置主题theme字段,更多配置查看Vuepress主题配置
  • docs\.vuepress\config\nav.js 头部导航菜单
  • docs\.vuepress\config\sidebar.js 左侧菜单配置入口,实际配置项在各个路由目录的sidebar.js文件中
  • docs\guide\sidebar.js /guide 路由
  • docs\reference\components\sidebar.js \reference\components 路由
  • docs\reference\plugins\sidebar.js \reference\plugins 路由

以上6个文件代码如下:

  1. docs\.vuepress\config.js代码
const { defaultTheme } = require('vuepress')

export default {
	...
    theme: defaultTheme({// 主题设置
        logo: '/images/logo.png',
        repo: 'https://github.com/bobo456123/VuepressDoc.git',
        repoLabel: 'GitHub',
        navbar: require("./config/nav"),
        sidebar: require("./config/sidebar"),
        editLink: false,
        editLinkText: "编辑此页",
        editLinkPattern: "",
        sidebarDepth: 2,
        lastUpdated: true,
        lastUpdatedText: "更新时间",
        contributors: false,
        contributorsText: "贡献者",
        notFound: [
            '这里什么都没有',
            '我们怎么到这来了?',
            '这是一个 404 页面',
            '看起来我们进入了错误的链接',
        ],
        backToHome: '返回首页',

        // a11y
        openInNewWindow: '在新窗口打开',
        toggleDarkMode: '切换夜间模式',
        toggleSidebar: '切换侧边栏',
    }),
}

配置项中navbar用于配置头部导航菜单,sidebar用于配置左侧的菜单;

  1. docs\.vuepress\config\nav.js 代码
    头部菜单配置如下,支持层级配置子菜单:
module.exports = [
    { text: '指南', link: '/guide/document/' },
    {
        text: '参考', children: [
            { text: '组件', link: '/reference/components/' },
            { text: '插件', link: '/reference/plugins/' },
        ]
    },
    {
        text: '生态系统', children: [
            { text: 'Vue3.x', link: 'https://v3.cn.vuejs.org/' },
            { text: 'Element Plus', link: 'https://element-plus.gitee.io/zh-CN/guide/design.html' },
        ]
    },
];
  1. docs\.vuepress\config\sidebar.js 代码
module.exports = {
    '/guide/': require("../../guide/sidebar"),

    '/reference/components/': require("../../reference/components/sidebar"),
    '/reference/plugins/': require("../../reference/plugins/sidebar"),
};
  1. docs\guide\sidebar.js 代码(配置 guide 路由下左侧菜单):
module.exports = [
    {
        title: "文档指南",
        collapsable: true,
        children: [
            "/guide/document/"
        ]
    },
    {
        title: "设计原则",
        collapsable: true,
        children: [
            "/guide/design/"
        ]
    },
];
  1. docs\reference\components\sidebar.js 代码(配置 reference\components 路由下左侧菜单):
module.exports = [
    {
        title: "组件",
        collapsable: true,
        children: [
            "/reference/components/one",
            "/reference/components/two",
            "/reference/components/three",
        ]
    },
];
  1. docs\reference\plugins\sidebar.js 代码(配置 reference\plugins 路由下左侧菜单):
module.exports = [
    {
        title: "插件",
        collapsable: true,
        children: [
            "/reference/plugins/one",
            "/reference/plugins/two",
            "/reference/plugins/three",
        ]
    },
];

下面代码中配置的路径,必须要在对应目录中创建相应的 *.md 文件。
例如:
/reference/plugins/one 对应 docs\reference\plugins\one.md,末位不带/
/guide/document/ 对应 docs\guide\document\README.md,末位带/

配置完成后,npm run docs:dev重启服务,效果如下:

首页
指南
组件
生态系统

7、文档中支持element-plus

  1. 安装
npm install element-plus --save
  1. 客户端配置
    由于是使用的beta版本,框架的配置文件一直处于变动中,不同版本配置放不同。
  • 截止目前最新版本vuepress": "^2.0.0-beta.48,创建文件docs\.vuepress\client.ts,代码如下:
import { defineClientConfig } from '@vuepress/client'

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

export default defineClientConfig({
  enhance({ app, router, siteData }) {
    console.log("client.ts");
    console.log(app, router, siteData);
    app.use(ElementPlus);
  },
  setup() { },
  rootComponents: [],
})
  • 之前版本vuepress": "^2.0.0-beta.39,创建文件docs\.vuepress\clientAppEnhance.ts,代码如下:
import { defineClientAppEnhance } from '@vuepress/client'

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

export default defineClientAppEnhance(({ app, router, siteData }) => {
  console.log("clientAppEnhance.ts");
  console.log(app, router, siteData);
  app.use(ElementPlus);
})
  1. 使用element-plus组件
  2. config.ts ssr预编译排除,
  bundler: viteBundler({
    viteOptions: {
        ssr: {
            noExternal: ['element-plus'],
        },
    },
    vuePluginOptions: {},
  }),

*.md文件中

<el-button type="primary">按钮</el-button>

执行npm run docs:dev,页面上已经出现element按钮
在这里插入图片描述

8、文档中支持package中自定义组件

const { registerComponentsPlugin } = require('@vuepress/plugin-register-components')
const glob = require("glob");
const path = require("path");

module.exports = {
	...
    plugins: [
        registerComponentsPlugin({
            components: getComponents()
        }),
        // docsearchPlugin({
        //     // 配置项
        // }),
    ],
}
function getComponents(p = '../../packages/components/**/*.vue') {
    const components = {};
    const entryfiles = glob.sync(path.resolve(__dirname, p));
    let reg = /\/([\w|-]+)\/src\/([\w|-]+)\.vue$/;
    entryfiles
        .filter(item => reg.test(item))
        .map(function (item) {
            const folder = item.match(reg)[1];
            const filename = item.match(reg)[2];

            components[filename != "index" ? filename : folder] = item;
        });
    // console.log(components);
    return components;
}

最后附上github源码地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vuepress 文档脚手架(vue 3.x+vuepress2.x+vite+ts) 的相关文章

  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 我想检查 $('#td1').text() === "x" 是否?

    我想检查innerHtml是否有X或O 所以我不能再次添加任何其他东西 但它不起作用 添加检查代码后它就停止了 我在这里尝试做一个简单的XO游戏来更熟悉javascript和jquery 我也不确定是否可以用 jQuery 做到这一点
  • Meteor:应用程序无法在 0.9.1.1 版本上运行

    出现类似错误 Error TypeError undefined is not a function evaluating Template create anonymous function iron dynamic template j
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • 可以使用 jQuery 或 Javascript 将图片的特定部分用作链接吗?

    我有这个想法 将图片 而不是文本 的各个部分链接到不同的页面或网站 并且我想在不实际创建不同的照片并将它们彼此靠近的情况下完成 这样看起来就像是一张完整的图片 这里有人知道如何使用 JavaScript 的变体 例如 jQuery 或纯 J
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • Grails 在 javascript 内的 GSP 站点中使用 grails var

    我有一个在 GSP 文件中的 javascript 代码中使用 grails 变量值的问题 例如 我有一个会话值session getAttribute selectedValue 我想在 javascript 代码部分使用这个值 我现在的
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js)Vue Js

    我从 GitHub 下载了一个我和我的朋友正在开发的项目 但是当我尝试运行时 npm run serve 我收到这个错误 src main js 中的错误 Module build failed from node modules babe
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 为什么 jquery 没有检测到单选按钮未被选中的情况? [复制]

    这个问题在这里已经有答案了 可能的重复 JQuery radioButton change 在取消选择期间不会触发 https stackoverflow com questions 5176803 jquery radiobutton c
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win
  • 如何从图像输入中获取 xy 坐标?

    我有一个输入设置为图像类型

随机推荐

  • Mybatis Plus 多数据源和Druid集成

    Mybatis Plus 多数据源和Druid集成 添加maven依赖
  • linux的qt使用教程,Qt QLinkedList的使用方法

    概述 QLinkedList 是提供链表的一个模板类 QLinkedList 是QT的一个通用容器类 它存储列表的值 并基于迭代器访问 同时 它插入和删除元素比较快 constant time 通常情况来说 QList是比较合适的选择 QL
  • SQL注入原理-字符型注入

    小伙伴们大家好 本期为大家带来的是SQL注入原理 字符型注入的讲解 目录 SQL注入原理 字符型注入 一 单引号字符注入 1 测试是否存在注入点 2 判断字段个数 3 找出可以回显的字段 4 查看当前数据库 数据库用户以及数据库版本 5 查
  • 通过Function Score Query优化Elasticsearch搜索结果(综合排序)

    在使用 Elasticsearch 进行全文搜索时 搜索结果默认会以文档的相关度进行排序 如果想要改变默认的排序规则 也可以通过sort指定一个或多个排序字段 但是使用sort排序过于绝对 它会直接忽略掉文档本身的相关度 根本不会去计算 在
  • Flutter学习之旅(五)----网络请求获取数据、解析数据和显示等待动画

    参考官方文章 英文版 网络请求是APP开发中至关重要的一步 回想一下Android开发中的Retrofit框架或者Volley框架 iOS开发中AFNetworking框架 如果使用Volley进行网络请求 我们需要new一个StringR
  • 内网穿透Neo-reGeorg的使用

    内网穿透Neo reGeorg的使用 网络 拓扑图使用环境 目标机不出网 可以在边界服务器上设置代理 这里kali就可以通过代理访问目标机的整个内网网段 reGeorg简介 reGeorg是一个内网穿透工具 基于socks5 而且支持众多脚
  • 服务器物理内存90%怎么办,服务器物理内存使用率90以上

    服务器物理内存使用率90以上 内容精选 换一换 数据库安全审计的审计日志存放在日志数据库中 日志的处理机制说明如下 当日志数据库的磁盘空间使用率达到85 及以上时 系统将自动循环删除存放时间最久的审计日志 每次删除一天的审计日志 直至磁盘空
  • SpringBoot与Shiro整合

    一 Shiro 体系结构 Apache Shiro是一个强大且易用的Java安全框架 执行身份验证 授权 密码和会话管理 使用Shiro的易于理解的API 您可以快速 轻松地获得任何应用程序 从最小的移动应用程序到最大的网络和企业应用程序
  • 网页登录出错DNS_PROBE_FINISHED_BAD_CONFIG,QQ登录正常。解决方法!

    某天上着QQ网课 结果突然被卡出来了 心里mmp 重新登录 想浏览一下网站 结果 DNS PROBE FINISHED BAD CONFIG 报错了 可qq可以正常登录啊 dns解析错误吧应该 然后百度一顿乱搜 终于 弄好了 1 输入ipc
  • https://aka.ms/ 无法访问的问题

    今天在下载WSL发行版的 需要访问https aka ms 点开连接出现了这样的问题 出现这个问题让人很懵逼 从上面的错误代码上来看应该是证书的问题 上面出现VMware就很离谱 可能是电脑上的VMware修改了什么东西 试着看看又没有什么
  • mysql 一行数据拆分多行

    查找出被逗号分隔字段需要拆分的最大数量 select max LENGTH 逗号分隔的字段 LENGTH REPLACE 逗号分隔的字段 1 from 处理表 where 条件 创建一张临时表用于联合查询 方便把处理表单行记录分隔为多行 C
  • 使用SQLiteOpenHelper的onUpgrade实现数据库版本升级

    Andoird的SQLiteOpenHelper类中有一个onUpgrade方法 帮助文档中只是说当数据库升级时该方法被触发 经过实践 解决了我一连串的疑问 1 帮助文档里说的 数据库升级 是指什么 你开发了一个程序 当前是1 0版本 该程
  • uniapp开发H5及app监听返回事件(以及监听不到的处理方法)

    1 使用页面事件onBackPress事件监听返回键 onBackPress e e from backbutton 说明如果点击的是物理返回键或导航栏的返回键就进行以下操作 if e from backbutton if 遮罩层是否隐藏
  • 刷脸支付提高技术服务水平以及用户黏性

    刷脸支付无需手机 等物理介质 通过刷脸 支付口令即可完成交易 增强服务获得感和便捷度 是该产品的显著特点 综合运用支付标记化 多方安全计算 活体检测 风控模型等构建风险防控体系 避免支付敏感信息直接参与交易流程 保障用户信息和资金安全 是该
  • 美国服务器有哪些类型?

    美国服务器有哪些类型 常见的服务器可分为虚拟主机 云服务器 物理服务器以及高防服务器 在海外服务器之中 使 用较多的属于美国服务器 下面我们就一起看看美国服务器有哪些及常见的美国服务器 美国服务器有哪些 与服务器一样 常见的美国服务器请到T
  • 解决TortoiseSVN提交代码被拒绝

    TortoiseSVN提交代码被拒绝 随便选个目录右键进入TortoiseSVN gt settings 选择左边的saved data gt clear 掉之前的用户名和密码 cmd命令行界面执行 svn ls svn路径 你要导入项目的
  • 使用shell脚本执行oracle sql语句示例

    脚本内容如下 bin bash sqlplus emuser emuser ctmdb lt lt EOF update GENERALAUTHORIZATIONS set isaccountlocked 0 where username
  • mybatis 大于小于号 <和>

    Mybatis中的sql语句中的 lt 和 gt 号要用转义字符 lt 和 gt 否则会报错 SELECT count id FROM housing record where adiut state lt 3 and admin id i
  • python中安装pyinstaller库的方法

    最近 在学习python过程中运用到了一个python的第三方库pyinstaller 是一个可以把程序打包为一个可执行文件 用户可以直接运行 一 pyinstaller库的安装 1 pip包安装 因为在配置python环境中自带了一个下载
  • Vuepress 文档脚手架(vue 3.x+vuepress2.x+vite+ts)

    在项目扩展到一定程度 我们会对项目中大量的公共业务做封装 当多人开发时就带来一个问题 如何让所有人快速使用封装好的组件 降低学习成本 这里提供一个解决方案 那就是Vuepress框架 最新的 Vuepress2 x 框架已经蓄势待发 支持V