Skip to main content

Module runner

Module runner 

Source
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§

CodeRunnerProps
Props for the CodeRunner component.
RunnerExample
Fixed local output for callers that demonstrate the runner without execution.
VimStatusProps 🔒
Props for the VimStatus component.

Functions§

CodeRunner
代码运行器组件。
VimStatus 🔒
Vim 状态条:当前模式与该模式下最常用的键。