恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Streamlit 新功能实现指南:从 Protobuf 到 E2E 的完整开发流程
首页
资讯中心
/
Streamlit 新功能实现指南:从 Protobuf 到 E2E 的完整开发流程
Streamlit 新功能实现指南:从 Protobuf 到 E2E 的完整开发流程
发布时间:2026/9/19 17:44:01
Streamlit 新功能实现指南从 Protobuf 到 E2E 的完整开发流程【免费下载链接】streamlitStreamlit — A faster way to build and share data apps.项目地址: https://gitcode.com/gh_mirrors/st/streamlit本指南面向需要在 Streamlit 仓库中新增或修改功能的开发者完整梳理了新功能落地的标准流程从 Protobuf 协议定义、后端st.*命令实现到前端元素渲染、四层测试覆盖再到格式化与最终校验。读者读完本指南后将能按官方推荐的实施顺序独立完成一个跨后端、前端、协议与测试的完整功能开发并理解每一步背后的源码依据与仓库约定。背景先理解 Streamlit 的运行时架构新增任何功能之前建议先通读仓库内置的架构入门材料 understanding-streamlit-architecture skill。该 skill 系统讲解了四个核心主题Backend runtimelib/streamlit/下的 Python 运行时负责执行用户脚本、管理会话状态Frontend renderingfrontend/下的 React 前端负责将后端推送的元素树渲染为 UIWebSocket communication前后端之间通过 WebSocket 双向通信后端推送增量delta更新Element tree元素树是前后端共享的数据结构其字段定义由 Protobuf 描述是前后端契约的载体。理解这四部分后你就会明白为什么几乎所有新功能都需要同时在三个区域落地后端lib/streamlit/、前端frontend/、协议proto/——三者分别对应元素如何产生元素如何渲染与元素如何描述。新功能的三个实现区域与测试覆盖要求一个功能在代码层面通常需要触及三个区域并在四个测试层级中留下验证区域路径职责后端lib/streamlit/定义st.*命令、生成元素 delta前端frontend/将元素 delta 渲染为 React 组件协议proto/定义元素数据结构.proto配套测试覆盖Python 单元测试放在lib/testsPython 类型测试公共st.*命令需在lib/tests/streamlit/typing/下增加静态类型断言mypy / ty 的assert_typeVitest 单元测试前端组件的单元测试E2E Playwright 测试放在e2e_playwright/用于端到端验证真实浏览器中的行为。其中类型测试目录在 lib/tests/streamlit/typing/README.md 中有明确说明该目录下的文件是公共 API 的静态类型检查测试由make python-types用 mypy 和 ty 检查不是由 pytest 执行。它专门用于验证涉及 TypeVar、overload 等复杂类型逻辑时推断结果是否正确弥补行为测试对静态类型覆盖不足的问题。因此为公共st.*命令新增类型测试文件时需遵循该 README 中的约定故意的非法调用使用# type: ignore[...]mypy和# ty: ignore[...]ty标注若合法的调用被 ty 拒绝可用# ty: ignore[type-assertion-failure]抑制并附注 ty 的推断结果。标准实施顺序九步流程第 1 步Protobuf 变更先在proto/中修改协议定义然后运行make protobuf重新生成前后端的绑定代码。新增元素类型将新字段加入proto/streamlit/proto/Element.proto中消息的oneof element联合。例如仓库中Html html 54;、Skeleton skeleton 52;等就是通过这种方式注册进元素树的见 Element.proto。Makefile 中的make protobuf目标第 106 行起做了两件事校验 protoc 版本要求系统安装了protoc且版本不低于MIN_PROTOC_VERSION否则直接报错退出生成 Python 与前端绑定通过uv run protoc --proto_pathproto --python_outlib --mypy_outlib proto/streamlit/proto/*.proto生成 Python 代码同时带 mypy stub随后在前端执行yarn workspace streamlit/protobuf run generate-protobuf生成 JS/TS 绑定若frontend/node_modules不存在会先自动执行make frontend-init。make init目标python-init frontend-init protobuf会一次性完成依赖安装与协议生成适合初始化开发环境。第 2 步后端实现在lib/streamlit/中实现功能逻辑新增元素在lib/streamlit/__init__.py中导出对应的公共命令公共st.*命令使用gather_metrics装饰器包裹用于采集使用指标。注意该装饰器只用于公共 API不要用于内部辅助函数。lib/streamlit/__init__.py中从streamlit.runtime.metrics_util导入gather_metrics并以此装饰了get_option、set_option等公共入口见 lib/streamlit/init.py由于gather_metrics与配置存在循环依赖get_option等在装饰时还注释了config 中的 gather_metrics 会导致循环依赖这一细节。第 3 步Python 单元测试与类型测试编写 Python 单测放在lib/tests并运行uv run pytest lib/tests/streamlit/the_test_name.py新增元素将元素实例加入lib/tests/streamlit/element_mocks.py该文件是元素 mock 的集中注册表。从源码结构看它按三类组织见 element_mocks.pyWIDGET_ELEMENTS交互型组件button、checkbox、selectbox、data_editor、pagination 等NON_WIDGET_ELEMENTS展示型元素header、markdown、html、dataframe、各类图表、mermaid_chart 等CONTAINER_ELEMENTS容器型元素container、expander、tabs、dialog、skeleton 等。每个元素以(名称, lambda 调用)的元组形式注册便于测试统一遍历。例如(mermaid_chart, lambda: st.mermaid_chart(graph LR\n A -- B))。公共st.*命令在lib/tests/streamlit/typing/下新增或更新command_types.py使用 mypy 与 ty 的assert_type做静态类型断言注意这不是 pytest 测试而是由make python-types驱动的类型检查。第 4 步前端实现在frontend/中实现 UI新增元素将元素类型注册到frontend/lib/src/components/core/Block/ElementNodeRenderer.tsx该文件是元素类型到 React 组件的分发器。新增元素需要在此处把协议中的元素类型映射到对应的渲染组件前端才会真正把后端推送的元素树渲染出来。第 5 步Vitest 单元测试为前端组件编写*.test.tsx测试并在frontend/目录下运行cd frontend yarn test lib/src/components/elements/NewElement/NewElement.test.tsxVitest 测试覆盖组件渲染逻辑确保 UI 行为在无浏览器环境下即可验证。第 6 步E2E Playwright 测试在e2e_playwright/下编写端到端测试运行make run-e2e-test e2e_playwright/name_of_the_test.py从 Makefile 中run-e2e-test目标第 579 行起可以看到该命令的约定与细节文件名必须包含_test否则命令直接报错退出例如st_button_test.py实际执行的是cd e2e_playwright uv run pytest 脚本 --tracing retain-on-failure --reruns 0若实现涉及前端改动测试前需先运行make frontend-fast让前端构建生效失败时测试产物trace 等保存在e2e_playwright/test-results。e2e_playwright/目录内已按主题组织了大量测试样例如st_button_test.py、st_text_input_test.py、widget_state_test.py新测试可以参考这些既有文件的应用页*.py与测试页*_test.py配对模式应用页调用被测 API测试页驱动浏览器断言渲染结果。第 7 步自动修复格式与 lintmake autofixautofix目标Makefile 第 804 行起依次执行Python 侧ruff check --fix与make python-format前端侧frontend-init、frontend-format、yarn lint:fix、yarn knip --fix --allow-remove-files随后yarn dedupe去重yarn.lock并运行make update-notices与 pre-commit 的手动阶段修复其中不可自动修复的错误会继续执行而不中断。第 8 步整体校验make checkcheck目标Makefile 第 651 行起是提交前的最终门禁只针对变更文件运行以提升效率。它通过scripts/get_changed_files.py收集变更文件并并行执行前端格式oxfmt、lintoxlint eslint、依赖检查knip、类型检查tsc、测试vitestPythonlint 与格式ruff、类型检查ty mypy其中lib/streamlit/.agents/下的模板因模块名重复与包根解析问题需要以MYPYPATHlib逐模板单独跑 mypy、单元测试可选 E2E设置E2E_CHECKtrue时还会并行运行变更涉及到的 e2e 测试可用FAST_CHECKtrue跳过 mypy、frontend-types 与单元测试以加快本地迭代。全部通过后输出 All checks passed! 。第 9 步同步内置 Agent Skills面向用户的功能对于面向终端用户的新功能还需要更新lib/streamlit/.agents/skills/下的内置 Agent Skills具体规范遵循 lib/streamlit/.agents/skills/AGENTS.md。这一步确保基于 Agent 的开发工具如该仓库的.claude/skills与.agents/skills体系能识别并正确使用新功能是仓库AI 友好开发链路的最后一环。实施顺序速查表步骤区域操作验证命令1proto/修改 .proto新元素进Element.protomake protobuf2lib/streamlit/实现st.*新元素进__init__.py公共 API 加gather_metrics—3lib/tests单元测试 element_mocks.pytyping/command_types.pyuv run pytest lib/tests/streamlit/the_test_name.py4frontend/注册ElementNodeRenderer.tsx渲染映射—5frontend/Vitest 单测cd frontend yarn test ....test.tsx6e2e_playwright/Playwright E2E文件名须含_testmake run-e2e-test e2e_playwright/name_of_the_test.py7全局自动修复make autofix8全局变更文件全量校验可选E2E_CHECKtruemake check9lib/streamlit/.agents/skills/同步内置 Agent Skills面向用户功能参照lib/streamlit/.agents/skills/AGENTS.md常见注意事项先改协议再生成make protobuf同时产出 Python含 mypy stub与 JS/TS 绑定若只改 .proto 而不重新生成前后端拿到的将是不一致的契约gather_metrics只用于公共 API内部辅助函数不应被装饰避免指标污染与不必要的性能开销E2E 失败先检查前端构建E2E 使用构建产物运行前端改动未执行make frontend-fast时会出现改了代码但测试仍用旧构建的假象类型测试与单元测试是两套体系lib/tests/streamlit/typing/由make python-types驱动mypy/ty不会被 pytest 收集执行新增公共命令时两者都需要覆盖提交前务必跑make check它按变更文件精准校验比全量 lint 更快能拦截大多数格式、类型与单测问题。按照上述九步流程即可在 Streamlit 仓库中规范、可验证地完成一个新功能的端到端开发从协议契约到用户可见 UI 再到自动化测试形成完整闭环。【免费下载链接】streamlitStreamlit — A faster way to build and share data apps.项目地址: https://gitcode.com/gh_mirrors/st/streamlit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考