Files
SpineWallpaper/docs/adr/0002-preset-as-es-module.md
Shuery 3f11426964 feat: TS 构建管线、Spine 抓取器与 wallpapers/ 唯一真相来源
把项目从「手写 dist/」改成「wallpapers/ 是唯一真相来源,dist/ 由 pnpm build 生成」,
并补上配套的类型、门禁与抓取器。一次提交落地整条管线,因为拆开会留下不能构建的中间态。

- src/:运行时与模拟器源码(TS,strict),编译到 build/ 再拷进各分发
- tools/:build / dev / check-{syntax,paths,dist},以及抓取器与回归门禁 tools/checks/
  (.scratch/ 下那批一次性脚本移入 tools/checks/ 并入库为长期门禁)
- wallpapers/:七档壁纸的源数据 + README.md(id/音频/预设的完整规范)
- docs/adr/0005-0008:构建管线与分发拓扑、模拟器契约、自包含 sim、每骨架资源布局
- .gitignore:排除 .scratch/ 的参考资料副本(上游 spine 整仓克隆 ~1.2 GB、
  抓取侦查数据 ~680 MB)与调试转储;这些是本地调查材料,补偿会让仓库无法克隆
- 归一化 .gitignore/CONTEXT.md 行尾(工作区 CRLF、索引 LF 造成的整文件假 diff)

同时修掉三档卡住构建的未完工壁纸:
- kv45 的 meta.json 里 id 还是抓取期场景名 scene_main,经 downloader promote 正名为 kv45
- shajin / zhigengniao_juheye 的 meta.json 误用了骨架描述文件(name/spine/animations/pages)、
  且都缺 preset.template.json;现按规范重建:骨架沉到 spines/<名>/(spine-ts 按 atlas 所在
  目录解析贴图页)、补上元数据与单骨架预设,并清掉 zhigengniao 骨架里指向作者机的绝对路径
- 顺带 promote 已在 sources.yml 里的 kv46(月升之前,与兽共舞)

pnpm check 五道门全绿:10 个分发 / 7 档壁纸 / 141 处引用自包含。
2026-10-02 01:27:02 +08:00

19 lines
2.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 预设用 ES module 而不是 JSON
每档壁纸的 `preset.js` 是 `export default {...}` 的 ES module,而不是由 `fetch` 拉取的 `preset.json`。
理由是资源路径的自包含性:模块内用 `import.meta.url` 推导 `./images/...` 的绝对 URL,于是整个壁纸目录可以被复制、改名、搬家而不需要改任何一行路径。若用 JSON,路径只能以**页面**为基准写死,一旦目录改名(本项目的目录名就是显示名,改标题=改目录)就会全站 404,且每档壁纸都必须先异步取回 JSON 才能建播放器,给启动时序又加一个竞态点。
代价:配置文件不再是纯数据,不能直接 `JSON.parse` 消费。本项目接受这一点——预设数据量极小,且始终由代码持有。
## 修订(2026-09,随 TS 构建管线)
**结论不变:产物仍然是 `preset.js`,仍然用 `import.meta.url` 推导路径。** 但当初拒绝 JSON 的两条理由里有一条已经不成立,需要更正:
- ~~"目录名就是显示名,改标题=改目录"~~ —— 目录名已改为**稳定的 id**(见 ADR 0005),显示名只存在于元数据与 `project.json` 里,改标题不再需要碰目录。这条理由作废。
- "以页面为基准写死路径会在改名后 404" —— 仍然成立,且仍然是不用 `fetch` + JSON 的理由:JSON 里的路径只能相对**页面**解析,而 `preset.js` 能相对**自己**解析,后者才能在合集分发里按深度现算(单档 `./audios/`、游戏合集 `../audios/`、全部合集 `../../audios/`)。
- "异步取 JSON 会给启动时序再加一个竞态点" —— 仍然成立。
**新增的写法约定**:`preset.js` 不再手写,而是由 `pnpm build` 从 `preset.template.json`(**JSON,路径相对壁纸目录**)生成。也就是说"用 JSON 写、生成成 ES module"——两条路的好处各取一半:编辑期是纯数据(可 diff、可校验、好工具化),运行期仍是自包含的 ES module。