1. 前言

博客园自 2004 年上线以来,凭借着简洁的界面、浓厚的技术氛围成为了国内程序员的核心创作平台之一,而皮肤定制则是博客园用户个性化表达的重要方式。从早期的纯 CSS 样式修改,到后来的 JS 脚本增强,博客园皮肤开发的需求不断升级,但平台的原生开发模式却始终没有跟上前端技术的发展步伐。

在前端工程化、现代化框架(React/Vue)、实用型 CSS 框架(Tailwind CSS)成为行业主流,且 AI 大模型深度融入前端开发的今天,博客园原生的“浏览器端修改 CSS/JS 片段”的开发模式显得格格不入:用户只能在浏览器中检查元素、修改样式,没有热模块替换(HMR)、没有类型校验、没有打包优化、没有模块化,无法享受现代前端便利。更让 AI 大模型无法有效接入——AI 难以读取博客园的原生模板。

正是在这样的背景下,我创建了 Tona。Tona 是基于 Monorepo 架构打造的一套完整的博客园皮肤开发工具链。本文将从技术底层到实战应用,全面介绍 Tona 的设计与实现,并结合 AI 大模型的能力,打造一套 AI × Tona × 博客园皮肤的现代化开发范式,让每一位开发者都能快速开发出高质量、可维护、个性化的博客园皮肤,同时享受 AI 协作开发的高效与便捷。

2. 博客园皮肤开发的痛点

博客园为用户提供了页面定制 CSS博客侧边栏公告页脚 HTML 代码自定义 JS 脚本等入口,允许用户通过编写 CSS/JS/HTML 片段实现皮肤定制,但这种开发模式存在六大核心痛点,严重制约了开发效率和皮肤质量:

(1)开发环境简陋,无现代化前端工程化能力

博客园的皮肤开发完全依赖浏览器端:开发者需要先在博客园后台编辑代码,保存后刷新页面查看效果,没有热更新(HMR) 能力,修改一行样式需要等待页面重新加载;没有打包工具,无法对 JS/CSS 进行压缩、树摇、按需加载;没有模块系统,无法使用 ES6+的import/export,只能通过全局变量实现代码复用,代码冗余且难以维护。

(2)调试难度大,无完整的调试工具链

博客园的原生代码运行在平台的全局环境中,开发者只能通过浏览器的开发者工具进行简单的元素检查和断点调试,无法使用 Vite、Webpack 等工具的调试能力,也无法对代码进行单元测试、集成测试;同时,博客园的原生 HTML 模板不可修改,开发者需要在已有 DOM 结构上进行样式覆盖和 JS 操作,DOM 结构的不确定性进一步增加了调试难度。

(3)技术栈受限,无法使用现代化前端框架与工具

博客园原生开发仅支持原生 CSS/JS/HTML,无法直接使用 React/React/Vue 等现代化前端框架,也无法使用 Tailwind CSS、UnoCSS 等实用型 CSS 框架;即使开发者通过手动引入框架 CDN 包实现了部分功能,也会面临全局变量冲突、打包体积过大、性能不佳等问题,无法发挥现代化工具的真正价值。

(4)代码可维护性差,无模块化与类型安全

由于没有模块系统和类型校验,博客园皮肤的代码往往是“面条式代码”:CSS 样式相互覆盖,JS 函数全局挂载,HTML 片段零散分布;没有 TypeScript 的类型校验,开发者在编写代码时容易出现语法错误、变量名错误等问题,且错误只能在运行时发现,开发效率极低。

(5)团队协作困难,无标准化的开发流程

博客园皮肤的开发以个人为主,没有标准化的项目结构、代码规范、提交规范;代码保存在博客园后台,无法通过 Git 进行版本管理,也无法进行团队协作开发;同时,没有 Lint 工具、Prettier 工具的代码格式化能力,不同开发者的代码风格差异大,代码合并与维护困难。

(6)AI 难以接入,无法享受 AI 大模型的开发红利

这是新时代博客园皮肤开发的核心痛点之一。AI 大模型的有效开发需要标准化的项目结构可访问的代码文件清晰的技术规范,而博客园原生开发的代码仅存在于博客园后台的零散片段中,AI 无法读取博客园的原生 HTML 模板、无法理解代码的上下文、无法生成符合规范的模块化代码,更无法参与工程化的开发流程,让开发者错失 AI 开发的红利。

3. Tona:架构、技术栈与工程化流水线

3.1 博客园皮肤开发的现代化解决方案

flowchart TD A[传统 CNBlogs 开发] --> B[浏览器检查元素] B --> C[手动修改 CSS/JS] C --> D[上传设置界面测试] D --> E[重复调试,效率低] F[Tona 开发] --> G[pnpm create tona 初始化] G --> H[Vite 本地服务器 + 模板注入] H --> I[热更新 + AI 生成代码] I --> J[构建打包 + 部署] subgraph 解决方案 F --> J end subgraph 痛点 A --> E end

