摘要:这是一个 AI React 组件库项目,Monorepo + Headless UI架构。在做 AI 应用的过程中,我尝试解决流式渲染、大文件传输等特定场景下的性能问题,并探索了一种融合赛博朋克与像素风的视觉风格。目前处于早期迭代阶段,希望能抛砖引玉,期待各位大佬的建议和交流。
目前,Proton UI 还是一个正在施工中(🚧)的项目,很多代码和设计可能还不够成熟,API 也在频繁调整中。
如果您对 AI 原生交互、高性能组件设计 或者 独特的视觉风格 感兴趣,非常欢迎您来 GitHub 看看,或者在 Playground 里体验一下。
👉 GitHub: github.com/123sssdd/Pr…
(求 Star ⭐️,求 PR,求建议!)
• 🕹️ Playground:
proton-ui-playground.vercel.app
• 📚 文档: proton-ui.vercel.app
预览图:
大家好,我是 123sssdd。作为一名科研AI项目的前端开发者,在日常构建 Agent 和数据平台的项目时,我发现通用组件库虽然功能强大,但在面对 LLM 流式输出(Streaming)、GB 级大文件处理 以及 高频状态更新 等特定场景时,往往需要进行大量的定制化封装。
抱着学习、探索和“造轮子”的心态,我尝试将这些通用逻辑抽离出来,重构并开源了这套组件库 —— Proton UI。
这是一个纯个人的开源尝试,目前主要是我一个人在维护(One Man Army 🫡)。在这个过程中踩了不少坑,也积累了一些心得。发出来主要是希望能得到社区的反馈和指正,如果这些技术点能给你带来一点启发,或者愿意给个 Star ⭐️ 支持一下,那就更开心了。
🛠️ 我的技术探索与思考
在设计 Proton UI 时,我没有追求大而全,而是专注于解决 AI 应用开发中的几个“痛点”。以下是我在开发过程中的一些技术尝试:
- 🤖 AI 流式渲染的平滑处理 (Seamless Streaming)
在 AI 对话场景中,高频的 token 更新容易导致 React 组件的频繁重排重绘。 我尝试了一套 增量渲染方案:
• 渲染调度:结合 requestAnimationFrame 和 React.memo,将高频的数据流更新合并为浏览器友好的渲染帧,试图让 AI 的“打字机”效果更加丝滑。
• 状态管控:配合 SSE (Server-Sent Events) 状态机,希望能更好地控制流式数据的生命周期。
- 🧩 视觉稳定性的优化 (Virtual Completion)
流式输出时,HTML/Markdown 标签往往未闭合(例如输出到一半的 Code Block),这会导致页面布局发生剧烈的“抖动”。 为此,我尝试编写了一套 虚拟补全算法 (Virtual Completion)。它会拦截流式数据,实时检测并补全缺失的闭合标签,尽量保证在内容生成过程中,DOM 结构和布局的稳定性,减少用户的视觉干扰。
- ⚡️ 大文件上传的性能尝试
对于科研或 AI 训练场景,GB 级的原始数据上传是家常便饭。为了不阻塞 UI 主线程(Main Thread),我做了一些零拷贝的尝试:
• Web Worker 分流:将文件的 MD5 哈希计算、分片切割等 CPU 密集型任务全部移交至 Web Worker。
• Transferable Objects:利用浏览器的 Transferable 接口,在主线程和 Worker 之间转移二进制数据的所有权,实现 零拷贝通信,旨在让 UI 在处理大文件时依然保持响应。
- 📜 虚拟滚动的应用
在长对话历史记录中,渲染过多的 DOM 节点会显著降低性能。我引入了虚拟滚动(Virtual Scrolling)技术,仅渲染视口内的消息气泡,希望能在大规模上下文场景下保持列表滚动的流畅性。
- 🎨 视觉风格的个性化探索:特效系统
除了功能,我也在尝试探索一种“不一样”的视觉语言。 受赛博朋克文化的影响,我尝试构建了一套 特效系统 (Effects System):
• 像素化与复古:复刻了 CRT 扫描线纹理和点阵字体。
• 现代交互:尝试了基于物理的粒子系统和玻璃拟态(Glassmorphism)效果。这更多是我个人审美的一种实验,希望能为厌倦了常规 B 端风格的开发者提供一种新的设计思路。
🤝 诚恳期待您的建议
一个人的力量是有限的,希望能有机会和大家一起交流,共同完善这个项目!
Made with ❤️ and curiosity by 123sssdd