@cfp-studio/iframe 18.0.1 → 18.2.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 ADDED
@@ -0,0 +1,37 @@
1
+ # @cfp-studio/iframe
2
+
3
+ CFP Studio 预览 iframe 通信与渲染核心包,负责 iframe 与主应用/设计器的消息通信、状态同步、渲染控制、HMR 支持等。
4
+
5
+ ## 特性
6
+ - 提供 iframe 与父窗口的高效通信协议
7
+ - 支持渲染状态、事件、错误、刷新等多种消息类型
8
+ - 支持 HMR(热模块替换)与自动刷新
9
+ - 兼容多框架渲染器(通过 preview/renderer/)
10
+ - 支持全局状态、事件上报、调试等
11
+
12
+ ## 架构与工作原理
13
+ - 通过全局 `__PREVIEWJS_IFRAME__` 对象暴露渲染、刷新、事件上报等能力
14
+ - 预览页面(preview/index.html)自动注入全局对象与通信桥
15
+ - 支持与主应用/设计器的双向事件流与状态同步
16
+ - 支持多渲染器、错误处理、调试工具等扩展
17
+
18
+ ## 主要 API/模块
19
+ - `src/index.ts`:iframe 通信与状态主入口
20
+ - `preview/index.html`:预览页面模板,注入全局对象
21
+ - `preview/__previewjs_internal__/`:内部工具与渲染控制
22
+ - `preview/renderer/`:多框架渲染器入口
23
+
24
+ ## 用法示例
25
+
26
+ 集成于 CFP Studio 设计器/主应用,无需单独调用。自定义渲染器可参考 preview/renderer/
27
+
28
+ ## 依赖
29
+ - `assert-never`、`immer`、`typescript`、`vite`、`unbuild`
30
+
31
+ ## 构建
32
+ ```sh
33
+ pnpm build
34
+ ```
35
+
36
+ ## 许可证
37
+ MIT
package/dist/index.d.mts CHANGED
@@ -1,126 +1,145 @@
1
- import { UpdatePayload } from 'vite/types/hmrPayload';
2
-
1
+ //#region ../node_modules/.pnpm/vite@6.4.5_@types+node@24.19.2_jiti@2.6.1_less@4.2.2_lightningcss@1.30.2_sass@1.85.1_terser@5.40.0_tsx@4.19.3_yaml@2.7.0/node_modules/vite/types/hmrPayload.d.ts
2
+ interface UpdatePayload {
3
+ type: 'update';
4
+ updates: Update[];
5
+ }
6
+ interface Update {
7
+ type: 'js-update' | 'css-update';
8
+ path: string;
9
+ acceptedPath: string;
10
+ timestamp: number;
11
+ /** @internal */
12
+ explicitImportRequired?: boolean;
13
+ /** @internal */
14
+ isWithinCircularImport?: boolean;
15
+ /** @internal */
16
+ firstInvalidatedBy?: string;
17
+ /** @internal */
18
+ invalidates?: string[];
19
+ }
20
+ //#endregion
21
+ //#region src/index.d.ts
3
22
  /**
4
23
  * 扩展全局 Window 对象,定义在 iframe 和其父窗口中使用的特定属性
5
24
  */
