Vue3 + Canvas: 探索 @chenglou/pretext 的高性能文本排版艺术 🎨
- 🔗 线上体验地址: pretext.tzpaly.top
- 💻 开源代码仓库: Gitee - T_Salt/pretext
- 📢 微信公众号: 你懂个der
这是一个基于 Vue 3 和 Vite 构建的交互式展示项目,深度整合并演示了由 Cheng Lou 编写的高性能文本排版库 @chenglou/pretext。
在 Web 开发中,Canvas 虽然具有极高的渲染性能,但文本排版一直是个痛点(例如:没有自动换行、没有文字截断、没有图文混排)。本项目通过十多个精心设计的交互式 Demo,向你展示如何使用 @chenglou/pretext 赋予 Canvas 与 HTML/CSS 媲美的现代排版能力!
✨ 核心特性
- 🌗 亮/暗双主题无缝切换:采用现代 CSS 变量架构,并结合 Vue 的响应式状态 (
watchEffect) 实现了 Canvas 画布在主题切换时的动态重绘。 - 📱 完美的响应式布局:内置
useResponsiveWidth智能 Hook。无论是在宽屏 PC 还是在竖屏手机上,Canvas 的宽度与卡片边距都能自适应缩放,保证极佳的阅读和交互体验。 - 📚 全 API 中文文档覆盖:不再是枯燥的代码注释!项目内设专门的“API 漫游”与“高级 API”模块,以图文并茂、代码实时对照的形式讲解了所有暴露的 API。
- 🚀 极致性能:所有 Demo 的渲染均在
<canvas>的 2D Context 下纯手工绘制,无任何 DOM 节点依赖。
🎮 精彩 Demo 场景一览
项目中包含十多个结合实际业务场景的交互演示,它们全部通过 Canvas 渲染而成:
- 基础排版 (CanvasRenderDemo):最基本的自动换行、对齐方式以及文本截断。
- 测量与定位 (MeasureHeightDemo):教你如何在文本实际绘制前,精准计算其高度以动态分配画布尺寸。
- 收缩包裹 (ShrinkwrapDemo):实现类似 CSS
width: max-content的效果,边框紧紧包裹住长短不一的多行文本。 - 浮动布局 (FloatLayoutDemo):复刻经典 CSS 环绕浮动,让文本优雅地环绕在图片的左侧或右侧。
- 聊天气泡 (ChatUIDemo):实战演练!利用 Canvas 排版构建一个流畅、高度自适应的 IM 聊天气泡界面。
- 瀑布流卡片 (MasonryDemo):动态多列瀑布流布局,图文混排并实现多行文字截断。
- 二分查找布局 (BinarySearchLayoutDemo):通过二分查找算法实现“在有限宽高中寻找最完美的字号”,解决文本自适应填充问题。
- 手机端复杂表格 (MobileTableDemo):用代码绘制复杂的带有单元格边框、表头以及多行内容的表格,专为手机端展示优化。
- Markdown 渲染 (MarkdownDemo):解析自定义 AST,将标题、段落和内联代码等 Markdown 结构精准绘制入 Canvas。
- 高级 Markdown (MarkdownAdvancedDemo):在 Markdown 的基础上加入网络图片的异步预加载、表格渲染以及复杂图文排版。
🛠️ 技术栈
- 框架: Vue 3 (Composition API) +
<script setup> - 构建工具: Vite
- 排版引擎:
@chenglou/pretext - 图标: Heroicons (SVG 直接引入)
- UI 设计: 玻璃拟物化 (Glassmorphism) + 响应式流式布局
📦 本地运行
- 克隆项目并进入目录:
git clone <your-repo-url> cd vue-demo - 安装依赖:
npm install - 启动开发服务器:
npm run dev - 构建生产版本:
npm run build
💡 给开发者的建议
在项目中,我将所有业务场景的绘制逻辑全部封装在了 src/components/ 目录下。如果你对 Canvas 性能优化、自定义渲染引擎、或者如何在 WebGL/Canvas 游戏里做 UI 感兴趣,这个项目将会是一个绝佳的学习脚手架。
快来拉拽滑块,体验丝滑的排版性能吧!🚀