需求分析
1. 核心功能需求
- 长篇文章处理能力:
- 支持用户输入、编辑和显示大量文本内容,性能需流畅,不能因文本量大而卡顿。
- 提供基础的文本编辑功能,如复制、粘贴、剪切、撤销、重做。
- 基础文字渲染与排版:
- 支持常见的字体选择、字号调整、颜色设置。
- 提供段落对齐(左对齐、右对齐、居中、两端对齐)、行距调整等基础排版功能。
- 可定制的文字形变:
- 用户能够选择文章中的任意文字或短语,并对其进行无损的、高度自由的矢量形变。
- 形变效果包括但不限于:横向拉伸、纵向拉长、整体扭曲、自由弯曲等,实现类似手绘或漫画中为了强调而进行的夸张形变。
- 形变操作应直观,最好能通过鼠标拖拽、控制点调整等方式进行。
- SVG 涂鸦与形变文字的无缝集成:
- 支持用户上传和嵌入自定义的 SVG 图像(例如手绘涂鸦),这些 SVG 图像应和形变后的文字一样,支持无损放大。
- 嵌入的 SVG 和形变文字应能与普通文本在同一篇文章中和谐共存,并能进行位置调整。
- 内容保存与加载:
- 能够保存用户创建的文章内容,包括所有普通文本、形变文字(及其形变数据)和嵌入的 SVG 图像。
- 能够正确加载之前保存的文件,并恢复所有文字的原始排版和形变效果。
2. 非功能性需求
- 卓越的性能:
- 处理长篇文章的基础渲染和编辑时,必须保持流畅的用户体验。
- 文字的矢量化和形变计算需要毫秒级响应,避免卡顿。
- 即使形变后的文字数量较多,整体性能也应保持高效。
- 高可扩展性:
- 软件架构应模块化,便于未来引入新的形变效果、图形工具或导出格式。
- 方便集成第三方字体库。
- 优秀的跨平台体验:
- 软件应在 Windows、macOS 和 Linux 三个主流操作系统上提供原生级别的性能和一致的用户界面。
- (可选,但考虑到你对 Android 开发的兴趣)未来可考虑向移动端(Android/iOS)扩展的可能性。
- **直观的用户界面 (UI)**:
- 界面设计应简洁、现代,以内容为中心,避免过多干扰。
- 形变工具应易于理解和操作,降低学习成本。
- 数据完整性与可靠性:
- 确保保存和加载文件时数据的完整性和准确性,特别是形变数据和 SVG 内容。
- 离线可用性:作为桌面应用,应能在没有网络连接的情况下完整运行所有核心功能。
技术选型与架构设计
根据你的需求,特别是对性能、跨平台、可扩展性以及你对 Tauri 和前端技术的经验,我推荐以下技术栈和架构方案:
1. 整体框架:Tauri (前端 Vue.js + 后端 Rust)
选择理由:Tauri 结合了 Web 前端的开发效率和 Rust 后端的原生性能。它能将一个 Web 应用打包成一个轻量、高性能的原生桌面应用,完美满足你对跨平台和性能的需求。
核心优势:
- 高性能后端:使用 Rust 编写核心逻辑,确保文字矢量化和形变计算的性能。
- 丰富的生态:可以利用成熟的前端技术栈(Vue/React)快速构建 UI。
- 小巧的打包体积:Tauri 的打包文件远小于 Electron,减少了软件的发布和分发成本。
2. 前端技术栈 (Vue.js)
职责:负责整个应用的用户界面、用户交互、普通文本的输入和显示、形变文字的占位符渲染以及 SVG 涂鸦的嵌入和显示。
核心库:
- Vue.js 3:作为 UI 框架,利用其响应式系统和组件化特性快速构建界面。
- 富文本编辑器:选择 TipTap 或 Quill.js。
- 它们都支持自定义扩展,可以让你在编辑器中插入非标准内容,例如我们的形变文字(以 SVG 形式)和 SVG 涂鸦。
- 你可以创建一个自定义的 “Node” 或 “Embed” 类型,用于表示形变后的文字或 SVG 涂鸦,这样它们就能与普通文本一起在编辑器中显示和操作。
- UI 组件库:Element Plus 或 Ant Design Vue。用于构建工具栏、设置面板、文件管理器等,确保 UI 的美观和一致性。
- CSS 框架:Tailwind CSS。简化样式编写,提供响应式设计能力。
- 交互设计思考:
- 当用户选择一段文字进行形变时,前端将这段文字、当前使用的字体信息以及形变操作参数(例如,鼠标拖拽的起始点和结束点,或一个形变类型)作为参数,通过 Tauri 的 invoke API 发送给 Rust 后端。
- 后端返回形变后的 SVG 字符串后,前端将其动态替换掉原有的文本,并以 <svg> 标签的形式插入到富文本编辑器中。
- 嵌入的 SVG 涂鸦也直接作为 <svg> 标签或 <img> 标签(src 为 data:image/svg+xml;base64,...)插入。
3. 后端技术栈 (Rust)
职责:处理所有计算密集型任务,包括文字的矢量化、形变计算、SVG 生成以及文件内容的读写(复杂格式)。
核心库:
- 字体解析与矢量化:
- rusttype:一个纯 Rust 的 TrueType 字体解析和光栅化库。它能读取字体文件,并提供每个字符的矢量轮廓数据(路径、锚点、控制点)。这是实现文字形变的基础。
- (可选)**fontdue**:另一个高性能字体渲染引擎,提供更多字体处理功能,可以作为 rusttype 的替代或补充。
- 几何变换与矢量图形操作:
- lyon:一个强大的 2D 几何处理和路径构建库。它能让你轻松地对矢量路径进行各种数学变换(平移、缩放、旋转、扭曲),并进行路径操作(如合并、裁剪)。
- 自定义形变算法:你需要自己编写 Rust 代码来实现具体的形变逻辑。例如,基于贝塞尔曲线的扭曲算法、网格变形算法等。
- SVG 生成:
- std::fmt::Write 和字符串拼接:Rust 原生字符串处理能力可以高效地构建 SVG 字符串。
- (可选)**resvg** 或其他 SVG 库:如果需要更复杂的 SVG 输出控制,可以考虑。但对于形变文字,直接拼接 SVG <path> 数据通常更高效。
- 文件系统操作:Rust 标准库提供了强大的文件 I/O 能力,用于保存和加载文章数据。
4. 数据存储与性能优化方案
针对长篇文章可能带来的大文件和性能问题,采用以下优化策略:
4.1 本地数据存储:SQLite 数据库
理由:对于包含大量内容块(普通文本、形变文本、嵌入 SVG)的长篇文章,将所有数据存储在一个巨大的 JSON 文件中会显著影响读写性能和内存占用。使用嵌入式本地数据库 SQLite 是更专业、高效且可扩展的方案。
实现方式:
- 数据模型:
- 创建一个主表 (articles) 存储文章的元数据(如 ID, 标题, 创建日期, 最后修改日期)。
- 创建一个 blocks 表存储文章的内容块。每行代表一个内容块,包含字段如:block_id (唯一标识), article_id (关联到哪篇文章), type (块类型:paragraph, transformed_text, svg_embed), order (在文章中的顺序), content (存储具体数据)。
- 内容存储:
- 对于普通文本 (paragraph),content 字段直接存储文本字符串。
- 对于形变文字 (transformed_text) 和嵌入 SVG (svg_embed),content 字段可以存储其原始文本、形变参数和最终的 SVG 字符串。这些数据可以序列化为二进制数据(BLOB)存储,以提高效率。
- 优点:
- 按需加载:后端可以只查询和加载当前视图所需的内容块,显著降低内存占用和渲染延迟。
- 高效的数据管理:支持快速地对特定内容块进行增、删、改、查操作。
- 数据可靠性:SQLite 提供事务支持和数据完整性保障。
- Rust 库:使用
rusqlite等 Rust 库来与 SQLite 数据库交互。
4.2 数据序列化:二进制格式
理由:虽然 SQLite 解决了大文件的管理问题,但在数据库内部,对于形变数据 (
transformData) 和完整的 SVG 字符串 (svgContent),如果直接存储为文本,仍会占用较大空间并影响读写效率。实现方式:
- 在将形变文字的形变数据和 SVG 字符串存储到 SQLite 的 BLOB 字段之前,使用高效的二进制序列化库将其转换为紧凑的字节数组。
- 推荐库:**bincode** 或 **prost (用于 Protobuf)**。它们能将复杂的 Rust 结构体序列化为非常紧凑的二进制格式。
- 优点:
- 进一步减小存储体积,特别是对于重复或结构复杂的 SVG 数据。
- 加快数据的序列化和反序列化速度,提升数据库读写效率。
4.3 文件压缩
理由:无论最终选择何种存储方式(JSON 或是 SQLite),对最终保存的文件进行压缩,可以在磁盘存储和网络传输(如果未来考虑同步)方面带来额外收益。
实现方式:
- 在 Rust 后端,保存 SQLite 数据库文件到磁盘时,可以考虑对其进行整体压缩(例如,使用 zstd 或 flate2 库进行 Gzip 压缩)。
- 读取文件时,先解压缩,再进行数据库操作。
- 优点:显著减少磁盘占用,降低文件传输时间。
4.4 前端渲染优化:内容虚拟化/懒加载
理由:即使后端能高效加载数据,前端也不能一次性渲染整篇文章的所有 DOM 元素,这会导致性能下降。
实现方式:
- 在前端富文本编辑器中集成虚拟滚动(Virtual Scrolling)或内容虚拟化技术。
- 这意味着编辑器只渲染当前用户可见区域(或稍微超出部分)的内容块。当用户滚动时,动态地加载新内容块并卸载屏幕外的旧内容块。
- 优点:
- 大幅减少前端 DOM 节点的数量,提高渲染性能和交互流畅性。
- 降低前端内存占用。
- TipTap/Quill 集成:这两个编辑器都支持插件化和自定义渲染,可以让你实现自己的虚拟化渲染逻辑。
5. 架构示意图
1 |
|
对话来源:gemeni
预期的实现效果
