用途:把章节式 Markdown 课程内容(或任何基于章节的数据集)转换成一个可运行的单页应用网站,面向课程站点这类长生命周期、可能交给非开发者的项目。
主要能力与架构约束:采用原生 HTML + JS,不使用框架、打包器、React、Vite 或 TypeScript 构建;数据与渲染分文件,course-data.js 存放 window.COURSE 对象,index.html 决定展示方式;用 localStorage 做进度、主题、缩放等持久化,无后端。
标准文件布局:index.html(单页,CSS/JS 内联)、course-data.js、可选的 instructor-data.js 与 tools-data.js、package.json(含 serve 脚本及抓取工具)、assets/、course-package/(Markdown 源与 materials/)。index.html 通过普通 script 标签按序加载数据文件,无模块导入与 fetch。
window.COURSE 结构:meta(标题、受众、总课时、days 章节列表、教室信息)、sharedCase、按 day1/day2 组织的 units(含 id、title、timeRange、goals、tasks、prompts、materials、illustrations)、跨天 materials 索引、可选 quiz。unit 的 task id 作为 localStorage 键,发布后不可重命名。
渲染管线:脚本底部为工具函数、渲染函数(renderOverview、renderSharedCase、renderDay、renderUnit、renderMaterials 等)、侧边栏与主题、init 入口。
素材路由:getMaterialUrl(name, type) 将素材名与类型映射到磁盘 URL,PDF 触发下载,其他类型新标签打开;新增素材需三处同步(文件、course-data 条目、路由规则)。
本地开发:Chrome 下 file:// 会阻止 localStorage,必须用 npx serve . 通过 HTTP 访问,package.json 中加入 "serve": "npx serve ."。
迁移与限制:从 Markdown 迁移时先解析大纲生成 day/unit 骨架,再提取 tasks、prompts、materials,生成 course-data.js 并人工核对 ID、天数与课时。状态按浏览器保存,无后端;提交任务后建议调用 static-spa-interactions 处理进度、侧边栏、主题与响应式。部分模板与参考实现细节仅在原文提供,具体内容以资料为准。