Expand description
CodeRunner 组件实现:可编辑源码 + 运行按钮 + SSE 流式输出 + xterm.js 终端。
标题栏:语言、「可运行」、改过后的「已修改 / 还原」、「圆点 + 文字」运行状态、 Vim 开关、复制与运行(窄屏把 Vim、复制、还原收进「⋯」菜单)。编辑器挂载前显示 服务端高亮好的代码。
分包边界:本文件的 CodeRunner 是外壳,留在调用方所在的包——静态代码占位、标题栏、
容器、输出区与 use_near_viewport 激活判断;激活后的编辑器 + 终端 + 执行逻辑抽成
body::code_runner_body(#[leptos::lazy]),在 <Suspense> 内经
Suspend::new(async move { code_runner_body(..).await }) 加载。外壳与分包只通过
Send + Sync 的信号通信(状态信号与命令信号,见 execution),JS 句柄全在分包里。
激活门控(P2):挂载后并不立即加载 CodeMirror、分包或创建编辑器实例;容器接近
视口(约一屏提前量),或用户点击静态代码 / 运行按钮时,才触发库加载、分包加载与
实例创建(use_near_viewport 单向激活,滚出视口不销毁)。激活前容器渲染服务端
高亮占位(highlighted,SSR 与 hydration 输出一致;.code-runner-static);用户在
编辑器就绪前点击「运行」时保留意图(pending_run),就绪后自动执行一次。
xterm 输出终端保持「输出出现后才加载」的既有门控,激活绝不触发代码执行。
输出渲染:分包在输出区的 NodeRef 元素上调用 xterm::create(...)
挂载 xterm.js 终端(输出专用,无 stdin),SSE stdout/stderr 事件实时写入。
SSE 不可用时降级到轮询 get_exec_result,整段写入终端(writeAll)。
Modules§
- body 🔒
- 激活后才加载的分包:CodeMirror 编辑器、xterm 终端与执行(SSE / 轮询)逻辑。
- execution 🔒
- 一次运行的共享状态与「命令」信号。
- state 🔒
- 运行状态:进行中三个阶段,结束后一种结果。每种状态对应标题栏的「圆点 + 文字」、 色调、输出区的说明,以及是否在输出区给出重试按钮。
Structs§
- Code
Runner Props - Props for the
CodeRunnercomponent. - Runner
Example - Fixed local output for callers that demonstrate the runner without execution.
- VimStatus
Props 🔒 - Props for the
VimStatuscomponent.
Functions§
- Code
Runner - 代码运行器组件。
- VimStatus 🔒
- Vim 状态条:当前模式与该模式下最常用的键。