mirror of
https://github.com/hectorqin/reader.git
synced 2026-11-11 05:20:54 +08:00
书架、登录、书库管理、以及阅读器的铬层(顶栏/页脚/目录/设置面板/朗读条) 从「构造函数建节点 + 实例字段 + 若干 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)。
29 lines
839 B
JSON
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"
|
|
}
|
|
}
|