Tona 核心定位是博客园专属的模块化皮肤开发工具链,其设计初衷就是解决上述博客园原生开发的所有痛点。Tona 基于 Monorepo 架构打造了一套完整的皮肤开发工具链,包含可复用的核心包、预构建的皮肤、可扩展的插件系统,同时深度整合 Vite 生态,实现了博客园皮肤的本地开发、工程化构建、标准化部署。

Tona 的核心解决方案可以总结为以下五点:

  1. 本地开发环境搭建:通过tona-vite插件将博客园的原生 HTML 模板注入 Vite Dev Server 中,让开发者可以在本地脱离博客园环境进行皮肤开发,享受 Vite 的热更新、调试、打包等工程化能力;
  2. 现代化技术栈支持:原生支持 TypeScript、React、Tailwind CSS V4 等现代化前端技术栈,提供了标准化的项目结构和代码规范,让开发者可以使用熟悉的工具开发博客园皮肤;
  3. 模块化的核心包体系:将核心能力拆分为tona-coretona-hookstona-optionstona-utils等多个核心包,每个包负责特定的功能,实现了功能的解耦与复用,同时也为 AI 开发提供了标准化的 API;
  4. 工程化的开发流程:提供了完整的开发、构建、测试、发布,集成了 Vitest、Biome、Stylelint 等工具,实现了代码的 Lint、格式化、单元测试、集成测试,同时支持 Git 版本管理和团队协作开发;
  5. 可扩展的插件系统:提供了tona-plugins插件系统,开发者可以通过编写插件实现 DOM 操作、功能增强等需求,同时内置了多个实用插件,满足开发者的日常开发需求。

简单来说,Tona 让博客园皮肤开发从“浏览器端的零散片段开发” 升级为“本地的现代化前端项目开发”,让开发者可以像开发普通前端项目一样开发博客园皮肤,同时为 AI 接入搭建了标准化的技术底座。

3.2 Monorepo 架构设计

Tona 采用基于 pnpm workspace 的 Monorepo 架构,这是现代化前端的主流架构选择,其优势在于可以将核心能力拆分为多个独立的包,实现功能的解耦与复用,同时便于版本管理和团队协作开发。

Tona 的 Monorepo 结构主要分为三大核心目录

(1)根目录:工程化流水线配置

Tona 的根目录包含了所有工程化配置文件,如pnpm-workspace.yaml(pnpm 工作区配置)、biome.jsonc(代码 Lint 与格式化)、vitest.config.ts(测试配置)、package.json(根目录脚本与依赖)等,同时提供了scripts/目录,包含开发、构建、发布的核心脚本,实现了一键开发、一键构建、一键发布

(2)packages/:核心包与工具链(12 个包)

packages/目录是 Tona 的核心,包含 12 个独立的包,每个包负责特定的功能,采用分层架构设计(构建层、扩展层、UI 层、工具层、基础层),包之间通过workspace:*协议相互引用,实现本地开发无需发布,同时便于版本同步。

所有包均使用 TypeScript 开发,提供完整的类型定义,这不仅保证了类型安全,也为 AI 开发提供了清晰的 API 提示。

(3)themes/:内置皮肤实现(3 个皮肤)

themes/目录包含 Tona 内置的 3 个博客园皮肤皮肤,分为组件化模式插件化模式两种开发范式:

  • Shadcn 皮肤:基于 React+Tailwind CSS V4 的组件化皮肤,采用 Tona 的全量核心包,适合开发复杂、美观、可定制的高端皮肤;
  • Geek/Reacg 皮肤:基于原生 DOM+Sass 的插件化皮肤,仅使用 Tona 的核心包(core/options/plugins),适合开发轻量、高效的极简皮肤。

这 3 个皮肤不仅是可直接使用的博客园皮肤,更是 Tona 的实战示例,AI 可以通过读取这些皮肤的代码,学习 Tona 的开发规范和最佳实践。

image

image

image

image

3.4 核心技术栈选型

Tona 的技术栈选型遵循轻量、现代、高效、适配博客园的原则,所有技术栈均为当前前端行业的主流选择,同时充分考虑了博客园的运行环境。

Tona 的核心技术栈可分为核心开发工具前端框架样式工具工程化工具四大类,具体选型及版本、用途如下表所示:

