【开源分享】一次 AI React组件库的开源尝试:Proton UI (求指正 / 求 Star)

9 阅读4分钟

摘要:这是一个 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

预览图:

1770370015814_960x621.gif  

1770370205884_738x477.gif

1770368146214_960x621.gif  

image.png  


大家好,我是 123sssdd。作为一名科研AI项目的前端开发者,在日常构建 Agent 和数据平台的项目时,我发现通用组件库虽然功能强大,但在面对 LLM 流式输出(Streaming)、GB 级大文件处理 以及 高频状态更新 等特定场景时,往往需要进行大量的定制化封装。

抱着学习、探索和“造轮子”的心态,我尝试将这些通用逻辑抽离出来,重构并开源了这套组件库 —— Proton UI。

这是一个纯个人的开源尝试,目前主要是我一个人在维护(One Man Army 🫡)。在这个过程中踩了不少坑,也积累了一些心得。发出来主要是希望能得到社区的反馈和指正,如果这些技术点能给你带来一点启发,或者愿意给个 Star ⭐️ 支持一下,那就更开心了。

🛠️ 我的技术探索与思考

在设计 Proton UI 时,我没有追求大而全,而是专注于解决 AI 应用开发中的几个“痛点”。以下是我在开发过程中的一些技术尝试:

  1. 🤖 AI 流式渲染的平滑处理 (Seamless Streaming)

在 AI 对话场景中,高频的 token 更新容易导致 React 组件的频繁重排重绘。 我尝试了一套 增量渲染方案:

• 渲染调度:结合 requestAnimationFrame 和 React.memo,将高频的数据流更新合并为浏览器友好的渲染帧,试图让 AI 的“打字机”效果更加丝滑。

• 状态管控:配合 SSE (Server-Sent Events) 状态机,希望能更好地控制流式数据的生命周期。

  1. 🧩 视觉稳定性的优化 (Virtual Completion)

流式输出时,HTML/Markdown 标签往往未闭合(例如输出到一半的 Code Block),这会导致页面布局发生剧烈的“抖动”。 为此,我尝试编写了一套 虚拟补全算法 (Virtual Completion)。它会拦截流式数据,实时检测并补全缺失的闭合标签,尽量保证在内容生成过程中,DOM 结构和布局的稳定性,减少用户的视觉干扰。

  1. ⚡️ 大文件上传的性能尝试

对于科研或 AI 训练场景,GB 级的原始数据上传是家常便饭。为了不阻塞 UI 主线程(Main Thread),我做了一些零拷贝的尝试:

• Web Worker 分流:将文件的 MD5 哈希计算、分片切割等 CPU 密集型任务全部移交至 Web Worker。

• Transferable Objects:利用浏览器的 Transferable 接口,在主线程和 Worker 之间转移二进制数据的所有权,实现 零拷贝通信,旨在让 UI 在处理大文件时依然保持响应。

  1. 📜 虚拟滚动的应用

在长对话历史记录中,渲染过多的 DOM 节点会显著降低性能。我引入了虚拟滚动(Virtual Scrolling)技术,仅渲染视口内的消息气泡,希望能在大规模上下文场景下保持列表滚动的流畅性。

  1. 🎨 视觉风格的个性化探索:特效系统

除了功能,我也在尝试探索一种“不一样”的视觉语言。 受赛博朋克文化的影响,我尝试构建了一套 特效系统 (Effects System):

• 像素化与复古:复刻了 CRT 扫描线纹理和点阵字体。

• 现代交互:尝试了基于物理的粒子系统和玻璃拟态(Glassmorphism)效果。这更多是我个人审美的一种实验,希望能为厌倦了常规 B 端风格的开发者提供一种新的设计思路。

🤝 诚恳期待您的建议

一个人的力量是有限的,希望能有机会和大家一起交流,共同完善这个项目!

Made with ❤️ and curiosity by 123sssdd