6
25
  declare global {
7
- interface Window {
8
- /**
9
- * iframe 中暴露的对象,用于管理渲染状态和报告事件
10
- */
11
- __PREVIEWJS_IFRAME__: {
12
- /**
13
- * 表示最后一次渲染是否失败
14
- */
15
- lastRenderFailed: boolean;
16
- toggleInspect: boolean;
17
- /**
18
- * 处理 HMR 更新
19
- * @param payload - HMR 更新的负载
20
- */
21
- /**
22
- * 报告预览事件
23
- * @param event - 预览事件对象
24
- */
25
- reportEvent(event: PreviewEvent): void;
26
- /**
27
- * 刷新预览,可选参数指定刷新选项
28
- * @param options - 刷新选项
29
- */
30
- refresh(options?: RefreshOptions): void;
31
- /**
32
- * 渲染预览,可选异步函数,接收渲染选项
33
- * @param options - 渲染选项
34
- * @returns 渲染完成的 Promise
35
- */
36
- render?(options: RenderOptions): Promise<void>;
37
- };
38
- /**
39
- * 通常在 iframe 的父窗口中暴露,用于跟踪 iframe 的状态
40
- */
41
- __PREVIEWJS_CONTROLLER__: {
42
- /**
43
- * 处理预览事件
44
- * @param event - 预览事件对象
45
- */
46
- onPreviewEvent(event: PreviewEvent): void;
47
- };
48
- }
26
+ interface Window {
27
+ /**
28
+ * iframe 中暴露的对象,用于管理渲染状态和报告事件
29
+ */
30
+ __PREVIEWJS_IFRAME__: {
31
+ /**
32
+ * 表示最后一次渲染是否失败
33
+ */
34
+ lastRenderFailed: boolean;
35
+ toggleInspect: boolean;
36
+ /**
37
+ * 处理 HMR 更新
38
+ * @param payload - HMR 更新的负载
39
+ */
40
+ /**
41
+ * 报告预览事件
42
+ * @param event - 预览事件对象
43
+ */
44
+ reportEvent(event: PreviewEvent): void;
45
+ /**
46
+ * 刷新预览,可选参数指定刷新选项
47
+ * @param options - 刷新选项
48
+ */
49
+ refresh(options?: RefreshOptions): void;
50
+ /**
51
+ * 渲染预览,可选异步函数,接收渲染选项
52
+ * @param options - 渲染选项
53
+ * @returns 渲染完成的 Promise
54
+ */
55
+ render?(options: RenderOptions): Promise<void>;
56
+ };
57
+ /**
58
+ * 通常在 iframe 的父窗口中暴露,用于跟踪 iframe 的状态
59
+ */
60
+ __PREVIEWJS_CONTROLLER__: {
61
+ /**
62
+ * 处理预览事件
63
+ * @param event - 预览事件对象
64
+ */
65
+ onPreviewEvent(event: PreviewEvent): void;
66
+ };
67
+ }
49
68
  }
50
69
  /**
51
70
  * 刷新预览的选项
52
71
  */
53
72
  type RefreshOptions = {
54
- /**
55
- * 是否重新获取可预览模块
56
- */
57
- refetchPreviewableModule?: boolean;
58
- /**
59
- * 是否重新获取包装模块
60
- * added by Anthony on 2025-04-08
61
- */
62
- refetchWrapperModule?: boolean;
63
- /**
64
- * 可预览模块
65
- */
66
- previewableModule?: any;
67
- /**
68
- * 包装模块
69
- */
70
- wrapperModule?: any;
73
+ /**
74
+ * 是否重新获取可预览模块
75
+ */
76
+ refetchPreviewableModule?: boolean;
77
+ /**
78
+ * 是否重新获取包装模块
79
+ * added by Anthony on 2025-04-08
80
+ */
81
+ refetchWrapperModule?: boolean;
82
+ /**
83
+ * 可预览模块
84
+ */
85
+ previewableModule?: any;
86
+ /**
87
+ * 包装模块
88
+ */
89
+ wrapperModule?: any;
71
90
  };
72
91
  /**
73
92
  * 预览 iframe 的状态
74
93
  */
75
94
  type PreviewIframeState = {
76
- /**
77
- * 表示是否正在加载
78
- */
79
- loading: boolean;
80
- /**
81
- * 表示是否已经渲染
82
- */
83
- rendered: boolean;
84
- /**
85
- * 预览错误列表
86
- */
87
- errors: PreviewError[];
88
- /**
89
- * 日志消息列表
90
- */
91
- logs: LogMessage[];
92
- /**
93
- * 操作列表
94
- */
95
- actions: Action[];
95
+ /**
96
+ * 表示是否正在加载
97
+ */
98
+ loading: boolean;
99
+ /**
100
+ * 表示是否已经渲染
101
+ */
102
+ rendered: boolean;
103
+ /**
104
+ * 预览错误列表
105
+ */
106
+ errors: PreviewError[];
107
+ /**
108
+ * 日志消息列表
109
+ */
110
+ logs: LogMessage[];
111
+ /**
112
+ * 操作列表
113
+ */
114
+ actions: Action[];
96
115
  };
97
116
  /**
98
117
  * 创建控制器的选项
99
118
  */
