Initial TrueGrowth source import

This commit is contained in:
2026-07-07 09:36:36 +08:00
commit 3b6781d695
2283 changed files with 691996 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
## Context
- 当前 `apps/web` 首次访问时,入口 JS 与 CSS 体积过大,且 `Drawnix` 把聊天、AI、工具窗、同步、性能面板、任务恢复等能力一并放入首屏链路。
- 现有 Service Worker 已支持后台 precache但主要改善二次访问对首次访问帮助有限。
## Goals / Non-Goals
- Goals:
- 让用户尽快进入可操作画布
- 非核心能力改为未触发不挂载,并在 idle 或首次使用时加载
- 保留当前 SW 的 precache 机制,并新增一层空闲预取
- Non-Goals:
- 不重做白板核心交互
- 不新增用户可配置的性能开关
- 不将用户媒体或任务结果纳入 idle 预取
## Decisions
- Decision: 维持 `Drawnix` 作为对外组件,但把非核心 UI 与启动副作用挪入独立的延后层组件。
- Alternatives considered: 直接整体 `lazy(() => import('./drawnix'))`
- Why not chosen: 会把“进入画布”与“加载整套 UI”继续绑死无法精细控制首屏与延后能力边界。
- Decision: 为 `@drawnix/drawnix` 增加 `runtime` 子入口,供 `main.tsx``app.tsx` 读取启动/工作区服务。
- Alternatives considered: 继续从根 barrel 导出运行时服务
- Why not chosen: 难以稳定隔离启动服务与 UI 图谱。
- Decision: 通过 `manualChunks + idle-prefetch-manifest` 管理高频延后模块。
- Alternatives considered: 只依赖 Rollup 默认拆包
- Why not chosen: 无法稳定产出可校验、可预取的 chunk 分组。
## Risks / Trade-offs
- 非核心功能改为延后挂载后,首次点击聊天/工具/同步可能出现短暂局部 loading。
- Mitigation: 首屏可操作后使用空闲预取高频组,并在用户第一次触发前尽量提前 warmup。
- 任务恢复、自动插入画布等副作用延后后,恢复状态展示会稍晚。
- Mitigation: 统一放入 idle 启动器,确保不会阻塞进入画布,但尽早补齐状态。
- 过度拆包可能带来过多小请求。
- Mitigation: 使用稳定的手动 chunk 分组,限制为少量高价值分组。
## Migration Plan
1. 新增 OpenSpec 变更与 `startup-performance` 需求定义。
2. 拆分 `Drawnix` 壳层与延后层,迁移非核心 UI 与副作用。
3. 为 Web 入口切换到 `runtime` 子入口。
4. 为 Vite 与 SW 增加 manual chunk、idle prefetch manifest、预取消息处理与构建校验。
## Open Questions
-

View File

@@ -0,0 +1,18 @@
# Change: Refactor Startup Shell Loading
## Why
当前首次访问的主入口包和样式包过大,且 `Drawnix` 在首屏同步挂载了大量非核心 UI 与后台副作用,导致用户进入可操作画布前等待较长。
## What Changes
- 拆分首屏画布壳层与延后功能层,非核心能力改为懒挂载或 idle 启动
- 为 Web 入口新增运行时轻量导出边界,避免启动服务通过 UI barrel 进入首包
- 为构建产物新增 `idle-prefetch-manifest.json` 与手动 chunk 分组
- 为 Service Worker 增加空闲预取消息与高频懒加载资源缓存能力
- 增加构建后校验脚本,守护首屏资源边界和入口体积
## Impact
- Affected specs: `startup-performance`
- Affected code: `apps/web`, `packages/drawnix`, `apps/web/src/sw`, `scripts`

View File

@@ -0,0 +1,42 @@
## ADDED Requirements
### Requirement: 首屏只加载可进入画布所需资源
系统 SHALL 将首次进入画布所需的资源限制为 HTML、启动脚本、最小样式、白板核心渲染与当前工作区恢复。
#### Scenario: 首次打开页面进入画布
- **WHEN** 用户清空缓存后首次访问应用
- **THEN** 页面先进入可操作画布
- **AND** 聊天、AI 输入、工具窗、同步与性能面板不阻塞进入画布
### Requirement: 非核心能力必须延后挂载
系统 SHALL 将聊天、AI、工具窗、命令面板、画布搜索、同步、性能面板与相关后台副作用改为未触发不挂载或在浏览器空闲时延后启动。
#### Scenario: 首次点击非核心能力
- **WHEN** 用户首次打开聊天抽屉、项目抽屉、工具箱、同步设置、命令面板或画布搜索
- **THEN** 系统按需加载对应模块
- **AND** 加载完成后功能可正常使用
### Requirement: Service Worker 支持空闲预取高频懒加载资源
系统 SHALL 在不影响当前会话的前提下,为高频懒加载模块提供空闲预取与缓存机制。
#### Scenario: 允许空闲预取
- **WHEN** 页面已经可操作,浏览器空闲,且网络不是省流量或慢网
- **THEN** 页面可通知 Service Worker 预取高频懒加载 chunk
- **AND** Service Worker 仅缓存版本化静态资源,不缓存用户媒体或任务结果
### Requirement: 构建结果必须可校验首屏边界
系统 SHALL 产出可校验的首屏资源边界,并提供自动检查脚本防止重模块回流到首包。
#### Scenario: 构建后校验入口资源
- **WHEN** 运行构建后首屏校验脚本
- **THEN** 脚本会检查入口 HTML 直接引用的 JS/CSS 与入口脚本首屏动态导入的静态依赖链
- **AND** 每个首屏 JS/CSS 资源的未压缩体积 SHALL 不超过 500KB
- **AND** 若发现重模块 chunk 重新进入入口链路或首屏资源超出预算则返回失败

View File

@@ -0,0 +1,17 @@
## 1. Startup Shell
- [x] 1.1 为 OpenSpec 新增 `refactor-startup-shell-loading` 变更文档
- [x] 1.2 拆分 Drawnix 首屏壳层与延后功能层
- [x] 1.3 将任务恢复、自动插入、字体/视频恢复等副作用迁移到 idle 启动器
- [x] 1.4 调整 Web 入口运行时导入边界
## 2. Build & Prefetch
- [x] 2.1 配置 manual chunk 分组与 `idle-prefetch-manifest.json`
- [x] 2.2 新增 `SW_PREFETCH_GROUPS` 处理与空闲预取逻辑
- [x] 2.3 增加构建后首屏资源校验脚本
## 3. Verification
- [x] 3.1 运行 OpenSpec 校验
- [x] 3.2 运行类型检查与构建,确认入口资源边界