Files
vscode-workbench/PLANNING/PROGRESS_C-03.md
T

2.3 KiB
Raw Blame History

PROGRESS_C-03 · 在线代码运行器(JS+Python,学练一体)

日期 2026-09-13 · 范围:chunyu_project_react(纯前端沙箱,零服务端执行)

现状 vs 差距(接手时)

  • 已有:CodeRunner.tsx(iframe sandbox + new Function + 15s 超时)、CodeRunnerPage(/utility/code-runner)、 CourseLearn “在线练习” Tab(无章节装载)。
  • 缺口 vs 任务卡:非 Worker 执行、超时 15s(要求 3s)、Pyodide 打进主包(无懒加载)、 章节代码不能一键装载。

改动(src/components/CodeRunner/ + CourseLearn)

  1. worker-js.ts(新建):JS 执行 Worker(Blob 内联)。Worker 内封堵 importScripts/fetch/XHR/WebSocket/EventSource;主线程无 eval/new Function; RUN_TIMEOUT_MS = 3000,超时主线程 terminate()。
  2. pyodide-runner.ts(新建):Pyodide 0.26.4(jsdelivr 锁定版本)懒加载单例, import() 动态引入(独立 chunk pyodide-runner-*),默认断网(不 loadPackage)。
  3. CodeRunner.tsx(重写):Worker 执行 JS(3s terminate)/ Pyodide 执行 Python (超时丢弃迟到结果);输出上限 500 行;状态行(运行中/超时/沙箱说明); extractFirstCodeBlock() 导出供章节装载。
  4. CourseLearn.tsx:章节 md 载入时抽首个 ``` 代码块 → “随堂运行” Tab 显示 “装载本章代码”条,一键装入运行器;CourseLearn.css 加 .practice-snippet-bar。

安全自查(任务卡要求交 gpt-5.6-luna 审查——本环境无该模型,做同等自查)

  • worker 内无 DOM 访问(Worker 线程天然无 DOM)
  • 主线程无 eval/new Function(grep 验证:仅 worker 源码字符串内含 indirect eval)
  • Pyodide 不加载额外包(无 loadPackage 调用)
  • 超时 3s:JS terminate / Python 丢弃迟到结果
  • 无服务端执行面(后端零改动)

验证

tsc --noEmit -p tsconfig.json   # 零报错
vite build  # 成功;CodeRunner-*.js / CodeRunnerPage-*.js / pyodide-runner-*.js 独立 chunk,主包未吸入 Pyodide

手工待补(需浏览器):while(1){} 3 秒终止且页不冻;中文输出;Pyodide 首载 loading/断网降级。

状态

done(代码+自查完成;浏览器手工三例留待联调时录屏补证据)。