100
119
  type CreateControllerOptions = {
101
- /**
102
- * 获取 iframe 元素的函数
103
- * @returns HTMLIFrameElement 或 null
104
- */
105
- getIframe: () => HTMLIFrameElement | null;
106
- /**
107
- * 状态更新时的回调函数
108
- * @param state - 预览 iframe 的状态
109
- */
110
- onStateUpdate?: (state: PreviewIframeState) => void;
120
+ /**
121
+ * 获取 iframe 元素的函数
122
+ * @returns HTMLIFrameElement 或 null
123
+ */
124
+ getIframe: () => HTMLIFrameElement | null;
125
+ /**
126
+ * 状态更新时的回调函数
127
+ * @param state - 预览 iframe 的状态
128
+ */
129
+ onStateUpdate?: (state: PreviewIframeState) => void;
111
130
  };
112
131
  /**
113
132
  * 渲染选项
114
133
  */
115
134
  type RenderOptions = {
116
- /**
117
- * 自动生成的回调属性源代码
118
- */
119
- autogenCallbackPropsSource: string;
120
- /**
121
- * 属性赋值源代码
122
- */
123
- propsAssignmentSource: string;
135
+ /**
136
+ * 自动生成的回调属性源代码
137
+ */
138
+ autogenCallbackPropsSource: string;
139
+ /**
140
+ * 属性赋值源代码
141
+ */
142
+ propsAssignmentSource: string;
124
143
  };
125
144
  /**
126
145
  * 创建预览 iframe 控制器
@@ -132,108 +151,108 @@ declare function createController(options: CreateControllerOptions): PreviewIfra
132
151
  * 预览 iframe 控制器接口
133
152
  */
134
153
  type PreviewIframeController = {
135
- /**
136
- * 渲染预览
137
- * @param previewableId - 可预览项的 ID
138
- * @param options - 渲染选项
139
- */
140
- render(previewableId: string, options: RenderOptions): void;
154
+ /**
155
+ * 渲染预览
156
+ * @param previewableId - 可预览项的 ID
157
+ * @param options - 渲染选项
158
+ */
159
+ render(previewableId: string, options: RenderOptions): void;
141
160
  };
142
161
  /**
143
162
  * 预览事件类型
144
163
  */
145
164
  type PreviewEvent = Bootstrapping | Bootstrapped | ViteBeforeUpdate | ViteAfterUpdate | ViteInvalidate | ViteBeforeReload | BeforeRender | Rendered | Action | LogMessage | PreviewError | ToggleInspect;
146
165
  type ToggleInspect = {
147
- kind: "toggle-inspect";
148
- enabled: boolean;
166
+ kind: "toggle-inspect";
167
+ enabled: boolean;
149
168
  };
150
169
  /**
151
170
  * 正在初始化事件
152
171
  */
153
172
  type Bootstrapping = {
154
- kind: "bootstrapping";
173
+ kind: "bootstrapping";
155
174
  };
156
175
  /**
157
176
  * 初始化完成事件
158
177
  */
159
178
  type Bootstrapped = {
160
- kind: "bootstrapped";
179
+ kind: "bootstrapped";
161
180
  };
162
181
  /**
163
182
  * Vite 预更新事件
164
183
  */
165
184
  type ViteBeforeUpdate = {
166
- kind: "vite-before-update";
167
- payload: UpdatePayload;
185
+ kind: "vite-before-update";
186
+ payload: UpdatePayload;
168
187
  };
169
188
  /**
170
189
  * Vite 更新后事件
171
190
  */
172
191
  type ViteAfterUpdate = {
173
- kind: "vite-after-update";
174
- payload: UpdatePayload;
192
+ kind: "vite-after-update";
193
+ payload: UpdatePayload;
175
194
  };
176
195
  /**
177
196
  * Vite 失效事件
178
197
  */
179
198
  type ViteInvalidate = {
180
- kind: "vite-invalidate";
199
+ kind: "vite-invalidate";
181
200
  };
182
201
  /**
183
202
  * Vite 预重载事件
184
203
  */
185
204
  type ViteBeforeReload = {
186
- kind: "vite-before-reload";
205
+ kind: "vite-before-reload";
187
206
  };
188
207
  /**
189
208
  * 渲染前事件
190
209
  */
