TypeZen 是一款专为微信公众号设计的「Markdown 转微信排版」辅助工具。用户编写 Markdown 文本后,可以使用 AI 一键优化排版结构,再套用 72 套不同风格的精美模板,可直接复制粘贴到微信公众平台后台。
- 框架: Next.js 16.2.0 (App Router)
- UI 库: React 19.2.4
- 样式: Tailwind CSS 4
- Markdown 解析: marked 17.0.4
- AI SDK: Vercel AI SDK 6,
@ai-sdk/openai,@ai-sdk/anthropic - 图标: lucide-react,@lobehub/icons(OpenRouter / OpenAI / Anthropic 品牌图标)
- 语言: TypeScript 5
- 代码检查: Biome
重要: Next.js 16 有破坏性变更,API、约定和文件结构可能与训练数据不同。编写代码前请先阅读
node_modules/next/dist/docs/中的相关指南。
wechat-formatter/
├── app/
│ ├── _components/ # 页面拆分组件(编辑区、预览区、设置面板、AI 配置弹窗等)
│ ├── _hooks/ # 业务 hooks(AI 排版、AI 配置、复制、滚动同步、主题等)
│ ├── _lib/ # 页面常量(示例文案、AI localStorage keys、OpenRouter 配置)
│ ├── _types/ # 页面共享类型
│ ├── api/
│ │ ├── ai-format/route.ts # AI 一键排版接口(流式返回 Markdown)
│ │ └── openrouter-models/ # OpenRouter 文本模型列表代理接口
│ ├── page.tsx # 主页面组合组件(三栏布局)
│ ├── template-engine.ts # 模板引擎和 Markdown 渲染逻辑
│ ├── layout.tsx # 根布局、metadata、统计脚本、主题初始化
│ ├── json-ld.tsx # 结构化数据
│ ├── manifest.ts # PWA manifest
│ ├── robots.ts # robots 配置
│ ├── sitemap.ts # sitemap 配置
│ ├── globals.css # 全局样式与 Neo 风格变量
│ └── favicon.ico # 网站图标
├── lib/
│ └── site-config.ts # 站点品牌、标题、描述、URL 等 SEO 常量
├── public/ # 静态资源
│ ├── logo.png # 网站 Logo
│ └── reward.png # 赞赏码图片
├── .agents/skills/ # Agent 技能配置
├── package.json # 项目依赖
├── tsconfig.json # TypeScript 配置
├── next.config.ts # Next.js 配置
├── postcss.config.mjs # PostCSS 配置
└── biome.json # Biome 配置
-
72 套模板分为 6 大类:
neo-brutalism- 新粗野风(12套):高饱和色彩、粗黑边框、硬投影minimalist- 极简风(12套):圆点、清爽边框business- 商务风(12套):方块标识符、专业严谨literary- 文艺风(12套):花朵图标、留白设计tech- 科技风(12套):尖角、极客终端风格festive- 节庆风(12套):星星标识、浓烈色彩
-
模板配置接口
TemplateConfig:- 基础样式:颜色、字体、背景色(
backgroundColor,确保暗黑模式兼容) - 各元素样式:标题(h1-h3)、段落、引用、列表、代码块、图片、分隔线、链接、表格等
- 基础样式:颜色、字体、背景色(
- 使用
marked库解析 Markdown - 自定义渲染器将样式内联到 HTML 元素
- 关键约束:微信公众号只支持内联样式(inline-css),所有样式必须写入
style=""属性
- 三栏响应式布局:
- 左侧:Markdown 输入区、工具栏、AI 一键排版按钮
- 中间:手机框预览区(模拟 iPhone 外观)
- 右侧:模板选择、主题色与排版参数调整
- 移动端适配:Tab 切换模式
- 一键复制:使用
document.execCommand('copy')复制渲染后的 HTML - 滚动同步:桌面端可开启编辑区与预览区同步滚动功能(移动端隐藏)
- 赞赏功能:顶栏赞赏按钮,点击弹出赞赏码弹窗
- Neo 风格界面:使用 CSS 变量统一管理亮色/暗色主题下的高对比边框、硬投影和主题色
- 前端 hooks:
use-ai-settings.ts:管理 AI 配置弹窗状态、provider、baseUrl、apiKey、model,并使用localStorage本地保存use-ai-format.ts:校验配置并请求/api/ai-format,读取流式响应后实时写回编辑区
- 配置弹窗:
ai-config-modal.tsx- 支持
openrouter、openai、anthropic - OpenRouter 使用固定默认地址
https://openrouter.ai/api/v1 - OpenAI / Anthropic 支持用户自定义兼容 API 地址
- OpenRouter 模型列表来自
/api/openrouter-models,免费模型优先展示 - OpenRouter / OpenAI / Anthropic 使用 @lobehub/icons 品牌图标
- 支持
- 服务端接口:
/api/ai-format:使用 Vercel AI SDK 调用模型并流式返回 Markdown/api/openrouter-models:代理 OpenRouter 模型列表,标准化模型名称、价格、上下文长度与免费状态
- 安全边界:
- API Key 仅保存在当前浏览器本地
- 排版时会临时发送到服务端调用模型服务
- 项目不持久化保存用户 API Key
- 内容约束:
- 系统提示词要求 AI 不改写原文、不删除内容、不增补事实
- 只允许调整标题层级、空行、列表、加粗、引用、分隔线等 Markdown 排版结构
lib/site-config.ts统一维护站点品牌、域名、默认标题、描述和 Open Graph 站点名layout.tsx使用站点常量生成 metadata、Open Graph、Twitter Card、robots 配置和统计脚本json-ld.tsx输出 WebApplication / SoftwareApplication / WebSite / Organization 结构化数据manifest.ts使用站点常量生成 PWA 展示名称与简介robots.ts、sitemap.ts使用统一站点 URL,避免 SEO 信息分散
- Node.js 20.9.0 或更高版本(Next.js 16.2.0 的运行时要求)
- npm 或 pnpm
# 安装依赖
npm install
# 启动开发服务器
npm run dev
# 构建生产版本
npm run build
# 启动生产服务器
npm run start
# 运行 Biome 检查
npm run lint- 使用 Tailwind CSS 进行页面布局和样式
- 模板样式使用纯内联 CSS 字符串(兼容微信)
- 颜色使用标准 hex 格式(如
#3b82f6)
- 使用
'use client'标记客户端组件 - 使用 React Hooks 管理状态
- 事件处理函数定义在组件内部
- 接口定义放在文件顶部
- 避免使用
any类型(渲染器除外,因 marked 类型复杂) - 导出公共函数和类型
- Provider 类型统一使用
AiProviderType = "openrouter" | "openai" | "anthropic" - AI 配置 localStorage key 统一维护在
aiStorageKeys - OpenRouter 默认地址、API Key 页面、模型页面与模型 API 地址统一维护在
openRouterConfig - 不要在代码中硬编码任何用户 API Key 或服务端私钥
/api/ai-format必须继续返回流式文本响应,前端依赖ReadableStream逐步更新编辑区- 修改 AI prompt 时必须保持“不改写原文、不删除内容、只调整 Markdown 排版结构”的核心约束
- 新增 provider 时需要同时更新类型定义、配置弹窗、设置持久化、服务端模型创建逻辑和文档说明
- 项目介绍、模板数量、AI 能力描述需要同步更新:
README.mdAGENTS.mdlib/site-config.tsapp/json-ld.tsxapp/manifest.tsapp/_lib/formatter-constants.ts
- 当前模板数量是 72 套,分类数量是 6 类
- 当前核心定位是:TypeZen 免费在线 Markdown 转微信公众号排版工具,支持 AI 一键优化排版结构、实时预览、样式微调和一键复制发布
- 样式内联:所有 CSS 必须内联到
style属性 - 标签限制:避免使用
<script>、部分 HTML5 语义标签 - 布局方案:
- 外层容器使用
<section>包裹,确保微信公众号智能广告系统能正常识别文章结构 - 内部元素使用
<section>+display: flex布局
- 外层容器使用
- 字体限制:只能使用系统默认字体
- 图片处理:图片需要上传到微信服务器或使用微信支持的图床
- 背景色:使用
background-color而非background简写,微信对简写支持差 - 防止溢出:
- 表格添加
table-layout: fixed; max-width: 100%; - 单元格添加
word-wrap: break-word; word-break: break-all; - 避免使用
width: max-content,会导致内容溢出
- 表格添加
- 暗黑模式兼容:
- 必须为所有模板设置明确的
backgroundColor属性 - 外层
<table>和内部<td>都需要设置background-color - 防止用户电脑暗黑模式影响粘贴到公众号后的显示效果
- 必须为所有模板设置明确的
在 template-engine.ts 的 colorPalettes、categoriesList 和 generateTemplates() 中保持分类、配色和生成逻辑一致。新增分类后同步更新 README、AGENTS、站点 metadata 和示例文案。
在 template-engine.ts 的 customRenderer 对象中修改对应的渲染方法。
修改 page.tsx 中的 Tailwind CSS 类名或组件结构。
- 在
app/_types/formatter.ts的FormatTweaks中添加字段 - 在
page.tsx的默认微调配置中添加默认值 - 在
settings-pane.tsx中添加 UI 控件 - 将参数传递给
renderArticle()函数 - 在
template-engine.ts中将参数转换为微信公众号兼容的内联样式
- 使用
useRef获取 DOM 元素引用 - 使用
useCallback包装事件处理函数(避免不必要的重渲染) - 对于需要阻止循环触发的场景,使用
useRef作为标记(如isScrollingRef)
- 前端配置状态优先修改
use-ai-settings.ts - 前端请求与流式读取逻辑优先修改
use-ai-format.ts - AI 配置弹窗 UI 修改
ai-config-modal.tsx - 模型调用逻辑修改
app/api/ai-format/route.ts - OpenRouter 模型列表逻辑修改
app/api/openrouter-models/route.ts - 修改 provider、存储 key、模型结构时同步更新
app/_types/formatter.ts和app/_lib/formatter-constants.ts
- 已完成 AI 一键排版能力,支持 OpenRouter、OpenAI、Anthropic 三类接口
- 已完成 OpenRouter 模型列表拉取、搜索、免费模型优先展示和官方 OpenRouter 图标展示
- 已完成 Vercel AI SDK 流式 Markdown 返回,前端边接收边更新编辑区
- 已完成页面组件拆分:编辑区、预览区、设置面板、弹窗、toast、hooks 均已模块化
- 已完成 Neo 风格界面升级,使用 CSS 变量兼容亮色和暗色主题
- 已完成模板扩展到 72 套,当前分类为新粗野、极简、商务、文艺、科技、节庆 6 类
- 已完成样式微调能力:字号、行高、段落间距、首行缩进、页面留白、字间距、图片圆角和主题色
- 已完成站点配置常量化,metadata、JSON-LD、manifest、robots、sitemap 共用
lib/site-config.ts的品牌与 URL 信息 - 已迁移到 Biome 进行代码检查与格式化