Skip to content

inkpaper 主题介绍与快速上手

inkpaper 是一个 VitePress 博客主题。视觉上就一句话:纸白墨黑,朱砂点缀。

做这个主题的想法很简单——个人日志不需要花哨的设计,需要的是安静、可读、有质感。市面上大多数博客主题要么过于工程化,要么视觉上太吵,我想要的是打开页面就像摊开一张宣纸。

安装

bash
npm install @inkpaper/vitepress

主题依赖 VitePress >= 1.0.0 和 Vue >= 3.3.0,这两个是 peerDependencies,你的项目里应该已经有了。

快速开始

最快的方式是用脚手架工具:

bash
npx @inkpaper/create-for-vitepress my-blog
cd my-blog
npm install
npm run dev

这会在 my-blog 目录下生成完整的项目结构:VitePress 配置、主题入口、首页/归档/标签页面、内容加载器、一篇示例文章。直接跑就能看到效果。

docs/posts/ 下写文章,Frontmatter 至少要有 titledatetags 三个字段:

md
---
title: 我的第一篇文章
date: 2026-05-11
tags:
  - 随笔
---

正文内容。

date 决定排序,tags 用于标签页筛选和相关文章推荐。支持子目录分类。

如果你已有 VitePress 项目,往下看手动配置。

手动配置

四个步骤,分别解决不同的问题。

1. 内容加载器

VitePress 本身不知道怎么从 Markdown 文件里提取文章列表——它只负责渲染单篇页面。内容加载器告诉它如何扫描文章目录、从 frontmatter 里提取标题、日期、标签,生成一份结构化的文章数据供主题组件使用。

docs/posts.data.ts

ts
import { createPostsLoader } from '@inkpaper/vitepress/loader'

export default createPostsLoader()

默认扫描 posts/**/*.md,如果文章不在这个路径下,传一个自定义 glob:createPostsLoader('articles/**/*.md')

2. 主题入口

VitePress 的主题入口负责把主题组件和数据绑到一起。inkpaper 的组件(首页、归档、标签等)需要文章数据才能工作,这一步把上面加载器生成的数据注入进去。

docs/.vitepress/theme/index.ts

ts
import theme, { themeEnhance } from '@inkpaper/vitepress'
import type { Theme } from 'vitepress'
import { data as posts } from '../../posts.data'

export default {
  ...theme,
  enhanceApp(ctx) {
    theme.enhanceApp?.(ctx)
    themeEnhance({ posts })(ctx)
  }
} satisfies Theme

如果你有相关文章的 JSON 数据,可以一起传进去:themeEnhance({ posts, related: relatedData })。不传数据也不会报错——主题默认注入空数组,页面能正常渲染,只是没有文章列表。

3. VitePress 配置

站点的基本信息和侧边栏导航在这里定义。titledescription 会显示在首页标题和副标题上,generateSidebar 根据文章目录自动生成侧边导航。

docs/.vitepress/config.mts

ts
import { defineConfig } from 'vitepress'
import path from 'node:path'
// @ts-ignore — .mjs export
import { generateSidebar } from '@inkpaper/vitepress/config'

const postsDir = path.resolve(import.meta.dirname, '..', 'posts')

export default defineConfig({
  title: 'My Blog',
  description: 'A personal journal',
  themeConfig: {
    sidebar: generateSidebar(postsDir),
  }
})

generateSidebar 的默认行为是文章页显示目录树、归档页显示日期树、标签页不显示侧边栏。这些都可以配置,功能详解里会讲。

4. 页面文件

VitePress 是文件路由——有 .md 文件才有对应的 URL。主题提供了首页、归档、标签三个组件,但不能自动注册路由,需要你手动创建对应的 Markdown 文件来挂载它们。

docs/index.md

md
---
layout: doc
title: 首页
---

<script setup>
import { HomeLayout } from '@inkpaper/vitepress'
</script>

<HomeLayout />

docs/archive/index.md

md
---
title: 归档
sidebar: true
---

<script setup>
import { ArchivePage } from '@inkpaper/vitepress'
</script>

<ArchivePage />

docs/tags.md

md
---
title: 标签
sidebar: true
---

<script setup>
import { TagsPage } from '@inkpaper/vitepress'
</script>

<TagsPage />

到这里就能跑了。npm run dev 启动开发服务器,打开浏览器看效果。

源码

GitHub: Moonshile/inkpaper-theme