Files
reader/web/package.json
T
CodeBuddy 586bec25b1 refactor(web): 界面层迁移到 Preact,排版层保持命令式
书架、登录、书库管理、以及阅读器的铬层(顶栏/页脚/目录/设置面板/朗读条)
从「构造函数建节点 + 实例字段 + 若干 render*()」改成组件树 + 单一状态。
阅读舞台——分页、注入文档、shadow root、量测列宽——仍然零框架。

为什么换:
- 同一份状态有多个副本。分段控件的选中态既在 settings 又在 aria-pressed 上,
  靠点击处理器手工同步;LoginScreen 的通知/错误/注册开关/按钮文案是四个节点
  被五个地方改,漏一处不报错。
- 重建与状态互相矛盾。朗读引擎行要在 HTTP 能力探测回来时重新生成,而整块
  面板重建会丢掉面板滚动位置,于是长出一套「只替换 [data-speech=group]」
  的定点重建;改成组件后探测只是改状态,diff 天然保住滚动位置。

边界(写在 ReaderScreen 里,不靠自觉):
- stage 由类持有并交给 ReaderView,只通过 ref 回调挂进组件树;组件决定它
  放在哪,内容一概不碰。mountUI() 是组件树与类式屏幕之间唯一的接缝,
  路由仍不认识框架,测试仍打在真实 DOM 上。

配套:
- toolkit.tsx:IconButton / Button / Segmented / SwitchRow / Scrim 这些原语
  各把 a11y 与状态细节收在一处,消掉两处手工 aria-pressed 同步。
- vendor/preact.ts:框架唯一入口,只 re-export preact 与 preact/hooks,
  无 preact/compat、无 react-dom、无额外 signals 依赖。
- tsconfig: jsx=react-jsx, jsxImportSource=preact。
- 修一处回归:书库管理的状态行改由 listing 推导,写入结果跨重载保留。

验证:web 全量 260 项测试通过(manager.test.ts 断言逻辑未改),
typecheck、build、android check-shell.sh、build-web-assets.sh 均通过。
产物 235KB → 245KB(gzip 71.2KB → 77.2KB)。
2026-09-17 17:52:18 +08:00

29 lines
839 B
JSON

{
"name": "reader-client",
"version": "0.1.0",
"private": true,
"description": "Reader client: shared rendering layer for the H5 build and the Android WebView shell.",
"license": "AGPL-3.0-or-later",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc -p tsconfig.json --noEmit && vite build",
"typecheck": "tsc -p tsconfig.json --noEmit",
"test": "vitest run && tsx --test test/api.test.ts test/asset-url.test.ts test/paginator.test.ts test/window.test.ts test/windowed-toc.test.ts",
"test:watch": "vitest"
},
"dependencies": {
"jszip": "^3.10.1"
},
"devDependencies": {
"@types/jsdom": "^30.0.0",
"@types/node": "^22.20.3",
"jsdom": "^30.0.1",
"preact": "^10.29.8",
"tsx": "^4.19.2",
"typescript": "^5.7.3",
"vite": "^6.0.7",
"vitest": "^2.1.8"
}
}