191
210
  type BeforeRender = {
192
- kind: "before-render";
211
+ kind: "before-render";
193
212
  };
194
213
  /**
195
214
  * 渲染完成事件
196
215
  */
197
216
  type Rendered = {
198
- kind: "rendered";
217
+ kind: "rendered";
199
218
  };
200
219
  /**
201
220
  * 操作事件
202
221
  */
203
222
  type Action = {
204
- kind: "action";
205
- type: "fn" | "url";
206
- path: string;
223
+ kind: "action";
224
+ type: "fn" | "url";
225
+ path: string;
207
226
  };
208
227
  /**
209
228
  * 日志消息事件
210
229
  */
211
230
  type LogMessage = {
212
- kind: "log-message";
213
- level: LogLevel;
214
- message: string;
215
- timestamp: number;
231
+ kind: "log-message";
232
+ level: LogLevel;
233
+ message: string;
234
+ timestamp: number;
216
235
  };
217
236
  /**
218
237
  * 预览错误事件
219
238
  */
220
239
  type PreviewError = {
221
- kind: "error";
222
- source: "load";
223
- message: string;
240
+ kind: "error";
241
+ source: "load";
242
+ message: string;
224
243
  } | {
225
- kind: "error";
226
- source: "hmr";
227
- modulePath: string;
228
- message: string;
244
+ kind: "error";
245
+ source: "hmr";
246
+ modulePath: string;
247
+ message: string;
229
248
  } | {
230
- kind: "error";
231
- source: "vite";
232
- message: string;
249
+ kind: "error";
250
+ source: "vite";
251
+ message: string;
233
252
  } | {
234
- kind: "error";
235
- source: "renderer";
236
- message: string;
253
+ kind: "error";
254
+ source: "renderer";
255
+ message: string;
237
256
  };
238
257
  /**
239
258
  * 日志级别
@@ -245,15 +264,15 @@ type LogLevel = "log" | "info" | "warn" | "error";
245
264
  * @returns 包含渲染函数和 JSX 工厂函数的对象
246
265
  */
247
266
  type RendererLoader = (options: {
248
- wrapperModule: any;
249
- wrapperName?: string;
250
- previewableModule: any;
251
- previewableName: string;
252
- renderId: number;
253
- shouldAbortRender: () => boolean;
267
+ wrapperModule: any;
268
+ wrapperName?: string;
269
+ previewableModule: any;
270
+ previewableName: string;
271
+ renderId: number;
272
+ shouldAbortRender: () => boolean;
254
273
  }) => Promise<{
255
- render: (getProps: GetPropsFn) => Promise<void>;
256
- jsxFactory: ((type: any, props: any, ...children: any[]) => any) | null;
274
+ render: (getProps: GetPropsFn) => Promise<void>;
275
+ jsxFactory: ((type: any, props: any, ...children: any[]) => any) | null;
257
276
  }>;
258
277
  /**
259
278
  * 获取属性函数
@@ -261,8 +280,8 @@ type RendererLoader = (options: {
261
280
  * @returns 属性对象
262
281
  */
263
282
  type GetPropsFn = (options: {
264
- presetGlobalProps: any;
265
- presetProps: any;
283
+ presetGlobalProps: any;
284
+ presetProps: any;
266
285
  }) => Record<string, any>;
267
-
268
- export { type Action, type BeforeRender, type Bootstrapped, type Bootstrapping, type CreateControllerOptions, type GetPropsFn, type LogLevel, type LogMessage, type PreviewError, type PreviewEvent, type PreviewIframeController, type PreviewIframeState, type RefreshOptions, type RenderOptions, type Rendered, type RendererLoader, type ToggleInspect, type ViteAfterUpdate, type ViteBeforeReload, type ViteBeforeUpdate, type ViteInvalidate, createController };
286
+ //#endregion
287
+ export { Action, BeforeRender, Bootstrapped, Bootstrapping, CreateControllerOptions, GetPropsFn, LogLevel, LogMessage, PreviewError, PreviewEvent, PreviewIframeController, PreviewIframeState, RefreshOptions, RenderOptions, Rendered, RendererLoader, ToggleInspect, ViteAfterUpdate, ViteBeforeReload, ViteBeforeUpdate, ViteInvalidate, createController };