当前位置: 首页 > news >正文

构建 TypoView:一个富文本样式预览工具的全流程记录

我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴

在一次和 CodeBuddy 的日常交流中,我提出了一个构想:能不能帮我从零构建一个富文本样式预览工具?我希望这个工具不仅能渲染 Markdown,还能模拟真实出版物的排版风格,比如极简主义、报刊、读书笔记等,最好还能支持一键切换排版样式,甚至导出 PDF 或网页代码。

CodeBuddy 毫不犹豫地答应了,而且从头到尾主动承担了所有核心代码的生成任务,我几乎只需要旁观并观察它的思路,然后适时调整方向。这篇文章记录了我们合作开发 TypoView 的全过程。


从想法到实现:项目初始化的曲折之路

最开始,我提出需求之后,CodeBuddy 并没有直接进入编码环节,而是对整个项目做了简要分析,它判断这个项目复杂度适中,预估文件不会太多,并主动规划出八个步骤:从创建项目、安装依赖、构建 UI,到最终的导出功能。

我原本以为一切会非常顺利,但没想到一开始创建 Vue3 项目的过程就“翻车”了几次。CodeBuddy 原本打算用 npm create vite@latest . --template vue-ts 创建 Vue + TypeScript 项目,结果因为一些环境问题,Vite 多次默认回退到了 JavaScript 模板。

几次尝试之后,CodeBuddy 没有气馁,而是开始手动排查问题,逐步清理目录内容,更换命令格式,甚至从 PowerShell 角度考虑命令兼容性。最终它通过 Remove-Item * -Recurse -Force; npm create vite@latest typoview --template vue-ts 成功在一个新目录中创建了正确的 Vue3 + TypeScript 项目。

这种从失败中快速迭代并修正策略的能力,让我对 CodeBuddy 的稳健印象非常深刻。


自动生成项目结构与依赖配置

项目目录生成后,CodeBuddy 自动安装了必要的依赖,比如 Markdown 渲染用的 marked,主题样式用的 CSS Modules,还预留了将来导出 PDF 的库扩展空间(如 html2pdf.js)。整个 scaffold 过程清晰有序,使用 Vite 提升了开发效率,而使用 TypeScript 也为后续的模块拆分和类型校验奠定了基础。
在这里插入图片描述


Markdown 渲染的实现与样式注入

CodeBuddy 接着构建了核心组件 MarkdownRenderer.vue,这个组件的职责很明确:接收 Markdown 字符串,转化为 HTML,再通过 CSS Modules 注入不同风格的排版样式。它选择了 marked 库作为 Markdown 解析器,并封装得非常优雅,既保持了解耦又方便主题扩展。

<template><div :class="themeClass" v-html="renderedHtml" />
</template><script lang="ts" setup>
import { marked } from 'marked'
const props = defineProps<{ markdown: string, theme: string }>()
const renderedHtml = computed(() => marked(props.markdown))
const themeClass = computed(() => `typoview-theme-${props.theme}`)
</script>

这种代码结构的优点在于逻辑集中且清晰,主题切换只需要传入不同的 theme 参数即可,CSS Modules 也避免了样式污染的问题。


多种主题切换 + 行距字号模板

为了满足不同使用场景(比如编辑器开发者、写博客的用户等),CodeBuddy 主动构建了三个主题:

  • 极简主题(Minimal)
  • 报刊风格(Newspaper)
  • 阅读笔记风格(Reader)

每个主题通过 .module.css 文件单独定义行距、字间距、首行缩进等参数,并通过按钮切换。更令人惊喜的是,它还引入了“模板配置”的概念,用户可以通过界面选择不同字号/行距组合,比如“16px + 1.5 行距”,“18px + 1.75 行距”等,并立即预览效果。


网格背景与排版边距模拟

为了更贴近真实出版系统的排版体验,CodeBuddy 还添加了仿印刷背景。它在页面底部生成一个网格背景(使用 CSS background-image: repeating-linear-gradient 实现),并对渲染容器设置了左右边距与最大宽度。这种设计不仅提升了整体观感,还让我在排版时更容易把握结构平衡。

在这里插入图片描述


PDF 与代码导出功能的初步接入

虽然目前 PDF 导出模块还未完全接入(CodeBuddy 留下了预留接口和备注),但它已经为未来功能扩展做了准备。例如,将渲染容器转为 canvas 或使用 html2pdf.js 等库,甚至可以考虑导出为静态 HTML 模板,方便博客嵌入或离线展示。


回顾与总结:CodeBuddy 是真正的代码伙伴

整套 TypoView 的开发过程,我几乎没有手写一行核心逻辑代码。每当我下达一个新的功能指令,CodeBuddy 总是快速响应、自动完成项目目录、模块拆分、功能实现,甚至还主动处理了一些预料之外的问题,比如 Vite 模板识别失败和目录清理逻辑不兼容等。

CodeBuddy 在代码生成方面有几个非常突出的优点:

  • 模块划分清晰:每个功能点都对应一个组件或样式模块,便于维护和扩展;
  • 样式结构优雅:使用 CSS Modules 防止污染,主题切换灵活;
  • 功能实现高效:从 Markdown 渲染到导出功能,都有预留与扩展考虑;
  • 异常处理周到:即使遇到创建失败、兼容问题,它也能迅速适配调整。

对我来说,这不再是“辅助写代码”的工具,更像是真正的“代码拍档”。TypoView 是我们合作的又一个代表作,而我也越来越习惯把创意交给它来实现。


如果你也希望将灵感变为现实,又苦于从零搭建的过程太繁琐,那不妨试试把需求告诉 CodeBuddy,或许你会惊讶于它的“执行力”。

在这里插入图片描述

相关文章:

  • Go 语言中的一等公民(First-Class Citizens)
  • 数位和:从定义到编程实现
  • jupyter启动出现OSError: [Errno 28] No space left on device
  • atcoder C - ~
  • 文件IO之标准IO
  • Binary Prediction with a Rainfall Dataset-(回归+特征工程+xgb)
  • 入门OpenTelemetry——应用自动埋点
  • ColorAid —— 一个面向设计师的色盲模拟工具开发记
  • 多模态大语言模型arxiv论文略读(八十)
  • Git多人协作
  • SOLID 面对象设计的五大基本原则
  • Denoising Score Matching with Langevin Dynamics
  • 2_Spring【IOC容器中获取组件Bean】
  • 中级统计师-统计学基础知识-第四章 假设检验
  • 企业内部风险管理:人性化与技术并重
  • 浅谈迷宫类问题中的BFS和DFS
  • ctf 基础
  • [ctfshow web入门] web119
  • 软件设计师CISC与RISC考点分析——求三连
  • 算法加训之最短路 上(dijkstra算法)
  • 体坛联播|雷霆抢七淘汰掘金,国米错失意甲登顶良机
  • 俄乌刚谈完美国便筹划与两国领导人通话,目的几何?
  • 美国贸易政策|特朗普模式:你想做交易吗?
  • 乌称苏梅州一公共汽车遭俄军袭击,致9死4伤
  • 以军称已开始在加沙的新一轮大规模攻势
  • 七猫征文大赛颁出112万奖金,非遗题材作品斩获金奖