核心库 @soul-blog/wc 使用 Shadow DOM 封装,不依赖前端框架,原生 JS、Vue 3、React 18 与 Hexo 共用同一套 UI
soul-blog-theme — Vue 博客模板
作者 callmesoul
基于 Web Components 的跨框架博客主题 Monorepo,一套 UI 同时适配原生 JS、Vue 3、React 18 与 Hexo,核心组件库使用 Shadow DOM 封装。
看看你的网站会是什么样
浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。
目前有 1 张原始预览,可打开完整图片查看设计细节。
截图用于了解视觉与布局,交互效果请以实际项目为准。
值得关注的模板亮点
从已有项目资料中,快速了解它的特点。
提供 11 个 Web Components,覆盖背景、侧栏、文章列表、归档、关于我、友链、阅读器、搜索、音乐播放器与登录面板
文章阅读器支持 FLIP 翻转动画、面包屑、Giscus 评论与相关推荐,移动端切换为单栏滚动
全文模糊搜索支持标题、目录与正文关键词,可用 Ctrl/Cmd + Shift + F 唤起弹出层,也有独立 /search 结果页
站点品牌、主题色、关于我、友链与 Giscus 评论通过 site-config.json 配置,支持运行时热覆盖
Hexo 以独立运行包发布,包含模板、脚本、JS/CSS、默认图片和音乐,个人配置与资源放在站点独立目录
模板详细介绍
soul-blog-theme 是一个以 Web Components 为核心的博客主题 Monorepo。核心库 @soul-blog/wc 使用 Shadow DOM 封装、不依赖前端框架,各端通过 thin wrapper 集成,因此原生 JS、Vue 3、React 18 与 Hexo 可以共用同一套 UI 组件。仓库按 pnpm workspace 组织,包含 packages/core 与 themes/vanilla、themes/vue、themes/react、themes/hexo 四个主题目录,另有 assets/site-config.json 作为品牌信息、社交栏、主题色、关于我、友链与 Giscus 评论的配置入口,支持运行时热覆盖。
功能层面,主题提供首页文章卡片网格、分类与标签筛选、归档时间线、关于我、友链画廊、独立搜索结果页、登录页与文章阅读器;阅读器支持 FLIP 翻转动画、面包屑、Giscus 评论与相关推荐,底部音乐播放器支持播放列表、音量记忆与跨页状态保持。搜索支持标题、目录与正文的模糊匹配,并可用 Ctrl/Cmd + Shift + F 唤起弹出层。数据接入通过 TypeScript 类型契约约束,Article 与 Category 字段结构一致即可替换数据源。
使用限制方面,项目要求 Node.js >= 20、pnpm >= 9,开发时需先构建核心组件库再启动各端主题;Hexo 主题以独立运行包形式发布,个人配置与资源放在站点独立目录,便于整体替换更新。Giscus 评论默认开启,未填写完整必要字段时评论区会展示配置引导而不加载 iframe。代码采用 MIT 许可,但演示图片、字体、图标等第三方素材需按各自许可核对。
适合你的项目吗?
适用场景
- 希望用同一套博客 UI 同时维护原生 JS、Vue 3、React 18 与 Hexo 多个站点
- 为已有 Hexo 博客替换主题,并使用归档时间线、标签筛选、友链画廊与 Giscus 评论
- 在 Vue 3 或 React 18 项目中集成基于 Web Components 的博客组件,而不引入额外 UI 框架
- 需要带音乐播放器、动态背景与 FLIP 文章过渡动画的个人博客
- 通过 site-config.json 在部署后调整品牌信息、主题色、关于我与友链内容,无需重新打包
适合人群
- 使用 Node.js >= 20 与 pnpm >= 9 的前端开发者
- 需要跨框架复用博客 UI 的多端项目维护者
- 使用 Hexo 并希望以独立运行包方式安装主题的博客作者
- 接受 Web Components 与 Shadow DOM 技术方案的 Vue 3 或 React 18 项目
上手与定制指南
结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。
- 1
环境要求 Node.js >= 20、pnpm >= 9,安装依赖使用 pnpm install
- 2
先构建核心组件库 pnpm --filter @soul-blog/wc build,再构建或启动各端主题
- 3
本地开发可运行 pnpm dev:all 并行启动 Vanilla、Vue、React 预览服务与 Hexo 内置预览站点
- 4
Hexo 开发使用 fixtures/hexo 内置配置与示例文章,修改核心组件后需先重新构建 Core
- 5
Giscus 评论需先在目标 GitHub 仓库开启 Discussions 并安装 Giscus App,再填写 repoId 与 categoryId
授权与来源资料
使用条件与限制
免费使用 · 保留许可声明本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。
使用时需要遵守
- 允许免费使用、修改、商用和分发该版本代码。
- 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
- 代码按现状提供;担保与责任限制以原许可证及适用法律为准。
额外费用与待核对事项
- 评论功能依赖外部服务 Giscus:需在目标 GitHub 仓库开启 Discussions、安装 Giscus App,并填写 repoId 与 categoryId;字段不完整时评论区仅显示配置引导,不加载 iframe。
- 运行环境要求 Node.js 20 及以上、pnpm 9 及以上,低于该版本无法按文档安装与构建。
- Hexo 使用需从 GitHub Release 下载运行包,Git tag 源码不含运行产物、不能替代运行包;旧版 v1.8.0 无运行包,需走源码构建兼容路径。
- Hexo 站点需将个人配置与资源分别放在 theme/config.yml 及 theme/assets/images、theme/assets/audio 目录,主题目录按可整体删除重建方式管理。
- 主题更新依赖 npm run theme:update 安装并锁定版本与 SHA256,下载或配置解析失败时保留旧主题。
- 修改核心组件后必须先重新构建 Core,再启动 Hexo 开发任务,否则改动不生效。
- Hexo 部署存在根路径部署限制,且需安装必需的 EJS 渲染器并采用站点独立配置,具体见主题安装指南。
- 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
- 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
查看原文依据
Permission is hereby granted, free of charge
许可证原文
Giscus 默认开启。必要字段未填写完整时,文章评论区会直接展示配置引导,不会加载无效 iframe。请先在目标 GitHub 仓库开启 Discussions、安装 [Giscus App](https://github.com/apps/giscus),再通过 [Giscus 配置页](https://giscus.app/zh-CN) 获取 `repoId` 与 `categoryId`。
README 原文
- Node.js >= 20 - pnpm >= 9
README 原文
从 v1.9.0 开始,优先使用 GitHub Release 的 `soul-blog-hexo-vX.Y.Z.tar.gz`,它包含 EJS 模板、CommonJS 主题脚本、默认配置、JS/CSS 和完整默认图片/音频;无需在使用站点安装 pnpm 或构建 monorepo。Git tag 源码不包含运行产物,不能用源码压缩包代替运行包。
README 原文
使用站点应把 `themes/hexo/` 当作可整体删除并重建的目录:个人配置维护在 `theme/config.yml`,个人资源维护在 `theme/assets/images/`、`theme/assets/audio/`。
README 原文
`callmesoul.github.io` 站点已采用此流程:`npm run theme:update -- vX.Y.Z` 安装并锁定版本及 SHA256,`npm run dev` / `npm run build` 自动同步;下载或配置解析失败保留旧主题。
README 原文
修改核心组件后先重新构建 Core,再启动 Hexo 开发任务
README 原文
https://github.com/callmesoul/soul-blog-theme/blob/main/LICENSEhttps://github.com/callmesoul/soul-blog-theme/blob/main/README.md普通 Hexo 用户可直接按 [Hexo 安装与配置指南](themes/hexo/README.md) 下载、校验并安装运行包;其中说明了必需的 EJS 渲染器、站点独立配置、更新流程以及根路径部署限制。
README 原文
DeepSeek 根据仓库许可证和 README 整理 ·2026-10-01。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。
项目核对记录与介绍依据
模板资料
- 来源平台
- GitHub
- 资料与维护参考分
- 资料较完整 · 76 / 100
- 技术栈
- Vue · Hexo · React
- 网站类型
- 博客
这个分数如何计算
本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。
这个项目需要核对什么
- 记录的仓库更新时间
- 2026-09-16
- 截图检查日期
- 2026-10-01
目前没有记录演示链接。请依据仓库说明在本地评估;仅凭截图无法确认交互行为。
目录记录的主要技术栈是 Vue。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。
查看具体选型方法 →介绍的制作与核对状态
介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。
已完成服务器许可规则与 AI 来源核对;未经过人工编辑审核。
查看当时使用的来源资料
SHA-256: 68c0ab0023377184462ded078d25f52c1fef27a799d6471f397b8cd24401f492
2026-10-01T03:08:45.108Z
来源文件 / 仓库# soul-blog-theme
基于 **Web Components** 的跨框架博客主题,一套 UI 同时适配原生 JS、Vue、React、Hexo。
**在线预览:[https://callmesoul.github.io/](https://callmesoul.github.io/)**
核心组件库 `@soul-blog/wc` 使用 Shadow DOM 封装,不依赖任何前端框架,各端通过 thin wrapper 按需集成。
## ✨ 特性
- 🎨 **跨框架一致体验** — 一套核心组件同时支持 Vanilla/Vue/React/Hexo
- 🔍 **全文模糊搜索** — 支持标题、目录、正文关键词模糊搜索,支持键盘导航;既可热键唤起弹出层,也可访问独立 `/search` 结果页
- 🎬 **FLIP 翻转动画** — 从文章卡片到详情页无缝过渡动画
- 🎵 **底部音乐播放器** — 支持播放列表、音量记忆、跨页状态保持、循环 / 单曲 / 随机三种播放模式
- 🌌 **动态背景** — 粒子 / 星尘动效,视觉层次感丰富
- 🗂 **归档时间线** — 按 年 → 月 → 文章 三级倒序归档,年份快捷导航、月份可折叠、滚动触底自动续载(IntersectionObserver)
- 👤 **关于我页面** — 杂志式卡片布局的自我介绍页(Manifesto 卡片、Currently 状态、联系方式),内容由 `site-config.json` 的 `about` 字段驱动,改配置即改页面
- 🤝 **动态友链画廊** — 人物画廊式非对称卡片,支持字符标识或头像;Vanilla、Vue、React 与 Hexo 共用核心组件,内容由站点配置驱动
- 📦 **Hexo 独立运行包** — 发布包包含模板、脚本、JS/CSS、默认图片和音乐;个人配置与资源放在站点独立目录,主题可整体替换更新
- 💬 **Giscus 文章评论** — 基于 GitHub Discussions,按稳定文章键隔离评论;支持 Vanilla、Vue、React 与 Hexo,切换阅读器文章时自动切换 Discussion
- 📖 **沉浸式文章阅读** — 桌面端控制舒适行宽并强化标题、列表、引用、代码块与图片层级;移动端切换为完整单栏滚动,推荐内容自然衔接在正文之后
- 🧭 **面包屑导航** — 文章阅读器、归档页统一展示「首页 > 目录 > 文章」路径
- 🏷 **标签筛选** — 侧栏标签云、文章卡片 tag chip、阅读器内 tag 一键回列表过滤
- 📈 **访问统计** — 四套主题统一接入 Vercount 站点 PV / UV 与单篇文章阅读量,首页文章列表同步展示动态计数
- 📱 **响应式布局** — 适配桌面、平板、移动设备
- 🔐 **登录页** — 带密码验证、记住用户名、自动登录的私有文章入口
- ⚡ **性能优化** — 组件懒加载、图片懒加载、搜索防抖、归档/年份侧栏 IntersectionObserver 续载
## 📸 截图预览
| 首页 | 文章阅读器 |
| :-------------------------------------: | :--------------------------------------: |
|  |  |
| **登录页** | **搜索页** |
|  |  |
| **归档页** | **关于我** |
|  |  |
| **友链** | |
|  | |
## 🗂️ 项目架构
```
soul-blog-theme/
├── packages/
│ └── core/ # @soul-blog/wc — 框架无关的组件库(唯一 UI 真源)
│ └── src/
│ ├── components/ # 11 个 Web Components(Shadow DOM + 自包含样式)
│ ├── helpers/ # 工具函数(wc-base、store、search、escape-html、format-time)
│ ├── styles/ # Tailwind v4 主题变量与设计令牌
│ └── types/ # TypeScript 类型契约(Article / Category / FriendLink 等)
│
├── themes/
│ ├── vanilla/ # 原生 JS 主题(Vite 多页应用)
│ ├── vue/ # Vue 3 主题(Pinia + Vue Router)
│ ├── react/ # React 18 主题(Zustand + React Router)
│ └── hexo/ # Hexo 博客主题(EJS 模板 + Vite 构建)
│
├── assets/
│ ├── site-config.json # 品牌信息 / 社交栏 / 主题色(运行时可热覆盖)
│ ├── screenshots/ # README 引用截图
│ ├── images/ # 站点图片资源
│ └── audio/ # 音乐播放器默认曲目
│
├── fixtures/
│ └── hexo/ # 仓库内置 Hexo 预览配置与示例文章
│
├── design/ # 原始设计稿(PSD / PNG)
│
├── pnpm-workspace.yaml
└── package.json
```
## 组件清单
`@soul-blog/wc` 提供以下 Web Components:
| 组件 | 标签 | 功能 |
| -------------- | ------------------- | ------------------------------------------- |
| SiteBackground | `<site-background>` | 背景粒子 / 星尘动效 |
| SiteSidebar | `<site-sidebar>` | 双轨侧栏:首页 / 目录 / 归档 / 友链 / 关于 + 分类、社交、标签云 |
| ArticleList | `<article-list>` | 文章卡片网格(分类筛选、标签筛选、入场动画、滚动续载) |
| ArchiveList | `<archive-list>` | 归档时间线(年 → 月 → 文章、年份快捷导航、月份折叠、滚动续载) |
| AboutPage | `<about-page>` | 关于我页面(杂志式卡片布局,内容由 site-config 的 `about` 驱动) |
| FriendsPage | `<friends-page>` | 友链人物画廊(动态标题、链接、标识、颜色及可选头像) |
| ArticleViewer | `<article-viewer>` | 响应式文章阅读器(FLIP 动画、富文本排版、Giscus 评论、相关推荐、tag 点击路由) |
| SearchPanel | `<search-panel>` | 搜索弹出层(模糊搜索、键盘导航;Ctrl/Cmd + Shift + F 唤起) |
| SearchResults | `<search-results>` | 搜索结果列表(独立 `/search` 路由,复用 ArticleList 渲染逻辑) |
| MusicPlayer | `<music-player>` | 音乐播放器(进度、音量、播放列表、跨页保持状态、3 种播放模式) |
| LoginPanel | `<login-panel>` | 登录面板(密码显隐、错误提示、记住用户名、自动登录) |
## 技术栈
### 核心层
| 依赖 | 用途 |
| ------------------------------------------- | ------------- |
| [Vite 8](https://vite.dev/) | 构建工具 |
| [Tailwind CSS v4](https://tailwindcss.com/) | 样式实现 |
| Web Components (Shadow DOM) | 组件封装,框架无关 |
| TypeScript | 类型安全 |
### 各端框架
| 主题 | 状态管理 | 路由 | 额外依赖 |
| -------- | ------- | -------------- | -------------------------- |
| Vanilla | 模块级变量 | Hash 路由 | — |
| Vue 3 | Pinia | Vue Router 4 | `@vitejs/plugin-vue` |
| React 18 | Zustand | React Router 6 | `@vitejs/plugin-react` |
| Hexo | — | Hexo 7 路由 | EJS 模板 |
## 快速开始
### 环境要求
- Node.js >= 20
- pnpm >= 9
### 安装依赖
```bash
pnpm install
```
### 构建核心组件库
```bash
pnpm --filter @soul-blog/wc build
```
### 构建各端主题
```bash
# 原生 JS 主题
pnpm build:vanilla
# Vue 3 主题
pnpm build:vue
# React 18 主题
pnpm build:react
# Hexo 主题
pnpm build:hexo
```
### 本地开发
同时启动全部主题的开发任务:
```bash
pnpm dev:all
```
该命令会并行启动 Vanilla、Vue、React 的预览服务、Hexo 主题资源监听构建,以及使用 `fixtures/hexo` 内置开发站点的 `hexo server`。无需提前创建或同步 `/tmp/hexo-test`;需要生成静态产物时,输出目录已指向该路径。
各主题默认端口:
| 主题 | 端口 | 命令 |
| -------- | ---- | ------------------ |
| Vanilla | 5173 | `pnpm dev:vanilla` |
| Vue 3 | 5174 | `pnpm dev:vue` |
| React 18 | 5175 | `pnpm dev:react` |
| Hexo | 4000 | `pnpm dev:hexo` |
```bash
# 构建核心库(watch 模式)
pnpm dev:core
# 原生 JS 主题
pnpm dev:vanilla
# Vue 3 主题
pnpm dev:vue
# React 18 主题
pnpm dev:react
# Hexo 主题资源(watch 模式)+ 内置预览站点
pnpm dev:hexo
```
> 端口被占用时 Vite 会自动顺延(+1),以启动时实际输出的地址为准。
## 路由 & 页面
各端均提供一致的页面结构(具体路由名以各端实现为准):
| 页面 | 用途 | 关键组件 |
| ------------ | ------------------------ | ------------------------------------- |
| `/` | 首页:分类 / 标签筛选 + 文章卡片网格 | `site-sidebar`、`article-list` |
| `/articles/:id` | 文章阅读器(FLIP 翻转打开) | `article-viewer`、面包屑 |
| `/search` | 独立搜索结果页 | `search-results` |
| `/archives` | 归档时间线(年 → 月 → 文章) | `archive-list` |
| `/about` | 关于我(杂志式卡片自我介绍页) | `about-page` |
| `/friends` | 友链(人物画廊式卡片列表) | `friends-page`、`site-sidebar` |
| `/login` | 登录页 | `login-panel` |
> Vanilla 版友链入口为 `friends.html`,Vue 版为 `#/friends`,React 与 Hexo 版为 `/friends`。Hexo 归档对应 `/archives/`(默认 `archive_dir`),正文页在归档 / 首页里通过 FLIP 翻转在原地弹出阅读器,无独立文章页 URL,便于静态托管 SEO。
## 站点配置
品牌信息(logo、主色、社交栏、备案文案)通过 `site-config.json` 配置,运行时生效优先级由高到低:
1. `public/site-config.json` — 部署后直接编辑,无需重新打包
2. `window.__SITE_CONFIG__` — 运行时注入(控制台 / 后台直出)
3. 内置默认值(兜底)
配置字段说明(深合并,数组整体替换、对象逐层覆盖):
```json
{
"site": {
"name": "CallMeSoul",
"icp": "@CallMeSoul 粤ICP备15053557"
},
"logo": {
"home": { "src": "/images/logo-home.png", "width": 60, "height": 55, "alt": "CallMeSoul" },
"login": { "src": "/images/logo-login.png", "width": 201, "height": 35, "alt": "CallMeSoul" },
"loginIcon": { "src": "/images/logo-icon.png", "width": 88, "height": 81, "alt": "" }
},
"theme": {
"primary": "#EB4F38",
"cta": "#EE5B44"
},
"about": {
"kicker": "About · Personal Manifesto",
"title": "代码是工具,",
"titleAccent": "表达才是目的。",
"description": "一句话简介(标题下方段落)",
"cards": [
{ "eyebrow": "01 · About", "title": "卡片大标题,\\n 支持换行", "variant": "wide" },
{ "eyebrow": "Currently", "title": "Build.\\nWrite.\\nRepeat.", "variant": "accent" },
{ "eyebrow": "02 · Believe", "text": "纯文本卡片" },
{ "eyebrow": "04 · Contact", "text": "有好想法?\\[email protected]", "href": "mailto:[email protected]" }
]
},
"friends": {
"kicker": "Friends · Curated People",
"title": "一些值得",
"titleAccent": "反复拜访的人。",
"description": "友链页标题下方的介绍",
"links": [
{
"name": "朋友的站点",
"url": "https://example.com",
"domain": "example.com",
"note": "一句话介绍",
"mark": "E",
"color": "#6D8580",
"avatar": "/images/friends/example.png"
}
]
},
"giscus": {
"enabled": true,
"repo": "owner/repo",
"repoId": "R_...",
"category": "Announcements",
"categoryId": "DIC_...",
"termPrefix": "article:",
"strict": true,
"reactionsEnabled": true,
"inputPosition": "top",
"theme": "dark_dimmed",
"lang": "zh-CN",
"loading": "lazy"
},
"social": [
{ "name": "微信", "icon": "/images/weixin.png", "href": "", "qr": "/images/qr-weixin.svg", "hue": 74, "width": 22, "height": 18 }
],
"archiveUrl": "/archives/",
"homeUrl": "/"
}
```
Giscus 默认开启。必要字段未填写完整时,文章评论区会直接展示配置引导,不会加载无效 iframe。请先在目标 GitHub 仓库开启 Discussions、安装 [Giscus App](https://github.com/apps/giscus),再通过 [Giscus 配置页](https://giscus.app/zh-CN) 获取 `repoId` 与 `categoryId`。主题固定使用 `specific` 映射,并以 `termPrefix + article.commentKey`(缺省回退 `article.id`)作为 Discussion 键,避免 Hash/Query SPA 中多篇文章共用同一个 pathname 而串评论。Hexo 对应字段使用 snake_case(如 `repo_id`、`category_id`);如需恢复内置演示评论区,可设置 `enabled: false`。
> **社交栏交互规则**:`href` 为有效外链 → 新窗口跳转;`href` 为空但有 `qr` → hover 弹二维码;两者皆无 → 纯展示图标。
> **关于我页**:`about.cards` 每项为一张卡片,`variant: "wide" | "accent"` 控制大卡/强调色卡,缺省为普通卡;`href` 存在时整卡可点击。
> **友链页**:`friends.links` 按数组顺序渲染并整体替换默认列表;`url` 为实际跳转地址,`domain` 仅控制展示文案,`avatar` 可选,缺省时依次使用 `mark` 和站名首字符。Hexo 在主题 `_config.yml` 中配置同名 `friends` 节点,并使用 `title_accent` 等 snake_case 字段,另支持 `enabled: false` 关闭 `/friends/` 页面生成、`path` 自定义路由(默认 `friends`,对应 `page_title` 为页面标题)。
## 数据接入
各端数据源通过 `TypeScript` 类型契约约束,字段结构一致即可无缝替换:
### 文章 (`Article`)
```typescript
interface Article {
id: string
statsKey?: string // 访问统计稳定键(缺省回退 id)
commentKey?: string // 评论系统稳定键(缺省回退 id)
cat: string // 所属分类 id
title: string
cover: string
summary: string
date: string // 'YYYY/MM/DD'
views: number
commentCount: number
tags?: string[] // 标签列表(用于筛选 / 卡片 chip)
paragraphs: string[]
comments?: ArticleComment[]
}
```
### 分类 (`Category`)
```typescript
interface Category {
id: string
name: string // 展示名(中文)
en: string // 英文名 / 副标
icon: string // 目录图标 URL
w: number // 图标宽度(px)
h: number // 图标高度(px)
count?: number // 该分类下文章数(可选,用于卡片摘要)
}
```
## 键盘快捷键
| 快捷键 | 功能 |
| ---------------------- | ---------------------------------------- |
| `Ctrl/Cmd + Shift + F` | 打开搜索弹出层(`search-panel`) |
| `↑ / ↓` | 在搜索面板 / 阅读器中切换 |
| `Enter` | 打开当前结果 / 确认操作 |
| `Esc` | 关闭搜索 / 返回列表 / 关闭阅读器 |
## 开发指南
### TypeScript 类型检查
```bash
# 核心库
pnpm --filter @soul-blog/wc typecheck
# Vue 主题
pnpm --filter @soul-blog/vue typecheck
# React 主题(内嵌在 build 流程中)
pnpm --filter @soul-blog/react build
```
### Hexo 主题集成开发工作流
仓库内置 `fixtures/hexo` 预览配置与示例文章,并直接加载当前的 `themes/hexo`,因此不需要再复制主题目录。修改核心组件后先重新构建 Core,再启动 Hexo 开发任务:
```bash
cd /path/to/soul-blog-theme
pnpm build:core
pnpm dev:hexo
```
`pnpm dev:hexo` 会同时监听构建主题资源并启动 `http://localhost:4000/`。也可以用 `pnpm dev:all` 连同另外三套主题一起启动。
### 生产部署 Hexo
普通 Hexo 用户可直接按 [Hexo 安装与配置指南](themes/hexo/README.md) 下载、校验并安装运行包;其中说明了必需的 EJS 渲染器、站点独立配置、更新流程以及根路径部署限制。
从 v1.9.0 开始,优先使用 GitHub Release 的 `soul-blog-hexo-vX.Y.Z.tar.gz`,它包含 EJS 模板、CommonJS 主题脚本、默认配置、JS/CSS 和完整默认图片/音频;无需在使用站点安装 pnpm 或构建 monorepo。Git tag 源码不包含运行产物,不能用源码压缩包代替运行包。
主题维护者本地打包:
```bash
pnpm install --frozen-lockfile
pnpm package:hexo
```
输出在 `dist/hexo/`:版本压缩包、`hexo-release.json`(含版本、提交、包 SHA256)及 `SHA256SUMS`。解压后得到 `hexo/` 主题目录,放在站点 `themes/hexo/`,并在站点 `_config.yml` 设置 `theme: hexo`,再运行 `hexo generate`。发布包里的 `theme.json` 可追溯构建源码;本地未提交的包标记为 `dirty`,仅供预览。
使用站点应把 `themes/hexo/` 当作可整体删除并重建的目录:个人配置维护在 `theme/config.yml`,个人资源维护在 `theme/assets/images/`、`theme/assets/audio/`。安装器先校验发布包并准备完整目录,再将默认配置与个人配置合并(对象逐层覆盖、数组整体替换,`[]` 清空),最后覆盖个人资源并替换主题。未修改的默认资源不要复制进个人覆盖目录,未填写的配置继承新版本默认值。
`callmesoul.github.io` 站点已采用此流程:`npm run theme:update -- vX.Y.Z` 安装并锁定版本及 SHA256,`npm run dev` / `npm run build` 自动同步;下载或配置解析失败保留旧主题。旧版 v1.8.0 无运行包,保留源码构建兼容路径,安装新版发布包后切换到直接下载。
正式发布前按 AGENTS.md 完成统一版本、CHANGELOG、README 后提交,并推送对应 `vX.Y.Z` tag。`.github/workflows/release-hexo.yml` 会重新构建、验证 tag/版本/最新 CHANGELOG 和干净工作区,再创建或使用 GitHub Release 上传三个产物;不会覆盖已有同名资源。
### 添加新组件
1. 在 `packages/core/src/components/` 中创建 Web Component(继承 `WcBase`)
2. 在 `packages/core/src/components/index.ts` 中注册
3. 在各端主题中创建对应的 thin wrapper 组件
4. 重新构建 core 和各端主题
## 🎨 主题定制
设计令牌定义在 `packages/core/src/styles/theme.css`(与 `themes/vanilla/src/css/style.css` 同源,跨端复用):
```css
:root {
/* 品牌色(可在 site-config.theme 中按页面动态覆盖) */
--brand-primary: #EB4F38; /* 主题主色 */
--brand-cta: #EE5B44; /* 按钮强调色 */
/* 中性面板色 */
--color-base: #080808; /* 页面底色 */
--color-card: #0f0e0d; /* 侧栏 / 卡片 / 播放列表面板 */
--color-panel: #141210; /* 音量面板 */
/* 文字色阶 */
--color-ink: #ffffff; /* 一级 */
--color-body: #f2f2f2; /* 二级正文 */
--color-mute: #9e9d99; /* 三级元信息 */
--color-dim: #6b6b6b; /* 四级时间等 */
/* 分隔线 / 边框 */
--color-line: #2a2a2a; /* 常规边框 */
--color-sep: #333333; /* 列表分隔 / 社交栏顶线 */
}
```
修改后重新构建即可生效。
## ☕ 打赏
如果这个项目对你有用,可以请我喝杯奶茶 🧋
<div align="center">
<img src="assets/images/payment.png" alt="打赏二维码" width="200">
</div>
## 📝 许可
MIT,详见 [LICENSE](LICENSE)。运行包也包含许可证与 Hexo 安装指南。
看看同类模板
对比同技术栈与用途的模板,找到更适合的视觉与内容结构。

hexo-theme-vexo
🍟 Vexo is a Hexo theme inspired by Vue's official website.
Vue · 博客

vuepress-theme-simple
vuepress-theme-simple 是一个为 VuePress 1.x 设计的博客主题,定位非常明确:把 VuePress 默认的文档站首页改造成文章列表。
Vue · 博客

vuepress-theme-seeker
Seeker 是一款面向 VuePress 的博客主题,主打「五彩斑斓的简约」:每次刷新页面会随机生成一套配色,页脚则随机展示古诗词,这两点构成了它区别于多数静态博客主题的辨识度。
Vue · 博客

vitepress-template
🍀 Vitepress 模板,开箱即用,快速搭建你的静态网站和博客。
Vue · 博客

blog
A generated static site blog template, with Vite, Vue 3, markdown-it, and syntax highlighting.
Vue · 博客

Miracle
A miracle blog theme based on VitePress after deleting accidentally.
Vue · 博客
