@italone/solace 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/readme.md ADDED
@@ -0,0 +1,632 @@
1
+ # Solace
2
+
3
+ Solace is a TypeScript-first frontend framework created by alone.
4
+
5
+ 当前仓库已经包含可运行的框架核心、Rollup 包构建、Vite 示例、Vitest 单元/集成测试和 Playwright e2e 测试。框架支持响应式状态、VNode 渲染、DOM diff、函数式组件、默认 slots、异步组件、事件、生命周期、轻量 store、插件安装与 app-level provide API、JSX runtime 和 package exports。
6
+
7
+ ## 快速开始
8
+
9
+ ```bash
10
+ pnpm install
11
+ pnpm quality
12
+ pnpm test:e2e
13
+ ```
14
+
15
+ 发布前完整检查:
16
+
17
+ ```bash
18
+ pnpm release:check
19
+ ```
20
+
21
+ 运行示例:
22
+
23
+ ```bash
24
+ pnpm dev
25
+ pnpm exec vite examples/todo-app --host 127.0.0.1 --port 5175
26
+ pnpm exec vite examples/large-list --host 127.0.0.1 --port 5176
27
+ ```
28
+
29
+ 最小用法:
30
+
31
+ ```ts
32
+ import { createApp, h, reactive } from "@italone/solace";
33
+
34
+ const state = reactive({ count: 0 });
35
+
36
+ const App = () =>
37
+ h(
38
+ "button",
39
+ {
40
+ onClick: () => {
41
+ state.count += 1;
42
+ },
43
+ },
44
+ `count: ${state.count}`,
45
+ );
46
+
47
+ createApp(App).mount(document.querySelector("#app") as Element);
48
+ ```
49
+
50
+ ## 当前能力
51
+
52
+ - 响应式:`reactive`、`effect`、`computed`、`ref`、`watch`、`watchEffect`。
53
+ - 渲染:`h`、`render`、VNode、props patch、children diff、Fragment。
54
+ - 组件:函数式组件、props、emit、默认 slots、named slots、slot props、异步组件(loading/error、delay/timeout、retry)、生命周期、provide/inject、组件 effect 调度与卸载清理。
55
+ - 事件:`onXxx` 事件绑定、handler 更新、invoker 缓存和卸载清理。
56
+ - 状态管理:`createStore`,支持 state、computed getters、显式 context actions。
57
+ - 插件:`app.use(plugin, ...options)` 和 `app.provide(key, value)`,支持函数插件、对象插件和 app-level 注入值。
58
+ - JSX:`@italone/solace/jsx-runtime`、`@italone/solace/jsx-dev-runtime`。
59
+ - 包构建:ESM、CJS、类型声明和 package exports。
60
+ - 示例:basic counter、todo app、large list。
61
+ - 发布门禁:`pnpm release:check`、format check、coverage thresholds、package consumer smoke、jsdom benchmark smoke、Chromium production browser benchmark、browser e2e、Changesets versioning。
62
+
63
+ 更多示例说明见 [`docs/examples.md`](./docs/examples.md)。DevTools public subpath 和安全边界见
64
+ [`docs/devtools.md`](./docs/devtools.md)。
65
+
66
+ ## 设计背景
67
+
68
+ 下面保留项目初始方案和长期规划,作为后续演进参考。
69
+
70
+ ## 2. 项目目标
71
+
72
+ 本项目计划创建一个全新的前端自研开发框架,正式命名为 `Solace`。该框架面向现代 Web 应用开发,目标是提供轻量、高性能、类型友好、可扩展的组件化开发体验。
73
+
74
+ ### 2.1 框架命名
75
+
76
+ 框架名称:`Solace`
77
+
78
+ 正式描述:
79
+
80
+ > Solace is a TypeScript-first frontend framework created by alone.
81
+
82
+ 命名来源:
83
+
84
+ - `Solace` 的发音和语义与 `Solo`、`Alone` 有关联,保留了开发者 `alone` 的个人创作属性,但避免直接使用 `AloneTS` 这类偏练习项目或工具包风格的名称。
85
+ - `Solace` 作为正式框架名更稳重、简洁,适合用于前端框架、渲染引擎和长期维护的开源项目。
86
+ - TypeScript 是本框架的核心语言,因此用 `TypeScript-first` 作为副标题表达技术定位,而不是把 `TS` 直接放进名称中。
87
+ - 前端定位通过 `frontend framework` 明确表达,后续可自然扩展为 `Solace Core`、`Solace Renderer`、`Solace DevTools`、`Solace Vite Plugin` 等子模块命名。
88
+
89
+ 核心目标:
90
+
91
+ - 使用 TypeScript 4.5+ 作为主要开发语言,推荐在项目初始化时使用 TypeScript 5.x。
92
+ - 支持 ES6+ 现代 JavaScript 能力,包括 `async/await`、`Proxy`、`Reflect`、`WeakMap`、`Map`、`Set` 等。
93
+ - 提供原创实现的响应式系统、组件系统、虚拟 DOM 渲染器、事件系统和调度器。
94
+ - 默认使用 Vite 作为开发和示例构建工具,框架包构建兼容 Rollup,必要时提供 Webpack 接入示例。
95
+ - 支持 Tree Shaking、代码分割、类型声明文件输出和 ESM/CJS 双格式产物。
96
+ - 提供单元测试、集成测试、性能基准测试和性能回归测试。
97
+
98
+ 重要说明:性能指标在项目早期应作为目标和验收标准,不应在没有真实基准数据前宣称已经超过 React、Vue 或 Svelte。
99
+
100
+ ## 3. 技术选型
101
+
102
+ ### 3.1 语言与运行环境
103
+
104
+ - TypeScript:核心源码、类型定义和测试全部使用 TypeScript。
105
+ - ECMAScript target:建议产物目标为 `ES2018` 或更高,源码可使用 ES2020+ 语法。
106
+ - Node.js:当前包声明支持 `^20.19.0 || >=22.12.0`,建议本地开发和 CI 使用 Node 22。
107
+ - 包管理器:推荐使用 `pnpm`,便于后续扩展 monorepo、examples 和 packages。
108
+
109
+ ### 3.2 构建工具
110
+
111
+ - Vite:用于开发服务器、示例应用、热更新和文档站预览。
112
+ - Rollup:用于框架核心包构建,输出 ESM、CJS 和类型声明。
113
+ - Webpack:不作为默认构建器,但提供兼容示例和集成说明。
114
+ - esbuild:作为 Vite 内部转译工具,也可用于开发阶段快速构建。
115
+
116
+ ### 3.3 测试工具
117
+
118
+ - Vitest:单元测试和集成测试。
119
+ - Playwright:浏览器级渲染、事件、交互和回归测试。
120
+ - Benchmark.js 或 tinybench:微基准测试。
121
+ - jsdom:用于部分 DOM 行为的快速测试。
122
+ - c8 或 Vitest coverage:覆盖率统计。
123
+
124
+ ### 3.4 代码质量工具
125
+
126
+ - ESLint:TypeScript 代码质量检查。
127
+ - Prettier:统一代码格式。
128
+ - Husky + lint-staged:提交前检查。
129
+ - Changesets:版本发布和变更记录。
130
+ - GitHub Actions:CI 中执行 format check、typecheck、lint、测试、package exports、coverage、package smoke、benchmark smoke 和 e2e。
131
+
132
+ ## 4. 项目结构规划
133
+
134
+ 建议初始化后的目录结构如下:
135
+
136
+ ```text
137
+ .
138
+ ├── docs/
139
+ │ ├── architecture.md
140
+ │ ├── api.md
141
+ │ ├── performance.md
142
+ │ └── examples.md
143
+ ├── examples/
144
+ │ ├── basic-counter/
145
+ │ ├── todo-app/
146
+ │ └── large-list/
147
+ ├── packages/
148
+ │ ├── core/
149
+ │ │ ├── src/
150
+ │ │ │ ├── component/
151
+ │ │ │ ├── event/
152
+ │ │ │ ├── reactivity/
153
+ │ │ │ ├── renderer/
154
+ │ │ │ ├── scheduler/
155
+ │ │ │ ├── shared/
156
+ │ │ │ └── vnode/
157
+ │ │ └── package.json
158
+ │ ├── compiler/
159
+ │ │ └── src/
160
+ │ ├── devtools/
161
+ │ │ └── src/
162
+ │ └── vite-plugin-solace/
163
+ │ └── src/
164
+ ├── tests/
165
+ │ ├── unit/
166
+ │ ├── integration/
167
+ │ ├── e2e/
168
+ │ └── performance/
169
+ ├── config/
170
+ │ ├── eslint/
171
+ │ ├── rollup/
172
+ │ └── tsconfig/
173
+ ├── package.json
174
+ ├── pnpm-workspace.yaml
175
+ ├── tsconfig.base.json
176
+ ├── vitest.config.ts
177
+ └── README.md
178
+ ```
179
+
180
+ 如果第一阶段只实现核心框架,也可以先采用单包结构:
181
+
182
+ ```text
183
+ .
184
+ ├── src/
185
+ │ ├── component/
186
+ │ ├── event/
187
+ │ ├── reactivity/
188
+ │ ├── renderer/
189
+ │ ├── scheduler/
190
+ │ ├── shared/
191
+ │ └── vnode/
192
+ ├── tests/
193
+ ├── examples/
194
+ ├── docs/
195
+ ├── package.json
196
+ └── README.md
197
+ ```
198
+
199
+ ## 5. 核心架构设计
200
+
201
+ ### 5.1 总体分层
202
+
203
+ 框架核心建议拆分为以下层次:
204
+
205
+ 1. Shared 层:基础工具、类型工具、错误码、开发环境警告、不可变常量。
206
+ 2. Reactivity 层:响应式对象、依赖收集、变更触发、计算属性和副作用管理。
207
+ 3. Scheduler 层:任务队列、批处理、微任务调度、`requestAnimationFrame` 协调。
208
+ 4. VNode 层:虚拟节点结构、节点标记、子节点归一化和 patch flags。
209
+ 5. Renderer 层:挂载、更新、卸载、diff、DOM 操作抽象。
210
+ 6. Component 层:组件实例、props、slots、生命周期、上下文和通信。
211
+ 7. Event 层:事件绑定、事件委托、自定义事件和冒泡处理。
212
+ 8. Compiler 层:模板解析、AST 转换、代码生成或 JSX 转换接入。
213
+ 9. Plugin 层:插件注册、全局能力扩展、开发工具扩展点。
214
+
215
+ ### 5.2 数据流
216
+
217
+ 典型更新流程:
218
+
219
+ ```text
220
+ state mutation
221
+ -> dependency trigger
222
+ -> effect scheduling
223
+ -> component update job
224
+ -> render function returns vnode tree
225
+ -> diff old vnode and new vnode
226
+ -> patch real DOM
227
+ -> lifecycle hooks and post effects
228
+ ```
229
+
230
+ 关键原则:
231
+
232
+ - 响应式系统只负责依赖追踪和通知,不直接操作 DOM。
233
+ - 调度器统一处理批量更新,避免同一组件在同一 tick 中重复渲染。
234
+ - 渲染器只消费 VNode 和 DOM 宿主操作,方便未来扩展到非 DOM 平台。
235
+ - 组件系统维护实例状态、生命周期和组件边界。
236
+
237
+ ## 6. 核心模块设计
238
+
239
+ ### 6.1 响应式系统
240
+
241
+ 目标能力:
242
+
243
+ - 基于 `Proxy` 实现对象、数组、Map、Set 的响应式代理。
244
+ - 基于 `WeakMap -> Map -> Set` 建立依赖索引。
245
+ - 支持 `effect`、`computed`、`watch` 和 `watchEffect`。
246
+ - 支持嵌套对象懒代理,避免初始化阶段深度遍历带来的额外开销。
247
+ - 支持批处理更新和 effect 清理,避免重复依赖和内存泄漏。
248
+
249
+ 核心 API 草案:
250
+
251
+ ```ts
252
+ const state = reactive({ count: 0 });
253
+
254
+ effect(() => {
255
+ console.log(state.count);
256
+ });
257
+
258
+ const doubled = computed(() => state.count * 2);
259
+ ```
260
+
261
+ ### 6.2 虚拟 DOM 与 Diff
262
+
263
+ 目标能力:
264
+
265
+ - 支持元素节点、文本节点、Fragment、组件节点和 Portal 扩展点。
266
+ - 支持 keyed 和 non-keyed children diff。
267
+ - 对常见路径做快速比较:相同前缀、相同后缀、纯新增、纯删除。
268
+ - keyed diff 中使用最长递增子序列减少 DOM 移动次数。
269
+ - 支持静态节点跳过、patch flags 和 block tree 优化。
270
+
271
+ VNode 草案:
272
+
273
+ ```ts
274
+ interface VNode {
275
+ type: string | ComponentType | symbol;
276
+ props: Record<string, unknown> | null;
277
+ key: string | number | null;
278
+ children: VNode[] | string | null;
279
+ shapeFlag: number;
280
+ patchFlag?: number;
281
+ el?: Node | null;
282
+ }
283
+ ```
284
+
285
+ ### 6.3 组件系统
286
+
287
+ 目标能力:
288
+
289
+ - 支持函数式组件和类组件。
290
+ - 支持 `mount`、`update`、`unmount` 生命周期。
291
+ - 支持 props、slots、emit、provide/inject。
292
+ - 支持错误边界和开发环境调试提示。
293
+ - 支持组件间通信,同时避免隐式全局状态滥用。
294
+
295
+ 函数式组件示例:
296
+
297
+ ```ts
298
+ import { h, reactive } from "@italone/solace";
299
+
300
+ export function Counter() {
301
+ const state = reactive({ count: 0 });
302
+
303
+ return () => h("button", { onClick: () => state.count++ }, `count: ${state.count}`);
304
+ }
305
+ ```
306
+
307
+ ### 6.4 渲染器
308
+
309
+ 目标能力:
310
+
311
+ - 提供平台无关的 renderer factory。
312
+ - 默认实现 DOM renderer。
313
+ - 支持异步渲染队列和 `requestAnimationFrame` 优化。
314
+ - 支持卸载阶段资源清理,包括事件、effect、ref 和组件实例。
315
+
316
+ 宿主操作接口草案:
317
+
318
+ ```ts
319
+ interface HostOps {
320
+ createElement(type: string): Element;
321
+ createText(text: string): Text;
322
+ insert(child: Node, parent: Node, anchor?: Node | null): void;
323
+ remove(child: Node): void;
324
+ setText(node: Node, text: string): void;
325
+ patchProp(el: Element, key: string, prev: unknown, next: unknown): void;
326
+ }
327
+ ```
328
+
329
+ ### 6.5 事件系统
330
+
331
+ 目标能力:
332
+
333
+ - 统一处理原生事件和自定义事件。
334
+ - 对高频事件提供委托机制。
335
+ - 支持事件修饰能力,例如 once、capture、passive、stop、prevent。
336
+ - 支持组件 emit 和父组件监听。
337
+ - 在卸载时自动移除事件引用,降低泄漏风险。
338
+
339
+ ### 6.6 状态管理
340
+
341
+ 第一阶段可以内置轻量 store,避免过早设计复杂生态。
342
+
343
+ 目标能力:
344
+
345
+ - 支持集中式状态、派生状态和 action。
346
+ - 支持模块化 store。
347
+ - 与响应式系统共享依赖追踪能力。
348
+ - 提供开发环境快照和变更日志扩展点。
349
+
350
+ ### 6.7 编译与 JSX
351
+
352
+ 建议分两阶段实现:
353
+
354
+ - 第一阶段:优先支持手写 render function 和 JSX。
355
+ - 第二阶段:实现模板编译器,支持条件渲染、列表渲染、事件绑定、slot 和静态提升。
356
+
357
+ 这样可以先验证运行时架构和性能,再投入编译器复杂度。
358
+
359
+ ## 7. API 设计原则
360
+
361
+ API 应保持直观、稳定、可组合:
362
+
363
+ - 命名语义清晰,避免为了“原创”而使用难懂概念。
364
+ - 核心 API 数量克制,复杂能力通过插件扩展。
365
+ - 类型推导优先,减少用户显式声明泛型的频率。
366
+ - 开发环境错误信息要包含原因、位置和修复建议。
367
+ - 生产环境错误码可压缩,文档中提供错误码映射。
368
+
369
+ 当前 package root 公共 API:
370
+
371
+ ```ts
372
+ import {
373
+ Fragment,
374
+ computed,
375
+ createApp,
376
+ createStore,
377
+ defineAsyncComponent,
378
+ defineComponent,
379
+ effect,
380
+ h,
381
+ nextTick,
382
+ onMounted,
383
+ onUnmounted,
384
+ onUpdated,
385
+ provide,
386
+ inject,
387
+ reactive,
388
+ ref,
389
+ render,
390
+ watch,
391
+ watchEffect,
392
+ } from "@italone/solace";
393
+ ```
394
+
395
+ 当前 README 中列出的候选 API 已完成首轮 root export 收口;DevTools 通过 `@italone/solace/devtools`
396
+ 子路径提供低层集成入口。
397
+
398
+ ## 8. 项目初始化步骤
399
+
400
+ ### 8.1 创建基础项目
401
+
402
+ ```bash
403
+ pnpm init
404
+ pnpm add -D typescript vite vitest jsdom @vitest/coverage-v8
405
+ pnpm add -D eslint prettier husky lint-staged
406
+ pnpm add -D rollup @rollup/plugin-node-resolve @rollup/plugin-commonjs rollup-plugin-dts
407
+ pnpm add -D playwright tinybench
408
+ ```
409
+
410
+ ### 8.2 初始化 TypeScript
411
+
412
+ ```bash
413
+ pnpm tsc --init
414
+ ```
415
+
416
+ 建议配置:
417
+
418
+ - `strict: true`
419
+ - `declaration: true`
420
+ - `declarationMap: true`
421
+ - `moduleResolution: "Bundler"` 或根据构建目标选择 `NodeNext`
422
+ - `target: "ES2018"` 或更高
423
+ - `module: "ESNext"`
424
+
425
+ ### 8.3 推荐脚本
426
+
427
+ ```json
428
+ {
429
+ "scripts": {
430
+ "dev": "vite examples/basic-counter",
431
+ "build": "rollup -c",
432
+ "typecheck": "tsc --noEmit",
433
+ "lint": "eslint .",
434
+ "format": "prettier --write .",
435
+ "format:check": "prettier --check .",
436
+ "test": "vitest run",
437
+ "test:package": "pnpm build && vitest run --config vitest.package.config.ts",
438
+ "test:watch": "vitest",
439
+ "test:coverage": "vitest run --coverage",
440
+ "test:e2e": "playwright test",
441
+ "benchmark": "node scripts/run-benchmark.mjs",
442
+ "benchmark:browser": "playwright test --config playwright.benchmark.config.ts",
443
+ "package:smoke": "node scripts/package-consumer-smoke.mjs",
444
+ "quality": "pnpm format:check && pnpm typecheck && pnpm typecheck:jsxdev && pnpm lint && pnpm test && pnpm test:package",
445
+ "release:check": "pnpm quality && pnpm test:coverage && pnpm package:smoke && pnpm benchmark && pnpm benchmark:browser && pnpm test:e2e"
446
+ }
447
+ }
448
+ ```
449
+
450
+ ## 9. 性能目标与验证方案
451
+
452
+ ### 9.1 性能目标
453
+
454
+ 以下指标作为项目目标,不代表当前已经达成:
455
+
456
+ - 1000+ 组件首次渲染目标:不超过 100ms。
457
+ - 高频状态更新场景:避免重复渲染,同一 tick 内相同组件只更新一次。
458
+ - keyed list 更新:减少不必要 DOM 移动。
459
+ - 长时间运行:组件反复挂载、卸载后无持续增长的 effect、事件监听器和 DOM 引用。
460
+ - 包体积:核心运行时保持轻量,非核心能力通过独立包或插件引入。
461
+
462
+ ### 9.2 对比对象
463
+
464
+ 建议选择以下对比对象:
465
+
466
+ - React 18
467
+ - Vue 3
468
+ - Svelte 3 或当前稳定版本
469
+ - 原生 DOM 操作基准
470
+
471
+ ### 9.3 基准测试场景
472
+
473
+ 必须覆盖:
474
+
475
+ - 创建 1,000 个简单组件。
476
+ - 创建 10,000 行列表。
477
+ - keyed list 插入、删除、移动。
478
+ - 单点状态更新。
479
+ - 批量状态更新。
480
+ - 深层响应式对象更新。
481
+ - 组件挂载和卸载循环。
482
+ - 内存快照和泄漏检测。
483
+
484
+ ### 9.4 报告模板
485
+
486
+ ```text
487
+ 测试环境:
488
+ - CPU:
489
+ - Memory:
490
+ - OS:
491
+ - Browser:
492
+ - Node.js:
493
+ - Commit:
494
+
495
+ 测试场景:
496
+ - 1000 components initial render
497
+ - 10000 rows create/update/delete
498
+ - keyed diff reorder
499
+ - repeated mount/unmount
500
+
501
+ 结果:
502
+ - Solace:
503
+ - React:
504
+ - Vue:
505
+ - Svelte:
506
+ - Native DOM:
507
+
508
+ 结论:
509
+ - 已达成:
510
+ - 未达成:
511
+ - 需要优化:
512
+ ```
513
+
514
+ ## 10. 测试策略
515
+
516
+ ### 10.1 单元测试
517
+
518
+ 覆盖:
519
+
520
+ - 响应式依赖收集和清理。
521
+ - `computed` 缓存与失效。
522
+ - scheduler 去重、顺序和异常处理。
523
+ - VNode 创建和 children 归一化。
524
+ - diff 算法边界情况。
525
+ - 事件绑定和卸载清理。
526
+
527
+ ### 10.2 集成测试
528
+
529
+ 覆盖:
530
+
531
+ - 组件渲染和更新。
532
+ - 父子组件 props 和 emit。
533
+ - provide/inject。
534
+ - store 与组件联动。
535
+ - 异步更新和 `nextTick`。
536
+
537
+ ### 10.3 E2E 测试
538
+
539
+ 覆盖:
540
+
541
+ - 示例应用可正常启动。
542
+ - 点击、输入、列表更新等真实浏览器交互。
543
+ - 控制台无未处理错误。
544
+
545
+ ### 10.4 覆盖率目标
546
+
547
+ - 核心模块语句覆盖率目标:90%+。
548
+ - diff、scheduler、reactivity 等高风险模块应补充分支覆盖。
549
+ - 性能测试不追求覆盖率,但必须纳入回归检查。
550
+
551
+ ## 11. 实现路线图
552
+
553
+ ### 阶段 0:项目初始化
554
+
555
+ - 创建 `package.json`、`tsconfig`、`eslint`、`prettier`、`vitest`、`rollup` 配置。
556
+ - 建立源码、测试、文档和示例目录。
557
+ - 配置 CI 基础流程。
558
+
559
+ ### 阶段 1:响应式核心
560
+
561
+ - 实现 `reactive`、`effect`、`computed`、`watch`。
562
+ - 实现依赖清理、嵌套代理和批处理更新。
563
+ - 完成响应式系统单元测试。
564
+
565
+ ### 阶段 2:VNode 与渲染器
566
+
567
+ - 实现 `h`、VNode 标记和 DOM renderer。
568
+ - 实现 mount、patch、unmount。
569
+ - 实现 keyed 和 non-keyed diff。
570
+ - 完成列表和组件更新测试。
571
+
572
+ ### 阶段 3:组件系统
573
+
574
+ - 实现函数式组件和类组件。
575
+ - 实现 props、slots、emit、生命周期。
576
+ - 实现错误处理和开发环境警告。
577
+ - 提供基础组件示例。
578
+
579
+ ### 阶段 4:调度器与性能优化
580
+
581
+ - 实现 job queue、去重、优先级和 `nextTick`。
582
+ - 对 diff 和响应式更新做性能剖析。
583
+ - 建立性能基准测试项目。
584
+
585
+ ### 阶段 5:工具链与生态
586
+
587
+ - 完成 Rollup 产物构建。
588
+ - 输出 `.d.ts` 类型文件。
589
+ - 增加 Vite 插件或 JSX 支持。
590
+ - 编写 API 文档和示例应用。
591
+
592
+ ### 阶段 6:稳定化与发布
593
+
594
+ - 完成性能对比报告。
595
+ - 补齐边界测试和内存泄漏测试。
596
+ - 引入 Changesets 管理版本。
597
+ - 发布首个 alpha 版本。
598
+
599
+ ## 12. 风险与约束
600
+
601
+ - “性能超过成熟框架”是高难度目标,需要真实基准和持续优化,不能只通过架构设计保证。
602
+ - 自研框架必须避免直接复制 React、Vue、Angular、Svelte 等项目的具体实现代码。
603
+ - 编译器、响应式系统和 diff 算法都是复杂模块,应分阶段实现,避免一次性铺开。
604
+ - 如果目标是学习和验证架构,可以优先做单包项目;如果目标是长期维护生态,建议从 monorepo 开始。
605
+ - 文档中的 API 草案在实现过程中可以调整,但需要保持语义稳定和迁移说明。
606
+
607
+ ## 13. 验收标准
608
+
609
+ 第一阶段最小可验收版本应满足:
610
+
611
+ - 能通过 `createApp` 挂载一个组件。
612
+ - 支持响应式状态驱动 DOM 更新。
613
+ - 支持基础事件绑定。
614
+ - 支持组件卸载和资源清理。
615
+ - 单元测试覆盖核心响应式和渲染流程。
616
+ - 可以运行一个 counter 示例。
617
+
618
+ 完整版本验收标准:
619
+
620
+ - 完成组件、响应式、渲染器、事件、调度器、状态管理和插件扩展。
621
+ - 测试覆盖率达到 90%+。
622
+ - 提供完整 API 文档、架构文档、示例应用和性能报告。
623
+ - 构建产物支持 ESM、CJS 和类型声明。
624
+ - 性能目标通过可复现 benchmark 验证。
625
+
626
+ ## 14. 后续建议
627
+
628
+ 当前最小框架闭环、示例、文档和发布前门禁已经建立。后续建议优先推进以下方向:
629
+
630
+ - 持续记录 jsdom 与 Chromium 生产构建 benchmark 趋势;两个 benchmark 命令都支持 opt-in 本地 JSONL history,`pnpm benchmark:history` 可汇总 median、p95 和 variance,后续再评估阈值和发布性能结论。
631
+ - 根据 [`docs/devtools.md`](./docs/devtools.md) 的边界继续扩展 DevTools summary payload;浏览器扩展或可视化面板应在更多真实示例验证后再实现。
632
+ - 发布前运行 release readiness 与 full release check,确认 npm 包名、访问权限、Changesets version、browser benchmark/e2e 结果和 `private` 配置调整策略。