weifuwu 0.83.0 → 0.85.0
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 +56 -51
- package/dist/components/ChatInput/ChatInput.d.ts +2 -2
- package/dist/components/Confirm/Confirm.d.ts +2 -2
- package/dist/components/Notification/Notification.d.ts +0 -2
- package/dist/components/Toast/Toast.d.ts +0 -2
- package/dist/components/index.d.ts +3 -3
- package/dist/components/index.js +12 -12
- package/dist/components/style.css +17 -0
- package/dist/index.js +2408 -341
- package/dist/ui-dom/Confirm.d.ts +1 -1
- package/dist/ui-dom/Notification.d.ts +1 -1
- package/dist/ui-dom/Toast.d.ts +1 -1
- package/dist/ui-dom/hooks/index.d.ts +0 -1
- package/dist/ui-dom/hooks/popup.d.ts +2 -0
- package/dist/ui-dom/hooks/stable.d.ts +2 -6
- package/dist/ui-dom/index.d.ts +24 -19
- package/dist/ui-dom/index.js +40 -22
- package/dist/ui-dom/jsx-runtime.js +1 -1
- package/dist/ui-dom/middleware/ws.d.ts +8 -0
- package/dist/ui-dom/popup-tracker.d.ts +1 -1
- package/dist/ui-dom/testing.d.ts +3 -9
- package/dist/ui-dom/testing.js +7 -1
- package/dist/ui-dom/types.d.ts +7 -37
- package/dist/ui-dom/vdom3/README.d.ts +6 -3
- package/dist/ui-dom/vdom3/app.d.ts +20 -0
- package/dist/ui-dom/vdom3/audit.d.ts +13 -0
- package/dist/ui-dom/vdom3/build.d.ts +7 -3
- package/dist/ui-dom/vdom3/commands.d.ts +13 -3
- package/dist/ui-dom/vdom3/comp-index.d.ts +18 -0
- package/dist/ui-dom/vdom3/delegate.d.ts +48 -0
- package/dist/ui-dom/vdom3/events.d.ts +8 -2
- package/dist/ui-dom/vdom3/index.d.ts +5 -3
- package/dist/ui-dom/vdom3/jsx.d.ts +26 -4
- package/dist/ui-dom/vdom3/record.d.ts +3 -0
- package/dist/ui-dom/vdom3/render.d.ts +19 -6
- package/dist/ui-dom/vdom3/replay.d.ts +11 -8
- package/dist/ui-dom/vdom3/root.d.ts +3 -7
- package/dist/ui-dom/vdom3/types.d.ts +128 -70
- package/dist/ui-dom/vdom3/ui.d.ts +3 -30
- package/dist/ui-dom/vdom3.js +12 -10
- package/dist/ui-dom/vnode.d.ts +9 -89
- package/docs/compat-three-library.md +1 -1
- package/docs/components-map.md +1 -1
- package/docs/frontend-middleware.md +59 -53
- package/docs/frontend-ui-dom.md +115 -132
- package/docs/frontend.md +28 -24
- package/docs/realtime.md +21 -21
- package/package.json +1 -1
- package/dist/test/client/setup.d.ts +0 -12
- package/dist/ui-dom/context.d.ts +0 -32
- package/dist/ui-dom/hooks/test/hooks.test.d.ts +0 -1
- package/dist/ui-dom/middleware/serve.d.ts +0 -27
- package/dist/ui-dom/router.d.ts +0 -73
- package/dist/ui-dom/vdom2/audit.d.ts +0 -28
- package/dist/ui-dom/vdom2/build.d.ts +0 -53
- package/dist/ui-dom/vdom2/ctx.d.ts +0 -32
- package/dist/ui-dom/vdom2/dom-trace.d.ts +0 -4
- package/dist/ui-dom/vdom2/events.d.ts +0 -65
- package/dist/ui-dom/vdom2/hydrate.d.ts +0 -21
- package/dist/ui-dom/vdom2/index.d.ts +0 -13
- package/dist/ui-dom/vdom2/kind.d.ts +0 -44
- package/dist/ui-dom/vdom2/lifecycle.d.ts +0 -54
- package/dist/ui-dom/vdom2/mount.d.ts +0 -77
- package/dist/ui-dom/vdom2/patch.d.ts +0 -116
- package/dist/ui-dom/vdom2/registry.d.ts +0 -27
- package/dist/ui-dom/vdom2/render.d.ts +0 -21
- package/dist/ui-dom/vdom2/route.d.ts +0 -29
- package/dist/ui-dom/vdom2/ssr.d.ts +0 -32
- package/dist/ui-dom/vdom2/trace.d.ts +0 -62
- package/dist/ui-dom/vdom2/transform.d.ts +0 -76
- package/dist/ui-dom/vdom2/transitions.d.ts +0 -24
- package/dist/ui-dom/vdom2/x2html.d.ts +0 -26
- package/dist/ui-dom/vdom3/compat.d.ts +0 -20
package/docs/realtime.md
CHANGED
|
@@ -128,44 +128,44 @@ app.get('/blog/:slug', async (req, ctx) => {
|
|
|
128
128
|
- `ctx.ui.ssrData(data)` 输出 `<script>window.__DATA__=...</script>`(JSON `<` 转义防 XSS)
|
|
129
129
|
- 服务端 ctx shim:`$`(dirty no-op)、`ctx.data` 预取去重、`selfId` 请求级隔离
|
|
130
130
|
|
|
131
|
-
### Hydration — 客户端收养服务端 HTML
|
|
131
|
+
### Hydration — 客户端收养服务端 HTML(事件流形态)
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
服务端将 vnode 构建为**事件流**(`renderToEvents`)→ `eventsToHtml` 输出完整 HTML + `serializeEvents` 序列化进 `__DATA__`,客户端 `deserializeEvents` + `replay` **收养**(DOM = fold(事件流)——零 DOM 猜测、不重建、无闪跳):
|
|
134
134
|
|
|
135
135
|
```ts
|
|
136
|
-
import {
|
|
136
|
+
import { createRouter, deserializeEvents, replay } from 'weifuwu/ui-dom'
|
|
137
137
|
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
138
|
+
const root = document.querySelector('#root')!
|
|
139
|
+
replay(deserializeEvents((window as any).__DATA__), root) // 收养服务端 HTML(同构)
|
|
140
|
+
createRouter(routes, root) // 之后正常交互渲染
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
-
-
|
|
144
|
-
- **async 工厂 hydration**:工厂 `ctx.data.get` 从 `__DATA__` 同步命中(不重跑请求)→ 渲染与服务端一致
|
|
145
|
-
-
|
|
143
|
+
- **DOM = fold(事件流)**:初始 DOM + 事件序列 = 任意时刻 DOM——收养即回放(与服务端渲染完全同构)
|
|
144
|
+
- **async 工厂 hydration**:工厂 `ctx.data.get` 从 `__DATA__` 同步命中(不重跑请求)→ 渲染与服务端一致
|
|
145
|
+
- 收养后事件流全量可用(与纯 SPA 无差别)
|
|
146
146
|
- 诚实裁剪:Portal 内容就地收养(不移动到 `#__wf_portal`);渲染期非确定性(Date/random)会导致 mismatch(dev 警告)
|
|
147
147
|
|
|
148
|
-
### 路由级 SSR(
|
|
148
|
+
### 路由级 SSR(routes 两端共享)
|
|
149
149
|
|
|
150
|
-
同一份
|
|
150
|
+
同一份 RouteDef[] 路由定义,后端构建事件流即自动 SSR,无需手写 handler/模板/序列化:
|
|
151
151
|
|
|
152
152
|
```tsx
|
|
153
|
-
//
|
|
154
|
-
import {
|
|
153
|
+
// routes.ts —— 前后端共用
|
|
154
|
+
import { h } from 'weifuwu/ui-dom'
|
|
155
155
|
|
|
156
|
-
export const
|
|
157
|
-
app.get('/blog/:slug', (loc, ctx) => h(BlogPage, { slug: ctx.params.slug }))
|
|
156
|
+
export const routes = [{ path: '/blog/:slug', render: (params) => h(BlogPage, { slug: params.slug }) }]
|
|
158
157
|
|
|
159
|
-
// server.ts ——
|
|
160
|
-
import {
|
|
161
|
-
const
|
|
158
|
+
// server.ts —— renderToEvents → eventsToHtml + serializeEvents(完整 HTML + __DATA__ + styles)
|
|
159
|
+
import { renderToEvents, eventsToHtml, serializeEvents } from 'weifuwu/ui-dom'
|
|
160
|
+
const events = await renderToEvents(routes[0].render({ slug: 'hello' }))
|
|
161
|
+
const page = eventsToHtml(events)
|
|
162
162
|
|
|
163
|
-
// client.ts ——
|
|
164
|
-
|
|
163
|
+
// client.ts —— deserializeEvents + replay 收养
|
|
164
|
+
replay(deserializeEvents((window as any).__DATA__), root)
|
|
165
165
|
```
|
|
166
166
|
|
|
167
167
|
- 组件工厂读 `ctx.params`(`/blog/:slug` → `ctx.params.slug`)——两端同源注入
|
|
168
|
-
- `
|
|
168
|
+
- SSR(事件流形态):`renderToEvents` → `eventsToHtml` + `serializeEvents`——styles/title 由页面模板控制
|
|
169
169
|
|
|
170
170
|
### weifuwu/dev — 服务端直接跑 .tsx
|
|
171
171
|
|
package/package.json
CHANGED
package/dist/ui-dom/context.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ui-dom/context — ctx 组装层(vdom2 纯引擎之上)
|
|
3
|
-
*
|
|
4
|
-
* 分层(vdom2 方案):vdom2/ = 纯渲染引擎(改 vdom 不影响其他);
|
|
5
|
-
* 本文件 = **context/hooks/中间件的组装**(改 hooks/ctx 不动 vdom 引擎):
|
|
6
|
-
* - createVdomContext:组装完整 ctx.ui(render/selfId/onUnmount/bumpCtxVersion +
|
|
7
|
-
* hooks 薄转发 + popup tracker + media registry)
|
|
8
|
-
* - mountRoot:组装入口(context + vdom2 纯引擎挂载)
|
|
9
|
-
*
|
|
10
|
-
* hooks 实现已在 src/ui-dom/hooks/(独立模块)——此处仅组装 HookEnv + 转发。
|
|
11
|
-
*/
|
|
12
|
-
import { type Registry, type Renderer, type MountHandle } from './vdom2/mount.ts';
|
|
13
|
-
import type { BrowserEnv } from './types.ts';
|
|
14
|
-
export interface MountOptions {
|
|
15
|
-
browser: BrowserEnv;
|
|
16
|
-
root: HTMLElement;
|
|
17
|
-
registry?: Registry;
|
|
18
|
-
renderer?: Renderer;
|
|
19
|
-
onError?: (e: unknown) => void;
|
|
20
|
-
}
|
|
21
|
-
export interface VdomContext {
|
|
22
|
-
ctx: any;
|
|
23
|
-
registry: Registry;
|
|
24
|
-
renderer: Renderer;
|
|
25
|
-
rootUi: any;
|
|
26
|
-
destroyPopupListeners: () => void;
|
|
27
|
-
}
|
|
28
|
-
/** 组装 vdom 渲染上下文(ctx.ui 完整能力 + hooks 转发 + popup tracker) */
|
|
29
|
-
export declare function createVdomContext(opts: MountOptions): VdomContext;
|
|
30
|
-
/** 组装入口:createVdomContext + vdom2 纯引擎挂载 */
|
|
31
|
-
export declare function mountRoot(opts: MountOptions): MountHandle;
|
|
32
|
-
export { mountCommand, unmountCommand, createCommandContainer } from './vdom2/mount.ts';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ui-dom/middleware/serve — uiServe(UIRouter + vdom2 引擎)前端中间件
|
|
3
|
-
*
|
|
4
|
-
* 渲染管线(vdom2):buildVNode(async 预构建 await 全部)→ renderValue/patchValue(同步落地)
|
|
5
|
-
* 分层:vdom2/ 纯引擎 + ui-dom/context.ts 组装 ctx(hooks/popup/data/route)——
|
|
6
|
-
* 本文件只做「路由 → 渲染」接线(不触碰 vdom 引擎内部)。
|
|
7
|
-
*/
|
|
8
|
-
import type { UIRouter } from '../router.ts';
|
|
9
|
-
import type { WfuiContext } from '../types.ts';
|
|
10
|
-
/** uiServe 选项 */
|
|
11
|
-
export interface UIServeOptions {
|
|
12
|
-
root: string | Element;
|
|
13
|
-
hydrate?: boolean;
|
|
14
|
-
/** loading 模式:不清空 root(信任调用方预置骨架屏 HTML)——首帧原子替换 */
|
|
15
|
-
loading?: boolean;
|
|
16
|
-
}
|
|
17
|
-
/** serve 句柄 */
|
|
18
|
-
export interface UIServeHandle<C extends object = {}> {
|
|
19
|
-
/** 释放全部资源(监听/渲染状态/注册表) */
|
|
20
|
-
close(): void;
|
|
21
|
-
/** 首帧完成 Promise:await 全部工厂 + DOM 落地后 resolve */
|
|
22
|
-
ready: Promise<void>;
|
|
23
|
-
/** 当前 ctx(调试/测试用)——含 UIRouter ctx 注入的类型扩展 */
|
|
24
|
-
ctx: WfuiContext & C;
|
|
25
|
-
}
|
|
26
|
-
/** uiServe — 绑定唯一根节点 + URL 驱动渲染(vdom2 引擎) */
|
|
27
|
-
export declare function uiServe<RC extends object = {}>(router: UIRouter<RC>, options: UIServeOptions): UIServeHandle<RC>;
|
package/dist/ui-dom/router.d.ts
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* weifuwu/ui-dom UIRouter — 纯路由(无渲染状态)
|
|
3
|
-
*
|
|
4
|
-
* 定稿架构职责划分:
|
|
5
|
-
* UIRouter = 路由表 + 匹配 + 中间件链(产 VNode)——不碰 DOM/渲染/状态
|
|
6
|
-
* serveUI = 渲染运行时(VDOM 落地:registry/createUi/renderValue/patchValue)
|
|
7
|
-
*
|
|
8
|
-
* req = window.location,res = VNode,params/query 在 ctx(serve 组装 ctx 时注入)
|
|
9
|
-
* handler = 异步组件:async (location, ctx) => vnode($ 有效)
|
|
10
|
-
* middleware = 两阶段 async:(location, ctx, children) => async (location, ctx) => vnode
|
|
11
|
-
* layout 与 SSR 都是中间件
|
|
12
|
-
*/
|
|
13
|
-
import type { UIHandler, UIMiddleware } from './types.ts';
|
|
14
|
-
import type { VNode, UIContext, AppMiddleware } from './types.ts';
|
|
15
|
-
/** UIRouter 选项 */
|
|
16
|
-
export interface UIRouterOptions {
|
|
17
|
-
mode?: 'hash' | 'history';
|
|
18
|
-
}
|
|
19
|
-
/** 匹配结果(serve 用它执行中间件链 + handler) */
|
|
20
|
-
export interface RouteMatch {
|
|
21
|
-
handler: UIHandler;
|
|
22
|
-
params: Record<string, string>;
|
|
23
|
-
title?: string;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* 前端路由应用 — new UIRouter()(纯路由)
|
|
27
|
-
*/
|
|
28
|
-
export declare class UIRouter<C extends object = {}> {
|
|
29
|
-
private _routes;
|
|
30
|
-
private _middlewares;
|
|
31
|
-
/** ctx 注入中间件链(toast/confirm/notification 等——对齐后端 app.use 注入 ctx.xxx) */
|
|
32
|
-
private _injections;
|
|
33
|
-
/** 注入已完成标记(应用级 ctx——首次渲染时执行一次) */
|
|
34
|
-
private _injected;
|
|
35
|
-
private _mode;
|
|
36
|
-
private _notFound?;
|
|
37
|
-
/** 子路由挂载(use(prefix, sub)——dumpRoutes 遍历用) */
|
|
38
|
-
private _children;
|
|
39
|
-
constructor(options?: UIRouterOptions);
|
|
40
|
-
get mode(): 'hash' | 'history';
|
|
41
|
-
/** ctx 注入中间件(toast/confirm 等——(ctx) => ctx,对齐后端 app.use 注入 ctx.xxx) */
|
|
42
|
-
use<O extends object>(mw: AppMiddleware<any, O>): UIRouter<C & O>;
|
|
43
|
-
/** 渲染中间件(layout/SSR 等)——包装 children 产 vnode */
|
|
44
|
-
use<I extends object, O extends object>(mw: UIMiddleware<I, O>): UIRouter<C & O>;
|
|
45
|
-
/** 子路由挂载(= 后端 mount(path, subRouter))——独立路由树:sub 的中间件/notFound/嵌套均生效 */
|
|
46
|
-
use(prefix: string, sub: UIRouter): this;
|
|
47
|
-
/** 执行 ctx 注入链(首次渲染时一次——应用级 ctx,对齐 createApp.use 链) */
|
|
48
|
-
private _ensureInjected;
|
|
49
|
-
/** 页面路由(对齐后端 get(path, handler))——handler = 异步组件 */
|
|
50
|
-
get(path: string, handler: UIHandler<C>, opts?: {
|
|
51
|
-
title?: string;
|
|
52
|
-
}): this;
|
|
53
|
-
/** 404 */
|
|
54
|
-
notFound(handler: UIHandler): this;
|
|
55
|
-
/** 当前 URL 路径(serve 调用——mode 由 UIRouter 决定) */
|
|
56
|
-
getPath(): string;
|
|
57
|
-
/** 路由清单(debug 打印/测试用)——含嵌套子路由(use(prefix, sub) 递归展开) */
|
|
58
|
-
dumpRoutes(prefix?: string): Array<{
|
|
59
|
-
path: string;
|
|
60
|
-
title?: string;
|
|
61
|
-
}>;
|
|
62
|
-
private _getPath;
|
|
63
|
-
/** 匹配 URL → { handler, params, title }(serve 执行渲染) */
|
|
64
|
-
match(path: string): RouteMatch;
|
|
65
|
-
/**
|
|
66
|
-
* 子路由树处理(供 use(prefix, sub) 调用):
|
|
67
|
-
* 相对路径匹配 + sub 的中间件链 + sub 的 notFound——支持任意嵌套。
|
|
68
|
-
* 返回 VNode(无渲染——serve 落地)。
|
|
69
|
-
*/
|
|
70
|
-
_handle(relPath: string, location: Location, ctx: UIContext): Promise<VNode | null>;
|
|
71
|
-
/** 顶层执行:中间件链 + handler → VNode(serve 调用,URL 变化时) */
|
|
72
|
-
execute(location: Location, ctx: UIContext, path: string): Promise<VNode | null>;
|
|
73
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vdom2/audit — 结构一致性运行时校验(design 归档 阶段 C)
|
|
3
|
-
*
|
|
4
|
-
* 把「用户的想法 = vnode = DOM」变成每次 patch 的断言——错位即报错(dev),
|
|
5
|
-
* 不静默传播(提交按钮消失事故的根治)。vdom2 版:vnode2 强类型 + 类型守卫。
|
|
6
|
-
*
|
|
7
|
-
* 开关:`__WF_VDOM_AUDIT`(dev/测试全开,生产默认关——O(n) 递归零生产开销)。
|
|
8
|
-
* 校验项:
|
|
9
|
-
* A1 数组数量:childNodes.length === children 数组长度(无 fragment/数组项展开时)
|
|
10
|
-
* A2 占位位置:数组占位项(false/null)⟷ childNodes 对应位置是注释(wf-hole)
|
|
11
|
-
* A3 元素类型:native vnode.type === DOM tagName
|
|
12
|
-
* A4 锚点:组件 _refNode 指向的节点仍在父 DOM 中
|
|
13
|
-
*/
|
|
14
|
-
import type { VNodeChild } from '../vnode.ts';
|
|
15
|
-
import { type VKind } from './kind.ts';
|
|
16
|
-
/** audit 开关(默认开——正确性优先;显式关:__WF_VDOM_AUDIT=0/生产优化时)。
|
|
17
|
-
* 此前默认关 → 事故发生时无运行时校验(三层一致性/挂载不变量全靠事后手动排查)。
|
|
18
|
-
* 默认开的代价:每次 doRenderOne/renderPath 后 O(n) 结构校验(页面树几百节点——
|
|
19
|
-
* 毫秒级,可接受) */
|
|
20
|
-
export declare function auditEnabled(): boolean;
|
|
21
|
-
/** 安装挂载不变量 audit(uiServe 初始化时调用一次——订阅事件流而非遍历 DOM) */
|
|
22
|
-
export declare function installMountInvariantAudit(): void;
|
|
23
|
-
/** 数组级校验:childNodes 与 children 数组对齐(A1/A2——占位错位/数量错位) */
|
|
24
|
-
export declare function auditChildren(parent: Node, children: VNodeChild[] | null, report: (msg: string) => void): void;
|
|
25
|
-
/** 树级校验:vnode 树 ↔ DOM 树递归对照(A3/A4)——入口分派 AUDITERS[classifyKind(child)] 查表 */
|
|
26
|
-
export declare function auditTree(parent: Node, child: VNodeChild, report: (msg: string) => void): void;
|
|
27
|
-
/** 审计状态机表(kind → 校验行为——portal 远程单独容器跳过;native 含非法 type 诊断跳过) */
|
|
28
|
-
export declare const AUDITERS: Record<VKind, (parent: Node, child: VNodeChild, report: (msg: string) => void) => void>;
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vdom/build — async 预构建(阶段 1)
|
|
3
|
-
*
|
|
4
|
-
* 核心不变量:
|
|
5
|
-
* - 组件 vnode 构建后 `_render` 已设(工厂只跑一次)
|
|
6
|
-
* - 旧树同位置同类型复用 `_render`(工厂不重跑——组件跨渲染保持内部状态)
|
|
7
|
-
* - 剪枝:已构建 + props 同 + 旧 _child 有值 → 复用旧 _child(renderFn 不重跑)
|
|
8
|
-
* - 兄弟组件并行(工厂同步执行到第一个 await 后并发等待)
|
|
9
|
-
* - **纯函数无 DOM**——构建产物只含 vnode 树
|
|
10
|
-
*
|
|
11
|
-
* V3-2(同步快路径):buildVNode 非 async——返回 `VNodeChild | Promise<VNodeChild>`。
|
|
12
|
-
* **红线(用户确认):组件两阶段异步定义不可改动**——组件 vnode 分支仍 await 工厂 +
|
|
13
|
-
* renderFn(renderFn 强制异步契约不变);仅「无需 await 的路径」(剪枝复用/文本/null/
|
|
14
|
-
* 已构建 native)同步返回——零微任务。调用方统一 await 吸收(同步值 await 仅 1 微任务)。
|
|
15
|
-
*/
|
|
16
|
-
import type { VNode, VNodeChild } from '../vnode.ts';
|
|
17
|
-
import { type VdomCtx } from './ctx.ts';
|
|
18
|
-
import { type Registry } from './registry.ts';
|
|
19
|
-
import { type VKind } from './kind.ts';
|
|
20
|
-
/** 组件 props 浅比较(三态 skip 判定) */
|
|
21
|
-
export declare function componentPropsEqual(a: Record<string, any>, b: Record<string, any>): boolean;
|
|
22
|
-
/** 挂载 async 组件:await 工厂(两阶段:外层 mount 一次)→ 设 _render + 分配 id + childCtx */
|
|
23
|
-
export declare function mountAsyncComponent(vnode: VNode, ctx: VdomCtx, reg: Registry, opts?: {
|
|
24
|
-
reuse?: VNode | null;
|
|
25
|
-
}): Promise<{
|
|
26
|
-
renderFn: (props: VNode['props']) => Promise<VNode | null>;
|
|
27
|
-
childCtx: VdomCtx;
|
|
28
|
-
}>;
|
|
29
|
-
/**
|
|
30
|
-
* 递归展开组件树:await 工厂 → renderFn → 递归子树。**零 DOM**。
|
|
31
|
-
*
|
|
32
|
-
* - 组件节点保留在树上(挂 `_render` + `_child`)——$ dirty 精准刷新锚点不丢
|
|
33
|
-
* - 兄弟组件 Promise.all 并行
|
|
34
|
-
* - 旧树对照(oldInput):同位置同类型组件复用旧 `_render`;同 props + 旧 _child 有值
|
|
35
|
-
* 复用旧 `_child`(renderFn 不重跑——三态 skip 语义前置)
|
|
36
|
-
* - 原地 mutate vnode(_render/_child)——引用保持
|
|
37
|
-
* - V3-2:非 async——剪枝/文本/null/已构建 native 同步返回(零微任务);
|
|
38
|
-
* 组件路径(工厂 + renderFn await)返回 Promise(异步契约不变)
|
|
39
|
-
*/
|
|
40
|
-
/** 构建器签名(BUILDERS[kind]——kind 分派查表,无 if/else 类型链) */
|
|
41
|
-
type BuildFn = (input: VNodeChild, ctx: VdomCtx, oldInput: VNodeChild | undefined, reg: Registry | undefined, opts: {
|
|
42
|
-
force?: boolean;
|
|
43
|
-
} | undefined) => VNodeChild | Promise<VNodeChild>;
|
|
44
|
-
/**
|
|
45
|
-
* buildVNode — 构建分派入口(状态机查表:BUILDERS[classifyKind(input)])。
|
|
46
|
-
* hole/text 同步原样;arr 逐项递归;comp 异步工厂;frag/native/portal 同步递归 children。
|
|
47
|
-
*/
|
|
48
|
-
export declare function buildVNode(input: VNodeChild, ctx: VdomCtx, oldInput?: VNodeChild, reg?: Registry, opts?: {
|
|
49
|
-
force?: boolean;
|
|
50
|
-
}): VNodeChild | Promise<VNodeChild>;
|
|
51
|
-
/** 构建状态机表(kind → 构建行为——与 render RENDERERS / ssr TO_HTML / hydrate HYDRATERS 同构) */
|
|
52
|
-
export declare const BUILDERS: Record<VKind, BuildFn>;
|
|
53
|
-
export {};
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vdom2 ctx — 类型化渲染上下文(强类型——替代散落的 `ctx as any`/WfuiContext 宽松类型)
|
|
3
|
-
*
|
|
4
|
-
* ctx 是开放扩展(中间件/组件注入任意字段如 data/route)——本接口定义 vdom 引擎
|
|
5
|
-
* 依赖的已知字段;扩展字段由注入方 cast 到具体接口。
|
|
6
|
-
*/
|
|
7
|
-
import type { BrowserEnv } from '../types.ts';
|
|
8
|
-
import type { Registry } from './registry.ts';
|
|
9
|
-
/** ctx.ui(组装层 ui-dom/context.ts 提供完整能力——引擎只依赖以下字段) */
|
|
10
|
-
export interface VdomUi {
|
|
11
|
-
_ctxVersion?: number;
|
|
12
|
-
_mounting?: boolean;
|
|
13
|
-
_rootVNodeId: string | null;
|
|
14
|
-
setMounting?(v: boolean): void;
|
|
15
|
-
endMounting?(): void;
|
|
16
|
-
render(ids?: string[]): Promise<void>;
|
|
17
|
-
}
|
|
18
|
-
/** vdom2 渲染上下文(build/render/patch/mount 依赖的已知字段)——ui 必填(由组装层 ui-dom/context.ts 创建) */
|
|
19
|
-
export interface VdomCtx {
|
|
20
|
-
browser: BrowserEnv;
|
|
21
|
-
__registry: Registry;
|
|
22
|
-
ui: VdomUi;
|
|
23
|
-
[key: string]: unknown;
|
|
24
|
-
}
|
|
25
|
-
/** 组件名提取(强类型——替代 `(type as any).name`) */
|
|
26
|
-
export declare function componentName(type: unknown): string;
|
|
27
|
-
/** ctx.ui 版本号(三态 skip 基准) */
|
|
28
|
-
export declare function ctxVersion(ctx: VdomCtx): number;
|
|
29
|
-
/** ctx.ui.render(组件内部 render 转发——闭包绑定 id 由组装层 childCtx 处理) */
|
|
30
|
-
export declare function ctxRender(ctx: VdomCtx, ids?: string[]): Promise<void>;
|
|
31
|
-
/** 挂载保护期开关(工厂执行期间跳过渲染请求) */
|
|
32
|
-
export declare function setMounting(ctx: VdomCtx, v: boolean): void;
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vdom/events — 统一状态机事件总线
|
|
3
|
-
*
|
|
4
|
-
* 状态机管"转换"(route/lifecycle/x2y/keys/pos),事件总线管"观测":
|
|
5
|
-
* 所有状态转换统一发射结构化 VdomEvent,多路 sink 消费——
|
|
6
|
-
* - console sink:人类可读(复用 trace 阶段开关,格式兼容旧 trace 输出)
|
|
7
|
-
* - ring buffer sink:内存最近 N 条(__vdom_events(n) 查询——事故现场可追溯)
|
|
8
|
-
* - collect sink:测试断言(makeEventCollector——事件序列断言,过程级而非结果级)
|
|
9
|
-
* - audit sink:不变量校验器(订阅事件流而非事后遍历 DOM——阶段 2)
|
|
10
|
-
*
|
|
11
|
-
* 事件 = "决策记录"(同步、纯,不执行 DOM);执行层(appendChild/坐标计算)不进事件流。
|
|
12
|
-
* 性能:emit 首行检查——无观测者或 trace 关闭时仅一次布尔比较;payload 支持惰性函数
|
|
13
|
-
* (高频 diff 事件只在有消费者需要时才求值,避免 vnDesc/nodeDesc 的字符串成本)。
|
|
14
|
-
*/
|
|
15
|
-
import { type VdomLevel, type VdomStage } from './trace.ts';
|
|
16
|
-
/** 状态机名(事件来源)——含执行细节摘要通道(build/render/diff/mount——trace 包装) */
|
|
17
|
-
export type VdomMachine = 'route' | 'lifecycle' | 'x2y' | 'keys' | 'pos' | 'render' | 'audit' | 'build' | 'mount' | 'diff' | 'dom';
|
|
18
|
-
export declare function machineToStage(m: VdomMachine): VdomStage;
|
|
19
|
-
/** 统一状态机事件(一次渲染会话的全部转换通过 session 关联) */
|
|
20
|
-
export interface VdomEvent {
|
|
21
|
-
/** 渲染会话 id(R{n}——同一渲染的 build/render/diff 事件共享;阶段 2 接入贯穿) */
|
|
22
|
-
session: string;
|
|
23
|
-
machine: VdomMachine;
|
|
24
|
-
/** 关联 vnode id(_id——按实例过滤/追溯) */
|
|
25
|
-
nodeId: string | null;
|
|
26
|
-
/** 组件名/类型名(尽力) */
|
|
27
|
-
component: string | null;
|
|
28
|
-
from: string;
|
|
29
|
-
event: string;
|
|
30
|
-
to: string;
|
|
31
|
-
/** 附加数据(key/i/path 等)——可传函数惰性求值(高频路径零字符串成本) */
|
|
32
|
-
payload?: unknown;
|
|
33
|
-
/** 输出级别(console sink 门控;默认 debug) */
|
|
34
|
-
level?: VdomLevel;
|
|
35
|
-
ts: number;
|
|
36
|
-
}
|
|
37
|
-
export type EventSink = (ev: VdomEvent) => void;
|
|
38
|
-
/** 注册事件 sink(返回退订函数) */
|
|
39
|
-
export declare function onVdomEvent(sink: EventSink): () => void;
|
|
40
|
-
/** 开始渲染会话(renderOne/renderPath 入口调用)——期间所有 emit 共享 session */
|
|
41
|
-
export declare function beginSession(tag?: string): string;
|
|
42
|
-
/** 结束渲染会话(renderOne/renderPath 出口调用) */
|
|
43
|
-
export declare function endSession(): void;
|
|
44
|
-
/** 当前会话 id(空 = 无会话——事件流外直接 emit) */
|
|
45
|
-
export declare function currentSession(): string;
|
|
46
|
-
/** payload 惰性求值 + 分发(sink 错误隔离——不中断渲染管线)
|
|
47
|
-
* session:事件显式传入优先,否则继承当前渲染会话(一次渲染 = 一棵事件树) */
|
|
48
|
-
export declare function emit(ev: VdomEvent): void;
|
|
49
|
-
/** 是否存在「console 之外」的观测 sink(ring/collect)——trace() 包装的 emit 门槛:
|
|
50
|
-
* trace 关闭但测试收集/调试 ring 存在时,执行细节事件仍要发射(供断言/追溯) */
|
|
51
|
-
export declare function hasObservingSinks(): boolean;
|
|
52
|
-
/** 注册 ring buffer sink(uiServe 初始化时调用——页面生命周期内事件全程可追溯) */
|
|
53
|
-
export declare function installEventRing(): void;
|
|
54
|
-
/** 调试 API:查询最近事件(可按 machine/nodeId/event 过滤)——__vdom_events(50, { machine: 'lifecycle' }) */
|
|
55
|
-
export declare function __vdom_events(n?: number, filter?: Partial<VdomEvent>): VdomEvent[];
|
|
56
|
-
/** 渲染请求追踪(__vdom_render_trace(n?)——页面存续期所有渲染入口统一视图:
|
|
57
|
-
* uiServe 首帧/导航 + 组件 ctx.ui.render()(含调用者组件名/id) + 外部系统
|
|
58
|
-
* 输出:`[t=ms] source(component:id) → ids / detail`——按事件顺序 */
|
|
59
|
-
export declare function __vdom_render_trace(n?: number): string[];
|
|
60
|
-
/** 重置 ring buffer(测试隔离用) */
|
|
61
|
-
export declare function __resetVdomEvents(): void;
|
|
62
|
-
export declare function makeEventCollector(): {
|
|
63
|
-
events: VdomEvent[];
|
|
64
|
-
unsubscribe: () => void;
|
|
65
|
-
};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vdom2/hydrate — 游标收养(SSR HTML → 客户端,不重建 DOM)
|
|
3
|
-
*
|
|
4
|
-
* 流程:buildVNode 预构建(await 工厂——组件已 resolve、_child 已展开)→ 游标收养
|
|
5
|
-
* (只接线属性/事件/ref——不重跑 renderFn)。vdom2 版:vnode2 强类型 + 类型守卫。
|
|
6
|
-
*
|
|
7
|
-
* 游标不变量:元素/文本 VNode 恰好消耗一个游标节点;组件/Fragment/数组透明;
|
|
8
|
-
* null 消耗零;创建时 insertBefore(游标) 且游标不动;收养/替换时游标前进。
|
|
9
|
-
*/
|
|
10
|
-
import type { VNode, VNodeChild } from '../vnode.ts';
|
|
11
|
-
import { type VKind } from './kind.ts';
|
|
12
|
-
import { type VdomCtx } from './ctx.ts';
|
|
13
|
-
interface HydrationCursor {
|
|
14
|
-
parent: Node;
|
|
15
|
-
node: Node | null;
|
|
16
|
-
}
|
|
17
|
-
/** 水合状态机表(kind → 收养行为——与 render RENDERERS / ssr TO_HTML 同构) */
|
|
18
|
-
export declare const HYDRATERS: Record<VKind, (v: VNodeChild, ctx: VdomCtx, c: HydrationCursor) => Node | null>;
|
|
19
|
-
/** Hydration 入口:buildVNode 预构建(await 工厂)→ 游标收养 */
|
|
20
|
-
export declare function hydrateVNode(container: Element, vnode: VNode, ctx: VdomCtx): Promise<void>;
|
|
21
|
-
export {};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vdom2 引擎入口(TDD 实施中——测试见 src/test/vdom2-matrix.test.ts)
|
|
3
|
-
*/
|
|
4
|
-
export { mountRoot, createRenderer, type MountHandle, type Renderer } from './mount.ts';
|
|
5
|
-
export { buildVNode } from './build.ts';
|
|
6
|
-
export { renderValue } from './render.ts';
|
|
7
|
-
export { patchValue } from './patch.ts';
|
|
8
|
-
export { x2y, TRANSITIONS } from './transitions.ts';
|
|
9
|
-
export { x2html } from './x2html.ts';
|
|
10
|
-
export { auditEnabled, auditTree, auditChildren } from './audit.ts';
|
|
11
|
-
export { hydrateVNode } from './hydrate.ts';
|
|
12
|
-
export { classifyKind, getOutputRange } from './kind.ts';
|
|
13
|
-
export { h, jsx, jsxs, createPortal, Fragment, Portal, isNative, isFrag, isComp, isPortal } from '../vnode.ts';
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vdom 类型分类与输出范围(vdom-matrix 方案 2026-12)
|
|
3
|
-
*
|
|
4
|
-
* - classifyKind:children 值类型分类(单一判定源——替代散落的 typeof/Array.isArray/type=== 判断)
|
|
5
|
-
* - getOutputRange:输出 DOM 范围统一获取(多节点完整边界;单节点 null)——
|
|
6
|
-
* 范围定位用节点引用(Fragment._childNodes / 组件 _outputChild 递归 / 数组 fragment-start..end 标记),
|
|
7
|
-
* 不依赖外部下标。x2y 转换(transitions.ts)/ removeOldOutput 统一用它。
|
|
8
|
-
*
|
|
9
|
-
* 类型分类与 VNode 类层次见 vnode.ts(NativeVNode/FragVNode/CompVNode/PortalVNode 继承 VNode 基类);
|
|
10
|
-
* 文本/数组/占位是 JSX 原生值(string/Array/boolean/null)——classifyKind 分类后走同一转换表。
|
|
11
|
-
*/
|
|
12
|
-
import type { VNodeChild } from '../vnode.ts';
|
|
13
|
-
import { Fragment, Portal } from '../vnode.ts';
|
|
14
|
-
/** children 值类型分类(vdom 状态机状态) */
|
|
15
|
-
export type VKind = 'text' | 'native' | 'frag' | 'comp' | 'arr' | 'hole' | 'portal';
|
|
16
|
-
/** patchValue 分派上下文 */
|
|
17
|
-
export interface PatchState {
|
|
18
|
-
parent: Node;
|
|
19
|
-
oldNode: Node | null;
|
|
20
|
-
oldInput: VNodeChild;
|
|
21
|
-
newInput: VNodeChild;
|
|
22
|
-
ctx: {
|
|
23
|
-
browser: any;
|
|
24
|
-
registry: import('./registry.ts').Registry;
|
|
25
|
-
ctxVersion?: number;
|
|
26
|
-
force?: boolean;
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
/** 输出范围统一获取(多节点输出完整边界;单节点/未知 → null)——类型守卫收窄,无散落 cast
|
|
30
|
-
* 统一协议(2026-12):Fragment 与数组项同构——多节点输出 = fragment-start/end 标记包裹,
|
|
31
|
-
* 范围由标记推导(anchor = start 标记,DOM 持久化——随移动/移除天然同步);组件经 _outputChild 递归 */
|
|
32
|
-
export declare function getOutputRange(input: VNodeChild, anchor: Node | null): Node[] | null;
|
|
33
|
-
/** 值分类(单一判定源——替代散落的 typeof/Array.isArray/type=== 判断) */
|
|
34
|
-
export declare function classifyKind(v: VNodeChild): VKind;
|
|
35
|
-
/** 数组 key 模式:diff 策略状态机的状态 */
|
|
36
|
-
export type KeyMode = 'unkeyed' | 'keyed' | 'mixed';
|
|
37
|
-
/** 数组 key 模式判定(单一判定源——替代 patch 散落的 hasUserKey/allUnkeyed 计算):
|
|
38
|
-
* - unkeyed:无用户 key(位置身份——按位置 patch)
|
|
39
|
-
* - keyed :全部用户 key(内容身份——按 key 匹配)
|
|
40
|
-
* - mixed :部分 key(无 key 项由 prepPos 分配 pos:{i} 后降级 keyed)
|
|
41
|
-
* 豁免:占位/文本(无 key 协议豁免);数组项(隐式 Fragment,位置语义);
|
|
42
|
-
* portal(portalKey 不算用户 keyed——C1:[input(无key), portal] 按位置复用) */
|
|
43
|
-
export declare function keyModeOf(children: VNodeChild[]): KeyMode;
|
|
44
|
-
export { Fragment, Portal };
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vdom2 lifecycle — 节点生命周期状态机(2026-12)
|
|
3
|
-
*
|
|
4
|
-
* 与 x2y(diff 转换状态机)/ KEY_DIFFERS(key 模式状态机)同构的第三个状态机:
|
|
5
|
-
* 节点的构建/清理由**显式状态**管理——根治「dispose 掏空旧树但 build 剪枝按引用误判可用」
|
|
6
|
-
* 的不一致(demo 搜索序列:Section null→恢复后剪枝复用半残旧树 → diff 遇未构建组件 →
|
|
7
|
-
* renderComp 抛「not built」)。
|
|
8
|
-
*
|
|
9
|
-
* 状态:
|
|
10
|
-
* fresh —— JSX 刚创建(未构建:无 _id/_render/_child)
|
|
11
|
-
* building —— buildVNode 处理中(异步工厂 await 中)
|
|
12
|
-
* built —— 已构建(_render/_child 已设——diff 可渲染)
|
|
13
|
-
* pruned —— 剪枝复用(_child 复用旧树——状态保持)
|
|
14
|
-
* disposed —— 已清理(diff 移除 → 掏空 _render/_child)
|
|
15
|
-
*
|
|
16
|
-
* 关键不变量(由 dispose 整树递归保证):组件非 disposed ⟹ 子树全部非 disposed——
|
|
17
|
-
* 剪枝只检查自身生命周期即可,无需深度验证 _child 内部(O(n) 太贵)。
|
|
18
|
-
*/
|
|
19
|
-
/** 节点生命周期状态 */
|
|
20
|
-
export type Lifecycle = 'fresh' | 'building' | 'built' | 'pruned' | 'disposed';
|
|
21
|
-
/** 生命周期事件(状态转换触发点) */
|
|
22
|
-
export type LifecycleEvent = 'BUILD_START' | 'BUILD_DONE' | 'PRUNE' | 'DISPOSE';
|
|
23
|
-
/** 生命周期 trace 上下文(组件视角可观测——组件名 + 实例 id + 深度) */
|
|
24
|
-
export interface LifecycleTraceCtx {
|
|
25
|
-
name?: string;
|
|
26
|
-
id?: string | null;
|
|
27
|
-
depth?: number;
|
|
28
|
-
}
|
|
29
|
-
/** 从 vnode 提取 trace 上下文(组件名 + 实例 id + _parentVNode 链深度——尽力,链可能不完整) */
|
|
30
|
-
export declare function vnodeTraceCtx(vnode: {
|
|
31
|
-
type: unknown;
|
|
32
|
-
_id?: string | null;
|
|
33
|
-
_parentVNode?: unknown;
|
|
34
|
-
}): LifecycleTraceCtx;
|
|
35
|
-
/** 查询生命周期时间线(全组件或单组件)——__vdom_lc(id?) */
|
|
36
|
-
export declare function dumpTimeline(id?: string): string;
|
|
37
|
-
/** 状态转换执行(非法转换 → 保留原状态 + 事件/trace warn——不静默吞掉)
|
|
38
|
-
* tctx:trace 上下文(组件名/id/深度——事件携带结构化字段,trace 输出 `Name(id)[d0] from --event--> to`)
|
|
39
|
-
* 事件流:所有转换统一 emit(machine=lifecycle)——过程级可观测/可断言 */
|
|
40
|
-
export declare function transition(from: Lifecycle, event: LifecycleEvent, tctx?: LifecycleTraceCtx): Lifecycle;
|
|
41
|
-
/** 旧树复用有效性(I3——所有复用路径统一检查):
|
|
42
|
-
* - 生命周期非 disposed(dispose 显式标记——根治「引用还在但内容被掏空」的误判)
|
|
43
|
-
* - 旧 _child 非 null(有可复用输出)
|
|
44
|
-
* - _child 树无 disposed(深检查——portal 内容独立 dispose(remoteEl 移除)会打破
|
|
45
|
-
* 「父非 disposed ⟹ 子树全非 disposed」:DemoDrawer 剪枝复用含 disposed Button/Drawer
|
|
46
|
-
* 的输出——demo 搜索序列实测;正确性优先,性能后续用 dirty 标记优化) */
|
|
47
|
-
export declare function canReuse(oldV: {
|
|
48
|
-
_lifecycle?: Lifecycle;
|
|
49
|
-
_child?: unknown;
|
|
50
|
-
} | null | undefined): boolean;
|
|
51
|
-
/** 递归检查子树是否含 disposed vnode(_child 树——不含 props.children 原始 JSX)
|
|
52
|
-
* 导出:compToComp 并发剪枝缓存失效检测复用(build 剪枝后另一渲染会话 dispose 共享
|
|
53
|
-
* 旧树——childNew 树含 disposed = 旧树被当新树,禁止 diff) */
|
|
54
|
-
export declare function treeHasDisposed(child: unknown): boolean;
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vdom2 mount — 纯引擎挂载核心(无 ctx 组装、无 hooks——那些在 ui-dom/context.ts 组装层)
|
|
3
|
-
*
|
|
4
|
-
* 分层(vdom2 方案):
|
|
5
|
-
* - vdom2/ = 纯渲染引擎(vnode/kind/render/patch/build/mount 核心——改 vdom 不影响其他)
|
|
6
|
-
* - ui-dom/context.ts = 组装层(createVdomContext:ctx.ui 完整能力 + hooks 转发 + popup tracker)
|
|
7
|
-
* - ui-dom/middleware/ = 中间件(uiServe 等——后续迁移)
|
|
8
|
-
*
|
|
9
|
-
* 渲染管线:buildVNode(async 预构建——await 全部工厂)→ renderValue(同步落地)
|
|
10
|
-
* ctx.ui.render:render-only(design 归档)——唯一渲染触发。
|
|
11
|
-
*/
|
|
12
|
-
import type { VNode, VNodeChild } from '../vnode.ts';
|
|
13
|
-
import { createRegistry, type Registry } from './registry.ts';
|
|
14
|
-
import { type VdomCtx } from './ctx.ts';
|
|
15
|
-
import type { BrowserEnv } from '../types.ts';
|
|
16
|
-
export interface MountOptions {
|
|
17
|
-
browser: BrowserEnv;
|
|
18
|
-
root: HTMLElement;
|
|
19
|
-
/** 完整 ctx(ui-dom/context.ts createVdomContext 组装——ui 必填) */
|
|
20
|
-
ctx: VdomCtx;
|
|
21
|
-
registry?: Registry;
|
|
22
|
-
renderer?: Renderer;
|
|
23
|
-
onError?: (e: unknown) => void;
|
|
24
|
-
}
|
|
25
|
-
export interface MountHandle {
|
|
26
|
-
ctx: any;
|
|
27
|
-
registry: Registry;
|
|
28
|
-
renderer: Renderer;
|
|
29
|
-
mount(comp: VNodeChild): Promise<void>;
|
|
30
|
-
rerender(): Promise<void>;
|
|
31
|
-
unmount(): void;
|
|
32
|
-
close?(): void;
|
|
33
|
-
}
|
|
34
|
-
export interface Renderer {
|
|
35
|
-
render(ids?: string[], req?: RenderRequestInfo): Promise<void>;
|
|
36
|
-
/** 补跑构建期被跳过的渲染请求(renderPath/渲染链落地后调用——导航期间状态更新不丢失) */
|
|
37
|
-
flushPending(): Promise<void>;
|
|
38
|
-
}
|
|
39
|
-
export interface VdomContext {
|
|
40
|
-
ctx: any;
|
|
41
|
-
registry: Registry;
|
|
42
|
-
renderer: Renderer;
|
|
43
|
-
rootUi: any;
|
|
44
|
-
}
|
|
45
|
-
/** 渲染请求来源(render 调用追踪——页面存续期所有渲染入口统一可追溯) */
|
|
46
|
-
export interface RenderRequestInfo {
|
|
47
|
-
/** 调用来源分类 */
|
|
48
|
-
source: 'component' | 'uiServe' | 'external' | 'root';
|
|
49
|
-
/** 调用者组件名(source=component 时) */
|
|
50
|
-
component: string | null;
|
|
51
|
-
/** 调用者组件 id(childUi 绑定的 _id) */
|
|
52
|
-
nodeId: string | null;
|
|
53
|
-
/** 附加信息(uiServe: initial/nav;external: popup-tracker/hook 名等) */
|
|
54
|
-
detail?: string;
|
|
55
|
-
}
|
|
56
|
-
/** 渲染执行器(render-only 唯一渲染入口——per-id 串行链:并发触发排队补跑,
|
|
57
|
-
* 同一组件渲染中再次触发 → 排队等前一个完成后补跑最新状态(合并语义)) */
|
|
58
|
-
export declare function createRenderer(opts: {
|
|
59
|
-
registry: Registry;
|
|
60
|
-
ctx: any;
|
|
61
|
-
rootEl?: HTMLElement | null;
|
|
62
|
-
onError?: (e: unknown) => void;
|
|
63
|
-
}): Renderer;
|
|
64
|
-
/** 纯引擎挂载(接受已组装 ctx——ui-dom/context.ts 提供便捷入口) */
|
|
65
|
-
export declare function mountRoot(opts: MountOptions): MountHandle;
|
|
66
|
-
export { createRegistry };
|
|
67
|
-
export type { Registry };
|
|
68
|
-
/** vdom2 命令式挂载(toast/notification 等——buildVNode await 工厂 → renderValue → append) */
|
|
69
|
-
export declare function mountCommand(container: HTMLElement, vnode: VNode, ctx: VdomCtx | import('../types.ts').WfuiContext, opts?: {
|
|
70
|
-
onMounted?: () => void;
|
|
71
|
-
}): {
|
|
72
|
-
id: string;
|
|
73
|
-
};
|
|
74
|
-
/** vdom2 命令式卸载:ref 清理 + 卸载钩子 + 容器移除 */
|
|
75
|
-
export declare function unmountCommand(container: HTMLElement, vnode: VNode | null, ctx: VdomCtx | import('../types.ts').WfuiContext): void;
|
|
76
|
-
/** 命令式挂载容器(toast 等——body 下) */
|
|
77
|
-
export declare function createCommandContainer(): HTMLDivElement | null;
|