我构建了一个 Streamlit 替代品,因为我讨厌“Full‑Script Reruns”(推出 Violit) 🚀

发布: (2026年2月8日 GMT+8 20:00)
6 分钟阅读
原文: Dev.to

Source: Dev.to

Cover image for 我构建了一个 Streamlit 替代品,因为我讨厌“完整脚本重新运行”(Introducing Violit) 🚀

Dope Flamingo

👋 嗨,我是一名热爱 Python 的开发者。

我是一名在行业工作的软件工程师,业余时间(晚上和周末)一直在为这个开源项目埋头苦干。

个人而言,我非常喜欢 Streamlit。它直观的语法堪称颠覆性,许多从事 AI/数据研究的朋友每天都用它来做原型。

但随着项目规模的扩大,我发现它们受到一种结构性性能问题的困扰:“完整脚本重新运行”。
每当你点击按钮时,整个 Python 脚本都会从头到尾重新执行。看到加载指示器不停旋转(或应用崩溃),让我作为开发者迫切想要解决这个问题。

我曾尝试推荐 NiceGUI 作为替代方案。它确实不错,但反馈始终如一:

“语法与 Streamlit 差别太大。”
“自定义设计(Material Design)太困难。”

于是,我决定自己动手。

“如果我能构建一个像 Streamlit 那么易用、但像 React 那么快速的工具会怎样?”

Violit 就这样诞生了。

💜 Violit 背后的哲学

Violit 基于 FastAPIShoelace (Web Components) 构建。我的架构目标很明确:

  • 细粒度响应式: 当数据变化时,仅更新特定组件。无需整页重新运行。
  • 零学习曲线: 如果你会使用 Streamlit,应该能在 10 分钟内上手 Violit。
  • 默认美观: 你不需要了解 CSS 就能让界面好看。只需设置 theme="cyberpunk"

🔥 展示代码

Violit 继承了 Streamlit 的开发者体验。您无需了解复杂的 callbacksuseEffect。您的 Python 代码流程即成为 UI。

import violit as vl

app = vl.App(title="Violit Demo")

# State declaration (similar to React's useState or SolidJS signals)
count = app.state(0)

# Clicking the button updates ONLY the `count` variable.
# No full script rerun happens.
app.button("Increment", on_click=lambda: count.set(count.value + 1))

# When `count` changes, only this text component updates.
app.text("Current Count:", count)

app.run()

进入全屏模式退出全屏模式

⚡ 基准测试:Streamlit vs. Violit

因为 Violit 使用 细粒度响应式,当状态变化时,它不需要重新读取数据或重新渲染整个 DOM。

大型数据集的渲染速度

数据点Streamlit 渲染Violit 渲染
100 K~62 ms~14 ms
500 K~174 ms~20 ms
1 M~307 ms~24 ms

Benchmark chart 1

Benchmark chart 2

正如您所见,即使在大型数据集下,Violit 也几乎没有性能下降,因为它绕过了繁重的重新运行循环。

初始图表加载速度(500 万数据点)

下面的比较展示了使用 500 万生成数据点绘制图表的渲染情况(上:Streamlit,下:Violit)。

5 M points benchmark

与 Streamlit 相比,Violit 显示出显著更快的应用启动速度。

🎨 20+ 主题,只需一行代码

“美学是一种特性。”

Violit 附带超过 20 种预设主题,涵盖 bootstrapcyberpunkvaporwave 等风格。

主题示例

Bootstrap

Bootstrap 主题

Dracula

Dracula 主题

手绘

手绘 主题

您可以仅通过一个参数切换整个应用的外观,例如:

app = vl.App(title="My App", theme="cyberpunk")

🌐 “我用 Violit 构建了 Violit 网站…”

说得容易。为了证明 Violit 已经可以投入生产(MVP),我 完全使用 Violit 构建了官方着陆页和文档

它支持 混合渲染(大流量使用 HTMX,实时交互使用 WebSocket),甚至可以通过 pywebview 实现 桌面模式

Violit 的目标不仅仅是另一个 Streamlit 替代品。我们的愿景是让开发者能够 完全用 Python 构建完整的 Web 服务(MVP)

🙏 试试看吧!

我正在公开开发中,当前版本为 v0.1.11。虽然仍处于早期阶段,但来自 Reddit 和社区的反馈非常惊喜。

如果你在寻找比 Streamlit 更快的仪表盘或 AI 演示替代方案,请尝试一下并告诉我你的感受!

感谢阅读!祝编码愉快。 💜

0 浏览
Back to Blog

相关文章

阅读更多 »