分类 技术栈 版本 核心用途
构建工具 Vite ^7.3.1 开发服务器、热更新、打包构建、树摇优化
包管理器 pnpm 10.28.2 Monorepo 工作区管理、依赖安装、包之间的引用
开发语言 TypeScript ^5.9.3 全框架类型安全、代码提示、语法校验
UI 框架 Preact ^10.28.2 轻量 React 替代方案,体积小、性能高,适配博客园的全局环境
样式框架 Tailwind CSS ^4.1.18 工具类优先的 CSS 框架,快速实现样式开发,支持@apply 指令
包构建工具 tsdown latest TypeScript 包编译,将 TS 代码编译为 ES 模块,适配 Vite 生态
测试工具 Vitest ^4.0.16 单元测试、集成测试,支持快照测试、模拟测试
代码 Lint Biome ^2.3.11 代码 Lint、格式化、语法校验,替代 ESLint+Prettier,性能更高
Git Hooks Lefthook ^2.0.13 提交前代码校验、测试,保证代码提交质量
CSS 预处理器 Sass latest 插件化皮肤的样式开发,支持变量、混合、嵌套
动画库 motion ^12.25.0 tona-theme-shadcn 皮肤的动画效果,实现流畅的页面过渡和交互
图标库 lucide-React ^0.562.0 tona-theme-shadcn 皮肤的图标系统,提供丰富的矢量图标
组件库 @base-ui-components 1.0.0-beta.4 tona-theme-shadcn 皮肤的无头 UI 组件,实现可定制的基础组件

技术栈选型的核心考量

  1. Preact:React 的体积仅 3KB 左右,远小于 React,且 API 与 React 完全兼容,不会在博客园的全局环境中造成体积过大或变量冲突的问题;
  2. Vite 作为构建工具:Vite 的热更新速度极快,打包效率高,且原生支持 ES 模块,非常适合博客园皮肤的本地开发;
  3. pnpm 作为包管理器:pnpm 的包安装速度快、磁盘占用低,且原生支持 Monorepo 架构,是 Tona 的最佳选择;
  4. Tailwind CSS V4:Tailwind CSS V4 相比旧版本性能更高、功能更全,支持@apply 指令的高级用法,非常适合博客园皮肤的样式开发;
  5. Biome 替代 ESLint+Prettier:Biome 是一款高性能的一站式代码工具,集成了 Lint、格式化、语法校验等功能,配置简单,性能远高于 ESLint+Prettier,适合 Monorepo 架构的工程化管理。

3.5 开发与构建流水线

Tona 提供了标准化的开发与构建流水线,所有操作都通过根目录的package.json脚本实现,开发者无需关心底层的实现细节,只需执行简单的命令即可完成开发、构建、测试、发布等操作。同时,这一流水线也为 AI 开发提供了标准化的操作入口——AI 可以通过执行这些脚本,参与全流程的开发。

Tona 的开发与构建流水线可通过以下 Mermaid 图直观展示:

graph LR A[开发阶段] --> A1[pnpm dev:启动开发服务器] A1 --> A2[scripts/dev-theme.ts:皮肤开发脚本] A2 --> A3[Vite Dev Server+HMR:热更新开发] B[测试阶段] --> B1[pnpm test:执行单元/集成测试(Vitest)] B1 --> B2[pnpm typecheck:TypeScript 类型校验] B2 --> B3[pnpm lint:代码 Lint 与格式化(Biome)] C[构建阶段] --> C1[pnpm build:构建皮肤(Vite)] C1 --> C2[pnpm build:pkg:并行构建所有核心包] C2 --> C3[Vite Build+树摇:皮肤打包优化] C2 --> C4[tsdown:TS 包编译为 ES 模块] C3 --> C5[themes/*/dist/:皮肤构建产物] C4 --> C6[packages/*/dist/:包构建产物] D[发布阶段] --> D1[pnpm release:版本发布] D1 --> D2[bumpp:版本号自增] D2 --> D3[scripts/update-versions.mjs:同步所有包版本] D3 --> D4[发布到 npm/私有仓库]

(1)核心脚本说明

Tona 的根目录package.json提供了 7 个核心脚本,覆盖了开发、测试、构建、发布的全流程,具体如下表所示:

脚本名 具体命令 核心用途
dev node scripts/dev-theme.ts 启动 Vite 开发服务器,注入博客园模板,实现热更新开发
build node scripts/build-theme.ts 构建所有皮肤,通过 Vite 进行打包、压缩、树摇优化,生成可部署的构建产物
build:pkg pnpm -r --filter=./packages/** --parallel run build 并行构建packages/目录下的所有核心包,提高构建效率
typecheck tsc --noEmit 对所有 TypeScript 代码进行类型校验,保证类型安全
test vitest test 执行 Vitest 的单元测试和集成测试,保证代码质量
lint pnpm exec biome check --write 对所有代码进行 Lint 和格式化,自动修复代码风格问题
release bumpp ... -x "zx scripts/update-versions.mjs" 版本号自增,同步所有核心包和皮肤的版本,实现一键发布

(2)流水线的核心特点

  1. 一键化操作:所有流程都通过简单的pnpm

原文地址: https://www.cveoy.top/t/topic/qFXp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录