这篇只讲本项目里“ASCII艺术字生成”工具的功能层 JS。整个工具用 Vue 管理输入、字体、布局和结果状态,真正的字符画生成交给 FIGlet 完成,核心链路可以概括成:输入文本 -> 动态加载生成器 -> 加载字体 -> 生成 ASCII 艺术字 -> 复制结果。
在线工具网址:see-tool.com/ascii-art-g…
工具截图:
1)先把生成能力和页面逻辑拆开
这个工具没有把字符画逻辑直接写进页面,而是单独封装了一个浏览器助手对象,对外只暴露两部分能力:字体列表 fonts,以及生成函数 generateAscii。这样页面层只负责收集参数和更新界面,不直接处理 FIGlet 的底层调用,职责会更清晰。
在页面初始化时,Vue 会先判断浏览器环境,再按需加载这个助手脚本。如果脚本已经加载过,就直接复用,避免重复插入 script 标签。
2)动态加载 FIGlet,而不是首屏就全部注入
ASCII 艺术字依赖外部字符画引擎,但这个能力只有进入工具页后才会用到。所以实现上采用了延迟加载:先加载助手脚本,再由助手脚本继续加载 figlet.js。
这里有两个缓存点:
- 页面层缓存助手加载 Promise,避免并发重复请求
- 助手层缓存 FIGlet 加载 Promise,避免多次创建脚本节点
这样做的好处很直接:第一次进入页面时完成初始化,后续再次生成时直接复用已有实例。
3)字体列表和生成参数都在前端统一管理
工具内预置了一组 FIGlet 字体名称,页面加载完成后会把这份列表写入 Vue 状态。用户切换字体时,页面不需要重新组织复杂逻辑,只要更新 selectedFont,再触发一次生成即可。
除字体外,真正影响输出结果的还有三个参数:
text:用户输入的文本horizontalLayout:横向排版方式width:输出宽度
这些参数最终会统一传给 generateAscii,由它完成底层转换。
4)生成逻辑分成“加载字体”和“渲染文本”两步
FIGlet 不是拿到文本就能直接输出,必须先确认当前字体已经可用。所以生成函数内部先设置字体资源目录,再调用字体加载逻辑;字体准备完成后,再进入文本渲染。
真正渲染时,工具会把字体名、横向布局、输出宽度和 whitespaceBreak 一起传进去,最后得到完整的 ASCII 字符串。页面拿到结果后,只需要写回 resultText,界面就会自动刷新。
这种拆分方式的好处是,字体加载失败和文本生成失败可以分别捕获,错误提示也更准确。
5)输入变化不会立刻狂刷生成函数
为了避免用户每输入一个字符就马上触发一次重计算,页面层做了一个很轻的防抖处理。inputText、selectedFont、horizontalLayout、outputWidth 这几个状态一变化,不会立即生成,而是先进入 scheduleGenerate,延迟一小段时间后再执行。
这样处理后,连续输入、快速切换字体时,生成次数会明显减少,交互也更稳定。
6)用 requestId 解决异步结果覆盖问题
这个工具还有一个很实用的细节:每次生成前都会递增一次 requestId。异步结果返回时,只有当前请求编号仍然是最新值,结果才会写入页面。
这样可以避免一种常见问题:用户刚切换到新字体,旧请求却更晚返回,导致页面被过期结果覆盖。通过请求编号比对,最终只保留最后一次有效生成结果。
7)复制结果和空输入处理也单独收口
如果输入为空,页面不会继续生成,而是直接清空结果。复制时则统一调用剪贴板方法:有结果才复制,成功后短暂标记 copied 状态,失败就提示错误。
这部分虽然不复杂,但它保证了整个工具链路是闭环的:用户输入、生成、查看、复制,所有关键动作都由一套明确的 JS 状态驱动。
8)这类工具的核心其实是“异步流程整理”
“ASCII艺术字生成”表面上只是把文本转成字符画,真正的实现重点并不在页面展示,而在于把脚本加载、字体加载、参数变化、异步生成和结果回写这几步衔接顺。这个工具用 Vue 把状态层兜住,再把 FIGlet 封装成统一入口,最终就形成了一条比较稳定的功能链路。