@cfp-studio/iframe 18.0.0 → 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 +37 -0
- package/dist/index.d.mts +168 -149
- package/dist/index.mjs +671 -893
- package/package.json +12 -6
- package/preview/__previewjs_internal__/index.ts +2 -3
- package/preview/__previewjs_internal__/links.ts +0 -1
- package/preview/__previewjs_internal__/logs.ts +0 -4
- package/preview/__previewjs_internal__/overlay.ts +187 -0
- package/preview/__previewjs_internal__/run-renderer.ts +10 -4
- package/preview/__previewjs_internal__/runtime-bridge.ts +424 -0
- package/preview/__previewjs_internal__/vscode-control.ts +75 -50
- package/preview/index.html +17 -5
- package/dist/index.d.ts +0 -268
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
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
148
|
-
|
|
166
|
+
kind: "toggle-inspect";
|
|
167
|
+
enabled: boolean;
|
|
149
168
|
};
|
|
150
169
|
/**
|
|
151
170
|
* 正在初始化事件
|
|
152
171
|
*/
|
|
153
172
|
type Bootstrapping = {
|
|
154
|
-
|
|
173
|
+
kind: "bootstrapping";
|
|
155
174
|
};
|
|
156
175
|
/**
|
|
157
176
|
* 初始化完成事件
|
|
158
177
|
*/
|
|
159
178
|
type Bootstrapped = {
|
|
160
|
-
|
|
179
|
+
kind: "bootstrapped";
|
|
161
180
|
};
|
|
162
181
|
/**
|
|
163
182
|
* Vite 预更新事件
|
|
164
183
|
*/
|
|
165
184
|
type ViteBeforeUpdate = {
|
|
166
|
-
|
|
167
|
-
|
|
185
|
+
kind: "vite-before-update";
|
|
186
|
+
payload: UpdatePayload;
|
|
168
187
|
};
|
|
169
188
|
/**
|
|
170
189
|
* Vite 更新后事件
|
|
171
190
|
*/
|
|
172
191
|
type ViteAfterUpdate = {
|
|
173
|
-
|
|
174
|
-
|
|
192
|
+
kind: "vite-after-update";
|
|
193
|
+
payload: UpdatePayload;
|
|
175
194
|
};
|
|
176
195
|
/**
|
|
177
196
|
* Vite 失效事件
|
|
178
197
|
*/
|
|
179
198
|
type ViteInvalidate = {
|
|
180
|
-
|
|
199
|
+
kind: "vite-invalidate";
|
|
181
200
|
};
|
|
182
201
|
/**
|
|
183
202
|
* Vite 预重载事件
|
|
184
203
|
*/
|
|
185
204
|
type ViteBeforeReload = {
|
|
186
|
-
|
|
205
|
+
kind: "vite-before-reload";
|
|
187
206
|
};
|
|
188
207
|
/**
|
|
189
208
|
* 渲染前事件
|
|
190
209
|
*/
|
|
191
210
|
type BeforeRender = {
|
|
192
|
-
|
|
211
|
+
kind: "before-render";
|
|
193
212
|
};
|
|
194
213
|
/**
|
|
195
214
|
* 渲染完成事件
|
|
196
215
|
*/
|
|
197
216
|
type Rendered = {
|
|
198
|
-
|
|
217
|
+
kind: "rendered";
|
|
199
218
|
};
|
|
200
219
|
/**
|
|
201
220
|
* 操作事件
|
|
202
221
|
*/
|
|
203
222
|
type Action = {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
223
|
+
kind: "action";
|
|
224
|
+
type: "fn" | "url";
|
|
225
|
+
path: string;
|
|
207
226
|
};
|
|
208
227
|
/**
|
|
209
228
|
* 日志消息事件
|
|
210
229
|
*/
|
|
211
230
|
type LogMessage = {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
222
|
-
|
|
223
|
-
|
|
240
|
+
kind: "error";
|
|
241
|
+
source: "load";
|
|
242
|
+
message: string;
|
|
224
243
|
} | {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
244
|
+
kind: "error";
|
|
245
|
+
source: "hmr";
|
|
246
|
+
modulePath: string;
|
|
247
|
+
message: string;
|
|
229
248
|
} | {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
249
|
+
kind: "error";
|
|
250
|
+
source: "vite";
|
|
251
|
+
message: string;
|
|
233
252
|
} | {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
267
|
+
wrapperModule: any;
|
|
268
|
+
wrapperName?: string;
|
|
269
|
+
previewableModule: any;
|
|
270
|
+
previewableName: string;
|
|
271
|
+
renderId: number;
|
|
272
|
+
shouldAbortRender: () => boolean;
|
|
254
273
|
}) => Promise<{
|
|
255
|
-
|
|
256
|
-
|
|
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
|
-
|
|
265
|
-
|
|
283
|
+
presetGlobalProps: any;
|
|
284
|
+
presetProps: any;
|
|
266
285
|
}) => Record<string, any>;
|
|
267
|
-
|
|
268
|
-
export {
|
|
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 };
|