3.6 KiB
3.6 KiB
C-03 · 在线代码运行器(JS+Python,学练一体)
| 字段 | 值 |
|---|---|
| 项目 | 可乐工具 · chunyu_project_react(主体),后端可选 |
| 优先级 | P0 · M2 |
| 建议模型 | deepseek-v4.1-flash(主)/ gpt-5.6-luna(安全审查) |
| 依赖 | 无 |
| 预估 | 3.5 天 |
一、背景(为什么做)
- 报告结论:学习模块讲编程课程却无处练代码——课程与工具割裂;"学完即练"是全竞品都没有的组合(
docs/产品问题分析与改造路线.mdP0-3)。 - 竞品:菜鸟工具 24 种语言在线编译、ToolFk 有 Online Code Compiler——但它们都是独立工具,没有与课程内容绑定。我们的差异化 = 嵌在章节页里的随堂运行。
二、目标(交付物)
MVP 技术路线(已拍板):纯前端沙箱,零服务端执行
- JS:
Web Worker沙箱执行(postMessage收发,importScripts禁用,超时terminate()) - Python:
Pyodide(WASM,浏览器内运行;懒加载,独立 chunk) - 不做服务端执行(judge0 容器留到 Phase 2 按需评审)——安全与运维成本双低。
组件交付
src/components/CodeRunner/:CodeRunner.tsx:编辑器(复用项目现有编辑器风格,如 CodeMirror/Monaco 依项目现状)+ 运行按钮 + 输出面板 + 状态行(运行中/超时/错误)worker-js.ts:JS 执行 worker(捕获 console、异常;硬超时 3s 后 terminate 并显示"执行超时")pyodide-runner.ts:Pyodide 加载(版本锁定;加载失败降级提示;执行超时同一策略)
- 集成到
CourseLearn.tsx章节页:本章节含代码示例时显示"随堂运行"面板(读章节内容里的代码块,一键装载)。 - 独立工具入口(可选加分):
/code-runner页面。 - 安全设计(交 gpt-5.6-luna 审查):
- worker 内无 DOM 访问;主线程无
eval/new Function - Pyodide 网络请求策略(默认断网:不加载额外包)
- CSP 兼容性说明
- worker 内无 DOM 访问;主线程无
三、执行步骤
1. 侦察项目现有编辑器依赖与 CourseLearn 章节数据结构(代码块字段)
2. 实现 worker-js + 超时控制(先跑通最小闭环)
3. 接入 Pyodide(懒加载 + 失败降级)
4. 集成 CourseLearn 章节页
5. 安全自查清单逐条过 → 交安全审查模型复核
6. 构建体积核对(runner chunk 懒加载,不拖累主包)
四、验收标准
- JS 代码运行并显示输出(console.log、返回值、异常信息)
- Python(Pyodide)代码运行并显示输出
- 死循环(
while(1){})3 秒内终止,页面不冻结、可继续操作 - 章节页"随堂运行"面板可用:装载本章代码 → 运行 → 看输出
- 首次加载 Pyodide 有 loading 态;失败有降级提示
- runner 相关代码全部懒加载(主包体积不增加 >10KB)
- 安全审查清单通过(审查模型签署)
五、验收命令(参考)
cd chunyu_project_react && npm run build
# 检查懒加载 chunk 分离
ls dist/assets | grep -iE "runner|pyodide"
# 浏览器手工:死循环用例、异常用例、中文输出用例
六、边界(不许做)
- 不做服务端代码执行(MVP 红线)
- 不引入重量级 IDE 依赖(不装完整 Monaco + language server;按项目现有编辑器能力办事)
- 不修改课程数据结构(只读章节内容)
- 不在 worker 里放开网络能力
七、交接
写 PROGRESS_C-03.md(含死循环终止的录屏/截图说明、安全审查结论、构建体积数据)。