前言
两年前,我弃用了原来的hexo博客系统,并用vuepress1.4.1版本快速搭建了自己现在的专属静态博客系统。并一直更新维护至今。博客内陆陆续续的定制了自己的个性首页和列表页,扩展了评论、footer、复制、图片预览等等博客常见功能,效果和UI实现还是让我比较满意的。但是自从vuepress升级到2.X后,就一直心动的想要将现有博客进行升级,奈何平时比较忙(懒癌晚期),所以一直没有付诸行动,最近闲下来,所有打算动起来。
这次虽然是重新从零搭建,但其实很多逻辑和1.0是相通的,所以我的博客1.0还是可以用来参考的,如果你也是vuepress1.X版本,也可以参考官方的迁移文档
VuePress2的亮点
- 简介至上
- 支持vue3.0,就是好用。
- 支持typescript,学习、开发必备技能。
- vite打包,就是快。
多语言支持
VuePress和其它博客系统的对比可以参看官方给出的介绍
项目搭建
项目创建&初始化
# 创建并进入博客文件
mkdir vuepress-blog
cd vuepress-blog
# 初始化git
yarn init
# 安装vuepress本地依赖
yarn add -D [email protected]
# 添加ignore内容
echo 'node_modules' >> .gitignore
echo '.temp' >> .gitignore
echo '.cache' >> .gitignore
# 添加第一个md文档
mkdir docs
echo '# Hello VuePress' > docs/index.md
在 package.json
中添加一些scripts
{
"scripts": {
"docs:dev": "vuepress dev docs",
"docs:build": "vuepress build docs"
}
}
命令行内运行下面代码,就可以顺利的启动一个热重载的博客项目了
yarn docs:dev
搭建首页
vuepress允许我们依赖Frontmatter->layout
来自定义页面布局;下面说一下首页
docs/.vuepress/Layouts
文件内新建Home.vue
文件,因为自定义的页面说白了也是一个组件,所以我们可以按照平时写vue3组件的方式去写首页内容首页
在
docs/.vuepress/client.ts
文件中注册Home组件import { defineClientConfig } from '@vuepress/client' import Home from './Layouts/Home.vue' export default defineClientConfig({ layouts: { Home, } })
在一开始创建的
docs/index.md
文件内,讲自定义布局组件进行引入--- title: 首页 layout: Home ---
到这我们的首页就生成好了,还是比较简单的对吧,别急,下面的列表页才是最复杂的地方
列表页面
列表页最关键的就是要如何才能拿到所有文章的数据内容,这里我们依赖官方的插件API来实现
因为我们需要创建很多md文件,但是并不一定所有的文件都需要显示在列表页,所以我们首先要约定下什么格式的文件才是我们需要的博客文档:我们可以设置黑名单来进行排除,当然我这里用的正则匹配的方式,即https://slbyml.github.io/**/**
是我们需要的博客文件,否则就是其他文件,不进行统计,比如:https://slbyml.github.io/
、https://slbyml.github.io/*.html
第一步:创建插件文件.vuepress/plugins/page.js
:
export default {
name: 'vuepress-plugin-page',
onInitialized(app) {
const lists = []
app.pages.forEach((item:Page) => {
// 排除不需要的页面
if (/^\/[\s\S]*\/[\s\S]*/.test(item.path)) {
// 没有直接将整个item放进lists是为了减少传递大量没用的数据
lists.push({
path: item.data.path,
title: item.data.title,
frontmatter: item.data.frontmatter,
git: item.data.git
})
}
// 将我们组装好的列表传递到list页面
if (item.path === '/list.html') {
item.data = {
...item.data,
lists
}
}
});
// 这里还需要进行下简单的排序
lists.sort((s1, s2) => {
return +new Date(s2.git.lastUpdated) - +new Date(s1.git.lastUpdated)
})
}
}
当然,向列表页传递数据也可以参考官方给的方案:向客户端代码传递数据
第二步:创建自定义列表布局.vuepress/Layouts/List.vue
{{item.title}}
{{item.frontmatter.description}}
第三步:注册列表布局.vuepress/client.ts
import { defineClientConfig } from '@vuepress/client'
import Home from './Layouts/Home.vue'
import List from './Layouts/List.vue'
export default defineClientConfig({
layouts: {
Home,
List
}
})
第四步:创建列表文件docs/list.md
,将我们的自定义布局引入进去
---
title: 文章列表
layout: List
---
至此我们最重要的首页和列表页就完成了
文章标签收集
先来看看我文章内frontmatter
最重要的两个
---
tags:
- vuepress
- 前端
description: 文章的描述信息,
---
description
:文章自定义的描述信息,在列表页内item.frontmatter.description
方法可以拿到tags
就是我们文章的自定义标签,通过frontmatter.tags
就可以获得了,我是在列表页用到的const allTags = allList.value.reduce((previous, current) => { return previous.concat(current.frontmatter.tags) }, [])
分页
我们既然可以拿到所有的文章列表的数组,那么我们就可以通过allList
来自定义我们的分页逻辑了,还是比较简单的,对吧!
文章页用扩展的默认布局
具体文章页如果只需要官方默认的布局那可以不看这部分内容,我做的事情主要是继承了官方默认布局,并扩展了阅读进度、评论、打赏、footer等功能;
创建 .vuepress/layouts/Layout.vue
打赏
评论