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)。
26 lines
789 B
JSON
26 lines
789 B
JSON
{
|
|
"compilerOptions": {
|
|
"target": "ES2022",
|
|
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
"module": "ESNext",
|
|
"moduleResolution": "bundler",
|
|
"types": ["vite/client", "node"],
|
|
"strict": true,
|
|
"noUnusedLocals": true,
|
|
"noUnusedParameters": true,
|
|
"noImplicitOverride": true,
|
|
"noFallthroughCasesInSwitch": true,
|
|
"exactOptionalPropertyTypes": true,
|
|
"isolatedModules": true,
|
|
"verbatimModuleSyntax": true,
|
|
"allowImportingTsExtensions": true,
|
|
"skipLibCheck": true,
|
|
"noEmit": true,
|
|
// The UI layer is Preact components; the render layer is still imperative DOM
|
|
// work and stays TS. Both compile out of this one config.
|
|
"jsx": "react-jsx",
|
|
"jsxImportSource": "preact"
|
|
},
|
|
"include": ["src", "test", "vite.config.ts"]
|
|
}
|