@blueking/bk-weweb 0.0.34 → 0.0.35-beta.2

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/dist/index.d.mts CHANGED
@@ -1,8 +1,12 @@
1
+ type ExecuteResult = Comment | HTMLScriptElement | undefined;
2
+ /**
3
+ * Script脚本实例类
4
+ */
1
5
  declare class Script {
2
6
  async: boolean;
3
7
  code: string;
4
8
  defer: boolean;
5
- exportInstance?: any;
9
+ exportInstance?: unknown;
6
10
  fromHtml: boolean;
7
11
  initial: boolean;
8
12
  isModule: boolean;
@@ -10,18 +14,35 @@ declare class Script {
10
14
  url: string | undefined;
11
15
  constructor({ async, code, defer, fromHtml, initial, isModule, url }: IScriptOption);
12
16
  /**
13
- * @param app 应用
17
+ * 执行脚本代码
18
+ * @param app 应用实例
14
19
  * @param needReplaceScriptElement 是否需要替换script标签
15
20
  * @returns 返回执行后的script标签或注释
16
21
  */
17
- executeCode(app: BaseModel, needReplaceScriptElement?: boolean): Promise<Comment | HTMLScriptElement | undefined>;
22
+ executeCode(app: BaseModel, needReplaceScriptElement?: boolean): Promise<ExecuteResult>;
23
+ /**
24
+ * 内存脚本执行
25
+ */
18
26
  executeMemoryScript(app: BaseModel, scopedCode: string): void;
27
+ /**
28
+ * 脚本标签执行
29
+ */
19
30
  executeSourceScript(scriptElement: HTMLScriptElement, scopedCode: string): void;
31
+ /**
32
+ * 获取脚本内容
33
+ */
20
34
  getCode(app?: BaseModel): Promise<string>;
21
35
  setCode(code: string): void;
36
+ /**
37
+ * 转换脚本内容
38
+ */
22
39
  transformCode(app: BaseModel): string;
23
40
  }
24
41
 
42
+ type PackRuleType = CSSMediaRule | CSSSupportsRule;
43
+ /**
44
+ * 样式处理类
45
+ */
25
46
  declare class Style {
26
47
  code: string;
27
48
  fromHtml: boolean;
@@ -33,90 +54,337 @@ declare class Style {
33
54
  url: string | undefined;
34
55
  constructor({ code, fromHtml, initial, prefetch, preload, url }: IStyleOption);
35
56
  /**
36
- * @param styleElement 样式node
57
+ * 通用样式作用域处理
58
+ * @param styleElement 样式元素
37
59
  * @param app 应用实例
38
60
  */
39
61
  commonScoped(styleElement: HTMLStyleElement, app: BaseModel): void;
62
+ /**
63
+ * 创建样式元素
64
+ */
40
65
  createStyleElement(): HTMLStyleElement;
41
66
  /**
67
+ * 执行样式代码
42
68
  * @param app 应用实例
43
69
  * @returns 返回执行后的style标签
44
70
  */
45
71
  executeCode(app: BaseModel): Promise<HTMLStyleElement>;
72
+ /**
73
+ * 获取样式代码
74
+ */
46
75
  getCode(app?: BaseModel): Promise<string>;
76
+ /**
77
+ * 检查并链接基础应用样式
78
+ * @param styleElement 样式元素
79
+ * @param app 应用实例
80
+ * @returns 是否已链接基础样式
81
+ */
47
82
  linkedBaseStyle(styleElement: HTMLStyleElement, app: BaseModel): boolean;
48
- resetPackRule(rule: CSSMediaRule | CSSSupportsRule, prefix: string, packName: string): string;
83
+ /**
84
+ * 重置包装规则
85
+ */
86
+ resetPackRule(rule: PackRuleType, prefix: string, packName: string): string;
87
+ /**
88
+ * 重置URL地址
89
+ */
49
90
  resetUrlHost(cssText: string, uri: string, linkPath?: string): string;
91
+ /**
92
+ * css rule 处理
93
+ */
50
94
  scopeRule(rules: CSSRule[], cssPrefix: string): string;
95
+ /**
96
+ * style rule 处理
97
+ */
51
98
  scopeStyleRule(rule: CSSStyleRule, prefix: string): string;
99
+ /**
100
+ * link style 处理
101
+ */
52
102
  scopedLinkCSS(app: BaseModel, linkElement: HTMLLinkElement): HTMLStyleElement;
103
+ /**
104
+ * 隔离 style
105
+ */
53
106
  scopedStyleCSS(app: BaseModel, styleElement: HTMLStyleElement): HTMLStyleElement;
107
+ /**
108
+ * 应用隔离 style
109
+ */
110
+ private applyScopedCSS;
111
+ private applyUnscopedCSS;
112
+ /**
113
+ * 处理ShadowRoot中的字体
114
+ */
115
+ private handleShadowRootFonts;
116
+ private getCodeFromAppSource;
117
+ private getCodeFromCache;
118
+ private fetchCodeFromRemote;
119
+ private clearStyleElement;
120
+ private buildBaseURI;
121
+ private handleExistingCode;
122
+ /**
123
+ * 处理href属性
124
+ */
125
+ private handleHrefAttribute;
126
+ /**
127
+ * 处理缺失的href
128
+ */
129
+ private handleMissingHref;
130
+ private processExistingContent;
131
+ private observeContentChanges;
54
132
  }
55
133
 
134
+ /**
135
+ * 应用缓存管理器
136
+ * @description 负责管理所有微应用实例的缓存、资源共享和状态跟踪
137
+ */
56
138
  declare class AppCache {
57
- private baseSource;
58
- private cache;
139
+ /** 基础资源源,用于主应用共享资源包 */
140
+ private readonly baseSource;
141
+ /** 应用实例缓存映射表 */
142
+ private readonly cache;
143
+ /**
144
+ * 构造函数
145
+ * @description 初始化应用缓存管理器
146
+ */
59
147
  constructor();
60
- deleteApp(url: string): void;
148
+ /**
149
+ * 设置应用实例到缓存
150
+ * @description 将应用实例添加到缓存中,使用应用的缓存键作为标识
151
+ * @param app - 要缓存的应用实例
152
+ * @returns void
153
+ */
154
+ setApp(app: BaseModel): void;
155
+ /**
156
+ * 获取缓存的应用实例
157
+ * @description 根据名称或ID获取已缓存的应用实例
158
+ * @param name - 应用名称或ID,为空时返回 undefined
159
+ * @returns BaseModel | undefined - 应用实例或 undefined
160
+ */
61
161
  getApp(name?: null | string): BaseModel | undefined;
62
- getBaseAppStyle(urlOrCode: string): Style | undefined;
162
+ /**
163
+ * 删除缓存的应用实例
164
+ * @description 从缓存中移除指定URL的应用实例
165
+ * @param url - 要删除的应用URL标识
166
+ * @returns void
167
+ */
168
+ deleteApp(url: string): void;
169
+ /**
170
+ * 获取缓存的HTML内容
171
+ * @description 根据URL获取已缓存的HTML内容
172
+ * @param url - 应用的URL
173
+ * @returns string - HTML内容,未找到时返回空字符串
174
+ */
63
175
  getCacheHtml(url: string): string;
64
- getCacheScript(url: string): Script | undefined;
65
- getCacheStyle(url: string): Style | undefined;
66
- setApp(app: BaseModel): void;
176
+ /**
177
+ * 设置基础应用脚本
178
+ * @description 将脚本添加到基础资源源中,供多个应用共享
179
+ * @param url - 脚本的URL
180
+ * @param script - 脚本实例
181
+ * @returns void
182
+ */
67
183
  setBaseAppScript(url: string, script: Script): void;
184
+ /**
185
+ * 获取缓存的脚本资源
186
+ * @description 从基础资源源或应用缓存中获取脚本资源
187
+ * @param url - 脚本的URL
188
+ * @returns Script | undefined - 脚本实例或 undefined
189
+ */
190
+ getCacheScript(url: string): Script | undefined;
191
+ /**
192
+ * 设置基础应用样式
193
+ * @description 将样式添加到基础资源源中,供多个应用共享
194
+ * @param url - 样式的URL
195
+ * @param style - 样式实例
196
+ * @returns void
197
+ */
68
198
  setBaseAppStyle(url: string, style: Style): void;
199
+ /**
200
+ * 获取基础应用样式
201
+ * @description 从基础资源源中获取样式资源
202
+ * @param urlOrCode - 样式的URL或代码
203
+ * @returns Style | undefined - 样式实例或 undefined
204
+ */
205
+ getBaseAppStyle(urlOrCode: string): Style | undefined;
206
+ /**
207
+ * 获取缓存的样式资源
208
+ * @description 从基础资源源或应用缓存中获取样式资源
209
+ * @param url - 样式的URL
210
+ * @returns Style | undefined - 样式实例或 undefined
211
+ */
212
+ getCacheStyle(url: string): Style | undefined;
213
+ /**
214
+ * 检查是否存在活跃的应用
215
+ * @description 判断当前是否有处于非卸载状态的应用实例
216
+ * @returns boolean - 存在活跃应用时返回 true
217
+ */
69
218
  get hasActiveApp(): boolean;
70
219
  }
71
220
 
72
- declare enum AppState {
73
- ACTIVATED = "ACTIVATED",// 激活
74
- DEACTIVATED = "DEACTIVATED",// 未激活
75
- ERROR = "ERROR",// Error
76
- LOADED = "LOADED",// 加载完成
77
- LOADING = "LOADING",// 加载中
78
- MOUNTED = "MOUNTED",// 挂载完成
79
- MOUNTING = "MOUNTING",// 挂载中
80
- UNMOUNT = "UNMOUNT",// 卸载
81
- UNSET = "UNSET"
82
- }
221
+ /**
222
+ * 应用状态常量
223
+ * 定义微前端应用的生命周期状态
224
+ */
225
+ declare const AppState: {
226
+ /** 未设置状态 */
227
+ readonly UNSET: "UNSET";
228
+ /** 加载中 */
229
+ readonly LOADING: "LOADING";
230
+ /** 加载完成 */
231
+ readonly LOADED: "LOADED";
232
+ /** 挂载中 */
233
+ readonly MOUNTING: "MOUNTING";
234
+ /** 挂载完成 */
235
+ readonly MOUNTED: "MOUNTED";
236
+ /** 激活状态 */
237
+ readonly ACTIVATED: "ACTIVATED";
238
+ /** 未激活状态 */
239
+ readonly DEACTIVATED: "DEACTIVATED";
240
+ /** 卸载状态 */
241
+ readonly UNMOUNT: "UNMOUNT";
242
+ /** 错误状态 */
243
+ readonly ERROR: "ERROR";
244
+ };
245
+ type KeyOfAppState = keyof typeof AppState;
246
+ type ValueOfAppState = (typeof AppState)[KeyOfAppState];
83
247
 
248
+ /**
249
+ * BK WEWEB 支持的自定义属性枚举
250
+ * @description 定义了 bk-weweb 自定义元素支持的所有属性配置
251
+ */
84
252
  declare enum WewebCustomAttrs {
85
- data = "data",// 传递给子应用的数据
86
- id = "id",// 应用id
87
- keepAlive = "keepAlive",// 是否缓存
88
- mode = "mode",// 模式
89
- scopeCss = "scopeCss",// 是否开启css隔离
90
- scopeJs = "scopeJs",// 是否开启js隔离
91
- scopeLocation = "scopeLocation",// 是否开启location隔离
92
- setShodowDom = "setShodowDom",// 是否开启shadowDom
93
- showSourceCode = "showSourceCode",// 是否显示源码
253
+ /** 传递给子应用的数据 */
254
+ data = "data",
255
+ /** 应用唯一标识符 */
256
+ id = "id",
257
+ /** 是否启用缓存模式 */
258
+ keepAlive = "keepAlive",
259
+ /** 应用运行模式 */
260
+ mode = "mode",
261
+ /** 是否开启 CSS 样式隔离 */
262
+ scopeCss = "scopeCss",
263
+ /** 是否开启 JavaScript 隔离 */
264
+ scopeJs = "scopeJs",
265
+ /** 是否开启 location 路由隔离 */
266
+ scopeLocation = "scopeLocation",
267
+ /** 是否启用 Shadow DOM */
268
+ setShodowDom = "setShodowDom",
269
+ /** 是否显示源码 */
270
+ showSourceCode = "showSourceCode",
271
+ /** 应用资源 URL */
94
272
  url = "url"
95
273
  }
96
274
 
275
+ type FakeWindow = Window & Record<string, unknown>;
276
+
277
+ /**
278
+ * 微前端沙箱实现类
279
+ * @description 提供应用间的环境隔离,防止全局变量污染,支持多应用并存运行
280
+ */
97
281
  declare class SandBox {
98
- app: BaseModel;
282
+ readonly app: BaseModel;
283
+ /** 沙箱激活状态标识 */
99
284
  private active;
100
- private inRawWindowKeySet;
285
+ /** 记录在原始 window 上新增的属性键集合 */
286
+ private readonly inRawWindowKeySet;
287
+ /** 重置文档和 body 事件的函数 */
101
288
  private resetDocumentAndBodyEvent?;
102
- private resetWindowFunction;
103
- private sameRawWindowKeySet;
104
- fakeWindow: Window & IInjectWindowAttrs;
289
+ /** 重置 window 函数的方法 */
290
+ private readonly resetWindowFunction;
291
+ /** 记录与原始 window 相同的属性键集合 */
292
+ private readonly sameRawWindowKeySet;
293
+ /** 伪造的 window 对象 */
294
+ readonly fakeWindow: FakeWindow & IInjectWindowAttrs;
295
+ /** 代理的 document 对象 */
105
296
  proxyDocument: any;
106
- proxyWindow: WindowProxy & IInjectWindowAttrs;
297
+ /** 代理的 window 对象 */
298
+ readonly proxyWindow: WindowProxy & IInjectWindowAttrs;
299
+ /** 原始 document 对象 */
107
300
  rawDocument: Record<string, any>;
108
- rawWindow: Window;
109
- windowSymbolKey: keyof Window;
301
+ /** 原始 window 对象 */
302
+ readonly rawWindow: Window;
303
+ /** 在 window 上的唯一标识键 */
304
+ readonly windowSymbolKey: keyof Window;
305
+ /**
306
+ * 构造函数
307
+ * @description 初始化沙箱环境,创建代理对象和隔离机制
308
+ * @param app - 关联的微应用实例
309
+ */
110
310
  constructor(app: BaseModel);
111
311
  /**
112
- *
113
- * @param data data for sandbox
114
- * @description active hook for sandbox
312
+ * 处理代理对象的 get 操作
313
+ * @description 统一处理代理对象属性获取的复杂逻辑
314
+ * @param target - 目标对象
315
+ * @param key - 属性键
316
+ * @param rawWindow - 原始 window 对象
317
+ * @returns unknown - 属性值
318
+ * @private
319
+ */
320
+ private handleProxyGet;
321
+ /**
322
+ * 处理代理对象的 set 操作
323
+ * @description 统一处理代理对象属性设置的复杂逻辑
324
+ * @param target - 目标对象
325
+ * @param key - 属性键
326
+ * @param value - 属性值
327
+ * @param rawWindow - 原始 window 对象
328
+ * @returns boolean - 设置是否成功
329
+ * @private
330
+ */
331
+ private handleProxySet;
332
+ /**
333
+ * 判断是否应该使用 iframe 的 location
334
+ * @description 检查是否在 iframe 模式下访问 location 相关属性
335
+ * @param key - 属性键
336
+ * @returns boolean - 是否使用 iframe location
337
+ * @private
338
+ */
339
+ private shouldUseIframeLocation;
340
+ /**
341
+ * 创建 getComputedStyle 方法的代理
342
+ * @description 为 getComputedStyle 方法创建安全的代理实现
343
+ * @param rawWindow - 原始 window 对象
344
+ * @returns Function - 代理后的 getComputedStyle 方法
345
+ * @private
346
+ */
347
+ private createGetComputedStyleProxy;
348
+ /**
349
+ * 判断是否应该在目标对象上设置属性
350
+ * @description 检查属性设置的逻辑条件
351
+ * @param target - 目标对象
352
+ * @param key - 属性键
353
+ * @param rawWindow - 原始 window 对象
354
+ * @returns boolean - 是否在目标对象上设置
355
+ * @private
356
+ */
357
+ private shouldSetOnTarget;
358
+ /**
359
+ * 在目标对象上设置属性
360
+ * @description 安全地在目标对象上设置属性,保持描述符特性
361
+ * @param target - 目标对象
362
+ * @param key - 属性键
363
+ * @param value - 属性值
364
+ * @param rawWindow - 原始 window 对象
365
+ * @private
366
+ */
367
+ private setPropertyOnTarget;
368
+ /**
369
+ * 处理白名单属性
370
+ * @description 处理需要在原始 window 上设置的白名单属性
371
+ * @param key - 属性键
372
+ * @param value - 属性值
373
+ * @param rawWindow - 原始 window 对象
374
+ * @private
375
+ */
376
+ private handleWhiteListProperty;
377
+ /**
378
+ * 激活沙箱
379
+ * @description 启动沙箱环境,初始化代理对象和事件处理
380
+ * @param data - 传递给沙箱的数据(可选)
381
+ * @returns void
115
382
  */
116
383
  activated(data?: Record<string, unknown>): void;
117
384
  /**
118
- *
119
- * @description decativated hook for sandbox
385
+ * 停用沙箱
386
+ * @description 关闭沙箱环境,清理所有副作用和修改
387
+ * @returns void
120
388
  */
121
389
  deactivated(): void;
122
390
  }
@@ -124,9 +392,14 @@ declare class SandBox {
124
392
  type SourceFuncType = () => Promise<string[]>;
125
393
  type SourceType = SourceFuncType | string[];
126
394
 
395
+ type ContainerType$2 = HTMLElement | ShadowRoot;
396
+ type AppCallback = (app: BaseModel) => void;
397
+ /**
398
+ * BK-WEWEB 微微应用模式类
399
+ */
127
400
  declare class MicroAppModel implements BaseModel {
128
401
  private state;
129
- container?: HTMLElement | ShadowRoot;
402
+ container?: ContainerType$2;
130
403
  data: Record<string, unknown>;
131
404
  iframe: HTMLIFrameElement | null;
132
405
  initSource: SourceType;
@@ -142,22 +415,106 @@ declare class MicroAppModel implements BaseModel {
142
415
  showSourceCode: boolean;
143
416
  source?: EntrySource;
144
417
  url: string;
145
- constructor(props: IAppModleProps);
146
- activated(container: HTMLElement | ShadowRoot, callback?: (app: BaseModel) => void): void;
418
+ constructor(props: IAppModelProps);
419
+ /**
420
+ * 激活微应用
421
+ */
422
+ activated(container: ContainerType$2, callback?: AppCallback): void;
423
+ /**
424
+ * 创建隔离iframe
425
+ */
147
426
  createIframe(): Promise<HTMLIFrameElement>;
427
+ /**
428
+ * 停用微应用
429
+ */
148
430
  deactivated(): void;
431
+ /**
432
+ * 初始化ShadowRoot容器
433
+ */
149
434
  initShadowRootContainer(): void;
150
- mount(container?: HTMLElement | ShadowRoot, callback?: (app: BaseModel) => void): void;
435
+ /**
436
+ * 挂载微应用
437
+ */
438
+ mount(container?: ContainerType$2, callback?: AppCallback): void;
439
+ /**
440
+ * 错误处理
441
+ */
151
442
  onError(): void;
443
+ /**
444
+ * 挂载处理
445
+ */
152
446
  onMount(): void;
447
+ /**
448
+ * 注册运行中的微应用
449
+ */
153
450
  registerRunningApp(): void;
451
+ /**
452
+ * 启动微应用
453
+ */
154
454
  start(): Promise<void>;
455
+ /**
456
+ * 卸载微应用
457
+ */
155
458
  unmount(needDestroy?: boolean): void;
459
+ /**
460
+ * 获取微应用缓存键
461
+ */
156
462
  get appCacheKey(): string;
157
- get status(): AppState;
158
- set status(v: AppState);
463
+ /**
464
+ * 获取微应用状态
465
+ */
466
+ get status(): ValueOfAppState;
467
+ /**
468
+ * 设置微应用状态
469
+ */
470
+ set status(value: ValueOfAppState);
471
+ /**
472
+ * 初始化沙盒
473
+ */
474
+ private initializeSandBox;
475
+ /**
476
+ * 设置容器属性
477
+ */
478
+ private setContainerAttribute;
479
+ /**
480
+ * 转移节点到新容器
481
+ */
482
+ private transferNodes;
483
+ /**
484
+ * 设置节点属性
485
+ */
486
+ private setupNodeProperties;
487
+ /**
488
+ * 创建iframe元素
489
+ */
490
+ private createIframeElement;
491
+ /**
492
+ * 构建iframe的src地址
493
+ */
494
+ private buildIframeSrc;
495
+ /**
496
+ * 检查是否为Chrome用户代理
497
+ */
498
+ private isChromeUserAgent;
499
+ /**
500
+ * 处理非Chrome浏览器的iframe
501
+ */
502
+ private handleNonChromeIframe;
503
+ /**
504
+ * 渲染微应用内容
505
+ */
506
+ private renderAppContent;
507
+ /**
508
+ * 检查是否需要重新加载
509
+ */
510
+ private needsReload;
159
511
  }
160
512
 
513
+ interface CollectResult {
514
+ replace: Comment | Element;
515
+ style?: Style;
516
+ script?: Script;
517
+ }
161
518
  declare class EntrySource {
162
519
  url: string;
163
520
  html: HTMLElement | null;
@@ -165,82 +522,256 @@ declare class EntrySource {
165
522
  scripts: Map<string, Script>;
166
523
  styles: Map<string, Style>;
167
524
  constructor(url: string);
168
- collectLink(link: HTMLLinkElement, parent: Node, needReplaceELement?: boolean): {
525
+ /**
526
+ * 收集链接元素
527
+ */
528
+ collectLink: (link: HTMLLinkElement, parent: Node, needReplaceElement?: boolean) => {
169
529
  replace: Comment | Element;
170
530
  style?: Style;
171
531
  };
172
- collectScript(script: HTMLScriptElement, parent: Node, needReplaceELement?: boolean): {
173
- replace: Comment | Element;
174
- script?: Script;
175
- } | undefined;
176
- collectScriptAndStyle(parent: HTMLElement): void;
177
- getScript(url: string): Script | undefined;
178
- getStyle(urlOrCode: string): Style | undefined;
532
+ /**
533
+ * 收集脚本元素
534
+ */
535
+ collectScript: (script: HTMLScriptElement, parent: Node, needReplaceElement?: boolean) => CollectResult | undefined;
536
+ /**
537
+ * 收集样式和脚本
538
+ */
539
+ collectScriptAndStyle: (parent: HTMLElement) => void;
540
+ getScript: (url: string) => Script | undefined;
541
+ getStyle: (urlOrCode: string) => Style | undefined;
542
+ /**
543
+ * 导入入口资源
544
+ */
179
545
  importEntry(app: BaseModel): Promise<void>;
546
+ /**
547
+ * 导入HTML入口
548
+ */
180
549
  importHtmlEntry(app: MicroAppModel): Promise<void>;
550
+ /**
551
+ * 导入实例入口
552
+ */
181
553
  importInstanceEntry(app: BaseModel): Promise<void>;
182
- setScript(url: string, script: IScriptOption | Script): void;
183
- setStyle(url: string, style: Style): void;
554
+ setScript: (url: string, script: IScriptOption | Script) => void;
555
+ setStyle: (url: string, style: Style) => void;
556
+ /**
557
+ * 处理样式表链接
558
+ */
559
+ private handleStylesheetLink;
560
+ /**
561
+ * 处理图标链接
562
+ */
563
+ private handleIconLink;
564
+ /**
565
+ * 检查是否应该忽略脚本
566
+ */
567
+ private shouldIgnoreScript;
568
+ /**
569
+ * 处理被排除的脚本
570
+ */
571
+ private handleExcludedScript;
572
+ /**
573
+ * 处理外部脚本
574
+ */
575
+ private handleExternalScript;
576
+ /**
577
+ * 处理内联脚本
578
+ */
579
+ private handleInlineScript;
580
+ /**
581
+ * 处理链接元素
582
+ */
583
+ private processLinks;
584
+ /**
585
+ * 处理样式元素
586
+ */
587
+ private processStyles;
588
+ /**
589
+ * 处理脚本元素
590
+ */
591
+ private processScripts;
592
+ /**
593
+ * 处理Meta元素
594
+ */
595
+ private processMetas;
596
+ /**
597
+ * 处理图片元素
598
+ */
599
+ private processImages;
600
+ /**
601
+ * 加载初始资源
602
+ */
603
+ private loadInitialSources;
604
+ /**
605
+ * 获取HTML content
606
+ */
607
+ private fetchHtmlContent;
608
+ /**
609
+ * 创建顶层 root 元素
610
+ */
611
+ private createWrapElement;
612
+ /**
613
+ * 获取JS content
614
+ */
615
+ private fetchJsContent;
184
616
  }
185
617
 
186
- declare function fetchSource(url: string, options?: {}, app?: BaseModel): Promise<string>;
618
+ type FetchOptions = Record<string, unknown>;
619
+ /**
620
+ * 统一的资源获取方法,支持应用级别和全局级别的自定义fetch
621
+ * 优先级:应用级fetchSource > 全局fetchSource > 原生fetch
622
+ * @param url 要获取的资源URL
623
+ * @param options fetch请求选项,默认为空对象
624
+ * @param app 可选的应用实例,如果提供且有自定义fetchSource则优先使用
625
+ * @returns Promise<string> 返回资源内容的Promise,失败时返回空字符串
626
+ */
627
+ declare const fetchSource: (url: string, options?: FetchOptions, app?: BaseModel) => Promise<string>;
187
628
 
629
+ /**
630
+ * WEWEB模式枚举
631
+ */
632
+ declare enum WewebMode {
633
+ /** 应用模式 */
634
+ APP = "app",
635
+ /** 配置模式 */
636
+ CONFIG = "config",
637
+ /** 实例模式 */
638
+ INSTANCE = "js"
639
+ }
640
+ type ContainerType$1 = HTMLElement | ShadowRoot;
641
+ type CallbackFunction<T = unknown> = (instance: BaseModel, exportInstance?: T) => void;
642
+ /**
643
+ * 基础模型属性接口
644
+ */
188
645
  interface IBaseModelProps {
646
+ /** entry模式:js | config | html,默认html */
189
647
  [WewebCustomAttrs.mode]?: WewebMode;
648
+ /** URL地址(必选) */
190
649
  [WewebCustomAttrs.url]: string;
191
- id?: null | string;
650
+ /** 应用ID */
651
+ id?: string | null;
652
+ /** 是否预加载 */
192
653
  isPreLoad?: boolean;
193
654
  }
194
- interface IAppModleProps extends IBaseModelProps {
655
+ /**
656
+ * 微应用模式属性配置接口
657
+ */
658
+ interface IAppModelProps extends IBaseModelProps {
659
+ /** 传递给子应用的数据,默认保存 */
195
660
  [WewebCustomAttrs.data]?: Record<string, unknown>;
661
+ /** 是否缓存DOM */
196
662
  [WewebCustomAttrs.keepAlive]?: boolean;
663
+ /** 是否启用样式隔离,默认隔离 */
197
664
  [WewebCustomAttrs.scopeCss]?: boolean;
665
+ /** 是否使用沙盒隔离,默认隔离 */
198
666
  [WewebCustomAttrs.scopeJs]?: boolean;
667
+ /** 是否共享主应用路由 */
199
668
  [WewebCustomAttrs.scopeLocation]?: boolean;
669
+ /** 是否使用shadowDom */
200
670
  [WewebCustomAttrs.setShodowDom]?: boolean;
671
+ /** 是否在dom上显示源码,默认不显示内存执行 */
201
672
  [WewebCustomAttrs.showSourceCode]?: boolean;
202
- container?: HTMLElement | ShadowRoot | null;
673
+ /** 容器元素 */
674
+ container?: ContainerType$1 | null;
675
+ /** 初始化资源,如 ['http://www.hostname.com/a.js', 'http://www.hostname.com/b.css'] */
203
676
  initSource?: SourceType;
204
677
  }
678
+ /**
679
+ * 微模块模式属性配置接口
680
+ */
205
681
  interface IJsModelProps extends IBaseModelProps {
682
+ /** 传递给实例render方法的数据 */
206
683
  [WewebCustomAttrs.data]?: Record<string, unknown>;
684
+ /** 是否在dom上显示源码,默认显示 */
207
685
  [WewebCustomAttrs.showSourceCode]?: boolean;
208
- container?: HTMLElement | ShadowRoot | null;
686
+ /** 容器元素 */
687
+ container?: ContainerType$1 | null;
688
+ /** 初始化资源,如 ['http://www.hostname.com/a.js', 'http://www.hostname.com/b.css'] */
209
689
  initSource?: SourceType;
690
+ /** 是否缓存DOM */
210
691
  keepAlive?: boolean;
692
+ /** 是否启用样式隔离,默认隔离 */
211
693
  scopeCss?: boolean;
694
+ /** 是否使用沙盒隔离,默认不隔离 */
212
695
  scopeJs?: boolean;
213
696
  }
697
+ /**
698
+ * 基础模型接口
699
+ */
214
700
  interface BaseModel {
215
- activated<T>(container: HTMLElement | ShadowRoot, callback?: (instance: BaseModel, exportInstance?: T) => void): void;
216
- container?: HTMLElement | ShadowRoot;
217
- deactivated(): void;
218
- get appCacheKey(): string;
219
- get status(): AppState;
701
+ /** 应用缓存键 */
702
+ readonly appCacheKey: string;
703
+ /** 容器元素 */
704
+ container?: ContainerType$1;
705
+ /** 初始化资源 */
220
706
  initSource?: SourceType;
707
+ /** 是否为模块应用 */
221
708
  isModuleApp?: boolean;
709
+ /** 是否预加载 */
222
710
  isPreLoad: boolean;
711
+ /** 是否保持活跃 */
223
712
  keepAlive?: boolean;
224
- mount<T>(container?: HTMLElement | ShadowRoot, callback?: (instance: BaseModel, exportInstance?: T) => void): void;
713
+ /** 应用名称 */
225
714
  name: string;
226
- onError(): void;
227
- onMount(): void;
228
- registerRunningApp(): void;
715
+ /** 沙盒实例 */
229
716
  sandBox?: SandBox;
717
+ /** 是否启用样式隔离,默认隔离 */
230
718
  scopeCss?: boolean;
719
+ /** 是否使用JS隔离 */
231
720
  scopeJs: boolean;
232
- set status(v: AppState);
721
+ /** 是否显示源码 */
233
722
  showSourceCode?: boolean;
723
+ /** 入口资源 */
234
724
  source?: EntrySource;
235
- start(): Promise<void>;
236
- unmount(needDestroy?: boolean): void;
725
+ /** 应用URL */
237
726
  url: string;
727
+ /** 获取资源的函数 */
238
728
  fetchSource?: typeof fetchSource;
239
- }
240
- declare enum WewebMode {
241
- APP = "app",
242
- CONFIG = "config",
243
- INSTANCE = "js"
729
+ /**
730
+ * 激活应用
731
+ * @param container 容器元素
732
+ * @param callback 回调函数
733
+ */
734
+ activated<T = unknown>(container: ContainerType$1, callback?: CallbackFunction<T>): void;
735
+ /**
736
+ * 停用应用
737
+ */
738
+ deactivated(): void;
739
+ /**
740
+ * 挂载应用
741
+ * @param container 容器元素
742
+ * @param callback 回调函数
743
+ */
744
+ mount<T = unknown>(container?: ContainerType$1, callback?: CallbackFunction<T>): void;
745
+ /**
746
+ * 错误处理
747
+ */
748
+ onError(): void;
749
+ /**
750
+ * 挂载处理
751
+ */
752
+ onMount(): void;
753
+ /**
754
+ * 注册运行中的应用
755
+ */
756
+ registerRunningApp(): void;
757
+ /**
758
+ * 启动应用
759
+ */
760
+ start(): Promise<void>;
761
+ /**
762
+ * 卸载应用
763
+ * @param needDestroy 是否需要销毁
764
+ */
765
+ unmount(needDestroy?: boolean): void;
766
+ /**
767
+ * 获取应用状态
768
+ */
769
+ get status(): ValueOfAppState;
770
+ /**
771
+ * 设置应用状态
772
+ * @param value 状态值
773
+ */
774
+ set status(value: ValueOfAppState);
244
775
  }
245
776
 
246
777
  declare global {
@@ -251,40 +782,71 @@ declare global {
251
782
  }
252
783
  interface Node {
253
784
  __BK_WEWEB_APP_KEY__?: string;
254
- __KEEP_ALIVE__?: string;
255
- data?: any;
785
+ __KEEP_ALIVE__?: boolean;
786
+ data?: unknown;
256
787
  }
257
788
  }
258
789
 
259
790
  /**
260
- * 接口定义:样式选项
791
+ * 资源加载相关类型定义
792
+ * @description 定义了样式、脚本等资源的配置选项和相关类型
793
+ */
794
+ /**
795
+ * 样式资源配置选项接口
796
+ * @description 定义样式文件的加载配置和属性信息
261
797
  */
262
798
  interface IStyleOption {
799
+ /** 样式代码内容 */
263
800
  code: string;
801
+ /** 是否来自 HTML 页面内联样式 */
264
802
  fromHtml: boolean;
803
+ /** 是否为初始样式(可选) */
265
804
  initial?: boolean;
805
+ /** 是否预取样式资源(可选) */
266
806
  prefetch?: boolean;
807
+ /** 是否预加载样式资源(可选) */
267
808
  preload?: boolean;
809
+ /** 样式文件的 URL 地址(可选) */
268
810
  url?: string;
269
811
  }
812
+ /**
813
+ * 脚本资源配置选项接口
814
+ * @description 定义脚本文件的加载配置和属性信息
815
+ */
270
816
  interface IScriptOption {
817
+ /** 是否为异步加载脚本 */
271
818
  async: boolean;
819
+ /** 脚本代码内容 */
272
820
  code: string;
821
+ /** 是否为延迟执行脚本 */
273
822
  defer: boolean;
823
+ /** 是否从 HTML 页面中提取的脚本 */
274
824
  fromHtml: boolean;
825
+ /** 是否为初始脚本(可选) */
275
826
  initial?: boolean;
827
+ /** 是否为 ES6 模块类型脚本 */
276
828
  isModule: boolean;
829
+ /** 脚本文件的 URL 地址(可选) */
277
830
  url?: string;
278
831
  }
279
832
 
280
833
  /**
281
- * Interface for injecting window attributes.
834
+ * 沙箱环境配置类型定义
835
+ */
836
+ /**
837
+ * 注入到子应用 window 对象的属性接口
838
+ * @description 定义了 BK WEWEB 平台注入到子应用环境中的必要属性
282
839
  */
283
840
  interface IInjectWindowAttrs {
841
+ /** BK WEWEB平台的应用唯一标识 */
284
842
  __BK_WEWEB_APP_KEY__: string;
843
+ /** BK WEWEB的附加数据,可包含配置信息、用户数据等 */
285
844
  __BK_WEWEB_DATA__: Record<string, unknown>;
845
+ /** 标识页面是否由BK WEWEB驱动的布尔值 */
286
846
  __POWERED_BY_BK_WEWEB__: boolean;
847
+ /** 原始 document 对象的引用 */
287
848
  rawDocument: Document;
849
+ /** 原始 window 对象的引用 */
288
850
  rawWindow: Window;
289
851
  }
290
852
 
@@ -292,18 +854,40 @@ type FetchSourceType = (url: string, options: Record<string, unknown>) => Promis
292
854
  interface IStartOption {
293
855
  collectBaseSource?: boolean;
294
856
  fetchSource?: FetchSourceType;
295
- webcomponentTag?: string;
857
+ webComponentTag?: string;
296
858
  }
297
859
 
860
+ /**
861
+ * 激活指定应用
862
+ * @description 激活已失活的应用或挂载新应用,支持 keep-alive 模式的应用状态恢复
863
+ * @template T - 导出实例的类型
864
+ * @param appKey - 应用的唯一标识符
865
+ * @param container - 挂载容器,HTMLElement 或 ShadowRoot
866
+ * @param callback - 激活完成后的回调函数(可选)
867
+ * @returns void
868
+ */
298
869
  declare function activated<T>(appKey: string, container: HTMLElement | ShadowRoot, callback?: <M extends BaseModel>(instance: M, exportInstance?: T) => void): void;
299
870
 
871
+ /**
872
+ * 失活指定应用
873
+ * @description 将指定应用设置为失活状态,根据 keep-alive 配置决定是失活还是卸载
874
+ * @param appKey - 应用的唯一标识符
875
+ * @returns void
876
+ */
300
877
  declare function deactivated(appKey: string): void;
301
878
 
879
+ type ContainerType = HTMLElement | ShadowRoot;
880
+ type InstanceCallback<T = unknown> = (instance: BaseModel, exportInstance?: T) => void;
881
+ type MountCallback<T = unknown> = (instance: MicroInstanceModel, exportInstance: T) => void;
882
+ /**
883
+ * BK-WEWEB 微模块模式类
884
+ */
302
885
  declare class MicroInstanceModel implements BaseModel {
303
886
  private state;
304
887
  appCacheKey: string;
305
- container?: HTMLElement | ShadowRoot;
888
+ container?: ContainerType;
306
889
  data: Record<string, unknown>;
890
+ fetchSource?: typeof fetchSource;
307
891
  initSource: SourceType;
308
892
  isPreLoad: boolean;
309
893
  keepAlive: boolean;
@@ -314,51 +898,184 @@ declare class MicroInstanceModel implements BaseModel {
314
898
  showSourceCode: boolean;
315
899
  source?: EntrySource;
316
900
  url: string;
317
- fetchSource?: typeof fetchSource;
318
901
  constructor(props: IJsModelProps & {
319
902
  fetchSource?: typeof fetchSource;
320
903
  });
321
- activated<T>(container: HTMLElement | ShadowRoot, callback?: (instance: BaseModel, exportInstance?: T) => void): void;
904
+ /**
905
+ * 激活微模块
906
+ */
907
+ activated<T = unknown>(container: ContainerType, callback?: InstanceCallback<T>): void;
908
+ /**
909
+ * 停用微模块
910
+ */
322
911
  deactivated(): void;
323
- mount<T>(container?: HTMLElement | ShadowRoot, callback?: (instance: MicroInstanceModel, exportInstance: T) => void): void;
912
+ /**
913
+ * 挂载微模块
914
+ */
915
+ mount<T = unknown>(container?: ContainerType, callback?: MountCallback<T>): void;
916
+ /**
917
+ * 错误处理
918
+ */
324
919
  onError(): void;
920
+ /**
921
+ * 挂载处理
922
+ */
325
923
  onMount(): void;
924
+ /**
925
+ * 注册运行中的应用
926
+ */
326
927
  registerRunningApp(): void;
928
+ /**
929
+ * 启动微模块
930
+ */
327
931
  start(): Promise<void>;
932
+ /**
933
+ * 卸载微模块
934
+ */
328
935
  unmount(needDestroy?: boolean): void;
329
- set status(v: AppState);
330
- get status(): AppState;
936
+ /**
937
+ * 设置微模块 状态
938
+ */
939
+ set status(value: ValueOfAppState);
940
+ /**
941
+ * 获取微模块 状态
942
+ */
943
+ get status(): ValueOfAppState;
944
+ /**
945
+ * 初始化沙盒
946
+ */
947
+ private initializeSandBox;
948
+ /**
949
+ * 设置容器属性
950
+ */
951
+ private setContainerAttribute;
952
+ /**
953
+ * 转移节点到新容器
954
+ */
955
+ private transferNodes;
956
+ /**
957
+ * 设置容器
958
+ */
959
+ private setupContainer;
960
+ /**
961
+ * 创建微模块 包装器
962
+ */
963
+ private createInstanceWrapper;
964
+ /**
965
+ * 渲染微模块
966
+ */
967
+ private renderInstance;
968
+ /**
969
+ * 获取脚本信息
970
+ */
971
+ private getScriptInfo;
972
+ /**
973
+ * 检查是否需要重新加载
974
+ */
975
+ private needsReload;
331
976
  }
332
977
 
978
+ /**
979
+ * 根据配置模式加载相应的应用或模块实例
980
+ * @description 统一的加载入口,根据模式参数决定加载应用还是模块实例
981
+ * @param props - 基础模型配置参数
982
+ * @returns Promise<BaseModel> - 返回加载的模型实例
983
+ */
333
984
  declare function load(props: IBaseModelProps): Promise<BaseModel>;
334
- declare function loadApp(props: IAppModleProps): Promise<MicroAppModel>;
985
+ /**
986
+ * 加载微应用
987
+ * @description 加载或获取已存在的微应用实例,并启动应用
988
+ * @param props - 应用模型配置参数
989
+ * @returns Promise<MicroAppModel> - 返回微应用模型实例
990
+ */
991
+ declare function loadApp(props: IAppModelProps): Promise<MicroAppModel>;
992
+ /**
993
+ * 加载模块实例
994
+ * @description 加载或获取已存在的模块实例,支持状态监听和异步等待
995
+ * @param props - 模块实例配置参数
996
+ * @returns Promise<MicroInstanceModel> - 返回模块实例模型
997
+ */
335
998
  declare function loadInstance(props: IJsModelProps): Promise<MicroInstanceModel>;
336
999
 
1000
+ /**
1001
+ * 挂载应用到指定容器
1002
+ * @description 将已加载的应用挂载到指定的 DOM 容器或 ShadowRoot 中
1003
+ * @template T - 导出实例的类型
1004
+ * @param appKey - 应用的唯一标识符
1005
+ * @param container - 挂载容器,可以是 HTMLElement 或 ShadowRoot(可选)
1006
+ * @param callback - 挂载完成后的回调函数(可选)
1007
+ * @returns void
1008
+ */
337
1009
  declare function mount<T>(appKey: string, container?: HTMLElement | ShadowRoot, callback?: <M extends BaseModel>(instance: M, exportInstance?: T) => void): void;
338
1010
 
1011
+ /**
1012
+ * 卸载并删除指定应用
1013
+ * @description 从缓存中完全删除指定的应用实例,释放相关资源
1014
+ * @param url - 应用的 URL 标识符,用于定位要删除的应用
1015
+ * @returns void
1016
+ */
339
1017
  declare function unload(url: string): void;
340
1018
 
1019
+ /**
1020
+ * 卸载指定应用
1021
+ * @description 卸载指定的应用实例,并在没有活跃应用时重置全局方法
1022
+ * @param appKey - 应用的唯一标识符
1023
+ * @returns void
1024
+ */
341
1025
  declare function unmount(appKey: string): void;
342
1026
 
343
1027
  /**
344
- * @param options 加载模块的参数
345
- * @description 预加载实例
1028
+ * 预加载模块实例
1029
+ * @description 在浏览器空闲时预加载指定的模块实例,提前准备资源以提升后续加载性能
1030
+ * @param options - 模块加载配置参数
1031
+ * @param options.isPreLoad - 将被自动设置为 true,标识这是预加载操作
1032
+ * @returns void
1033
+ * @example
1034
+ * ```typescript
1035
+ * preLoadInstance({
1036
+ * name: 'my-module',
1037
+ * url: 'https://example.com/module.js'
1038
+ * });
1039
+ * ```
346
1040
  */
347
1041
  declare function preLoadInstance(options: IJsModelProps): void;
348
1042
  /**
349
- * @param options 加载应用的参数
350
- * @description 预加载应用
1043
+ * 预加载微应用
1044
+ * @description 在浏览器空闲时预加载指定的微应用,提前准备应用资源以提升后续加载性能
1045
+ * @param options - 应用加载配置参数
1046
+ * @param options.isPreLoad - 将被自动设置为 true,标识这是预加载操作
1047
+ * @returns void
1048
+ * @example
1049
+ * ```typescript
1050
+ * preLoadApp({
1051
+ * name: 'my-app',
1052
+ * entry: 'https://example.com/app/'
1053
+ * });
1054
+ * ```
351
1055
  */
352
- declare function preLoadApp(options: IAppModleProps): void;
1056
+ declare function preLoadApp(options: IAppModelProps): void;
353
1057
  /**
354
- * @param sourceList 要预加载的资源列表
355
- * @description 预加载资源
1058
+ * 预加载全局资源
1059
+ * @description 在浏览器空闲时预加载指定的全局资源列表,包括样式文件、脚本文件等
1060
+ * @param sourceList - 要预加载的资源列表,可以是单个资源或资源数组
1061
+ * @returns void
1062
+ * @example
1063
+ * ```typescript
1064
+ * // 预加载单个资源
1065
+ * preLoadSource('https://example.com/style.css');
1066
+ *
1067
+ * // 预加载多个资源
1068
+ * preLoadSource([
1069
+ * 'https://example.com/style.css',
1070
+ * 'https://example.com/script.js'
1071
+ * ]);
1072
+ * ```
356
1073
  */
357
1074
  declare function preLoadSource(sourceList: SourceType): void;
358
1075
 
359
1076
  declare class WeWeb {
360
1077
  fetchSource?: FetchSourceType;
361
- webcomponentTag: string;
1078
+ webComponentTag: string;
362
1079
  constructor();
363
1080
  setWebComponentTag(): void;
364
1081
  start(option?: IStartOption): void;