x-site 跨平台静态博客桌面客户端
x-site
跨平台静态博客桌面客户端 · 类 Gridea · v0.1.4
作者:XFM · https://github.com/xfm0797
基于 Tauri v2 + Vue 3 + TypeScript + Rust 构建。安装包 < 15MB、启动快、内存占用低。
支持 Windows / macOS / Linux 三平台,内置 Markdown 编辑器、静态站点生成、主题管理、本地预览、一键部署、自动更新。
✨ 功能特性
内容管理
- 文章 CRUD — 创建/编辑/删除,草稿与已发布双状态
- Markdown 编辑器 — CodeMirror 6 语法高亮 + markdown-it 实时预览 + highlight.js 代码高亮
- 自动保存 — 编辑停顿 1s 防抖写入 SQLite,状态栏显示「已保存」
- 拖拽图片 — 从系统拖入图片自动复制到资源目录并插入 Markdown 相对路径
- 元数据面板 — 标题、Slug、分类、标签、封面图、发布状态
站点生成
- Tera 模板引擎 — 支持模板继承、变量插值、过滤器
- pulldown-cmark — Markdown → HTML,支持表格/脚注/任务列表/删除线
- syntect 代码高亮 — 内嵌 base16-ocean.dark 主题,无需前端 CSS
- rayon 并发渲染 — 多文章并行生成,进度通过 Tauri 事件实时推送
- 生成的产物:
- 首页(分页,
posts_per_page可配) - 文章页
posts/<slug>.html - 归档页
archive.html(按年份分组) - 标签页
tags/<slug>.html - 分类页
categories/<slug>.html - 友情链接页
links.html sitemap.xml/feed.xml(RSS) /robots.txt
- 首页(分页,
主题系统
- 默认主题 — 内置
default主题,含 7 个 Tera 模板 + CSS - 主题切换 — 一键激活,配置自动持久化
- ZIP 导入 — 选择 zip 包,Rust 端解压到
themes/目录 - 主题结构约定:
1
2
3
4
5
6
7
8
9
10themes/{name}/
├── theme.json # 元数据 (name/author/description/screenshot)
├── post.tera # 文章页
├── index.tera # 首页(分页)
├── archive.tera # 归档页
├── tag.tera # 标签页
├── category.tera # 分类页
├── links.tera # 友链页
├── base.tera # 全站布局骨架(可被继承)
└── assets/ # 静态资源(css/js/img)
部署
- Local Copy — 复制
output/到本地目标路径 - Git Push — 推送到 GitHub Pages / 任意 Git 仓库(自定义分支)
本地预览
- Rust 端
axum静态文件服务,端口自动扫描(40000+) - iframe 内嵌预览 + 一键在系统浏览器打开
- 修改文章 → 重新生成 → 一键刷新
其他
- 菜单管理 — 内置项(首页/归档/友链)开关 + 自定义项 + 拖拽排序
- 标签聚合 — 标签云按文章数渐变字号,点击展开文章列表
- 多语言 — 简体中文 / 繁體中文 / English,随系统语言自动选择
- 自动更新 — tauri-plugin-updater + GitHub Releases 签名分发
🏗️ 技术栈
| 层 | 技术 |
|---|---|
| 前端 | Vue 3 <script setup> + TypeScript + Vite 8 + Pinia + Vue Router |
| 编辑器 | CodeMirror 6(语法高亮、低内存) |
| 预览 | markdown-it + highlight.js |
| 桌面框架 | Tauri v2 |
| 后端 | Rust 1.98 |
| 数据库 | SQLite(rusqlite bundled) |
| 模板引擎 | Tera |
| Markdown 解析 | pulldown-cmark |
| 代码高亮 | syntect(Rust 端预渲染) |
| 并发 | rayon(渲染)+ tokio(HTTP 预览服务) |
| HTTP 服务 | axum + tower-http ServeDir |
| Tauri 插件 | sql / dialog / fs / shell / notification / updater |
📁 项目结构
1 | x-site/ |
🚀 快速开始
环境要求
- Node.js ≥ 20
- Rust ≥ 1.77(推荐 stable 最新版)
- 系统依赖:
- Windows: Visual Studio Build Tools(含 “Desktop development with C++” 工作负载)
- macOS: Xcode Command Line Tools (
xcode-select --install) - Linux:
libwebkit2gtk-4.1-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev patchelf
开发
1 | # 安装依赖 |
构建
1 | # 生产构建(前端 + Rust release) |
产物位置:src-tauri/target/release/bundle/
| 平台 | 产物 |
|---|---|
| Windows | msi/x-site_*_x64_en-US.msi + nsis/x-site_*_x64-setup.exe |
| macOS | dmg/x-site_*_aarch64.dmg |
| Linux | deb/x-site_*_amd64.deb + appimage/x-site_*_amd64.AppImage |
📦 体积优化
目标:安装包 < 15MB。当前实测 x-site.exe 裸二进制 = 12.92 MB。
| 检查项 | 目标 | 实测 |
|---|---|---|
| 裸二进制 | < 13 MB | 12.92 MB ✅ |
| 前端 dist | < 5 MB | ~3.8 MB ✅ |
| CodeMirror chunk (gzip) | < 600 KB | 568 KB ✅ |
| MSI 安装包 | < 15 MB | 待 Release 验证 |
优化措施:
- Rust release profile:
opt-level=3 + lto=true + codegen-units=1 + panic=abort + strip=true - 链接器优化: Windows
/OPT:REF /OPT:ICF /LTCG、macOS-dead_strip - Tauri features 精简:
tauri = { features = [] }(未开 devtools) syntect关闭默认全量语法定义:default-features = false, features = ["default-fancy"]- 前端
manualChunks分块 +esbuildminify + 移除console.log vite-plugin-compression生成.gz+.br
🔄 自动更新
配置签名密钥
1 | cd src-tauri |
按提示:
- 把输出的 公钥 填入
tauri.conf.json→plugins.updater.pubkey - 把 私钥 保存到
signing/private.key(已加入.gitignore,切勿提交) - 在 GitHub 仓库 Settings → Secrets 添加:
TAURI_SIGNING_PRIVATE_KEYTAURI_SIGNING_PRIVATE_KEY_PASSWORD
更新流程
应用启动时检查 https://github.com/xfm0797/x-site/releases/latest/download/latest.json,对比版本号,若发现新版本则提示用户更新。latest.json 由 GitHub Actions 在发布时自动生成并上传。
🤖 CI/CD
.github/workflows/release.yml 实现三平台矩阵构建:
1 | push tag v* → build (Windows/macOS/Linux 并行) |
触发发布
1 | git tag v0.1.0 |
🌐 多语言
支持三种语言,随系统语言自动选择,可在侧边栏底部手动切换:
| Locale | 语言 | 文件 |
|---|---|---|
zh-CN |
简体中文(基准) | src/i18n/locales/zh-CN.ts |
zh-TW |
繁體中文 | src/i18n/locales/zh-TW.ts |
en |
English | src/i18n/locales/en.ts |
新增语言:在 src/i18n/locales/ 添加翻译文件,在 src/i18n/index.ts 的 LOCALES 数组注册即可。
📝 Tauri Commands
前端通过 src/api/tauri.ts 封装层调用 Rust command(自动 camelCase → snake_case):
| Command | 说明 |
|---|---|
load_posts |
查询所有文章元数据 |
save_post |
UPSERT 保存文章 |
import_image |
复制图片到资源目录,返回相对路径 |
generate_site |
生成静态站点(事件推送进度) |
deploy |
部署到本地路径或 Git 仓库 |
list_themes |
列出所有主题 |
apply_theme |
切换当前主题 |
import_theme |
导入 ZIP 主题包 |
start_preview |
启动本地 HTTP 预览服务 |
stop_preview |
停止预览服务 |
🛠️ 推荐开发环境
📄 License
MIT © 2026 XFM
评论