From 8a83fc9b5c0bca17bc3be5f1d7907ce5c886999d Mon Sep 17 00:00:00 2001 From: SoberZ <710411486@qq.com> Date: Wed, 19 Oct 2022 19:59:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B5=84=E4=BA=A7=E5=8C=85=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=B8=80=E4=B8=AApackage=E4=BB=8E=E5=8F=A6=E4=B8=80?= =?UTF-8?q?=E4=B8=AApackage=E5=BC=82=E6=AD=A5=E5=AF=BC=E5=87=BA=20(#1150)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/src/builtin-simulator/host.ts | 21 +++++++++++++++++-- .../src/builtin-simulator/renderer.ts | 1 + packages/types/src/assets.ts | 8 +++++++ packages/utils/src/asset.ts | 9 +++++++- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 35494a32a..5e2a0442c 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -352,9 +352,11 @@ export class BuiltinSimulatorHost implements ISimulatorHost { + const { exportMode, exportSourceLibrary } = item; this.libraryMap[item.package] = item.library; if (item.async) { this.asyncLibraryMap[item.package] = item; @@ -364,6 +366,11 @@ export class BuiltinSimulatorHost implements ISimulatorHostwindow.${item.library}});`, ); } + if (exportMode === 'functionCall' && exportSourceLibrary) { + functionCallLibraryExportList.push( + `window["${item.library}"] = window["${exportSourceLibrary}"]("${item.library}", "${item.package}");`, + ); + } if (item.editUrls) { libraryAsset.push(item.editUrls); } else if (item.urls) { @@ -372,7 +379,7 @@ export class BuiltinSimulatorHost implements ISimulatorHost 0) { // 加载异步Library await renderer.loadAsyncLibrary(this.asyncLibraryMap); + Object.keys(this.asyncLibraryMap).forEach(key => { + delete this.asyncLibraryMap[key]; + }); } // step 5 ready & render @@ -447,7 +457,14 @@ export class BuiltinSimulatorHost implements ISimulatorHost 0) { + // 加载异步Library + await this.renderer?.loadAsyncLibrary(this.asyncLibraryMap); + Object.keys(this.asyncLibraryMap).forEach(key => { + delete this.asyncLibraryMap[key]; + }); + } } setupEvents() { diff --git a/packages/designer/src/builtin-simulator/renderer.ts b/packages/designer/src/builtin-simulator/renderer.ts index 7f0934252..32c0e2567 100644 --- a/packages/designer/src/builtin-simulator/renderer.ts +++ b/packages/designer/src/builtin-simulator/renderer.ts @@ -11,6 +11,7 @@ export interface BuiltinSimulatorRenderer { setNativeSelection(enableFlag: boolean): void; setDraggingState(state: boolean): void; setCopyState(state: boolean): void; + loadAsyncLibrary(asyncMap: { [index: string]: any }): void; clearState(): void; run(): void; } diff --git a/packages/types/src/assets.ts b/packages/types/src/assets.ts index 37f563429..65129532a 100644 --- a/packages/types/src/assets.ts +++ b/packages/types/src/assets.ts @@ -130,6 +130,14 @@ export interface Package { * @todo 需推进提案 @度城 */ async?: boolean; + /** + * 标识当前 package 从其他 package 的导出方式 + */ + exportMode?: 'functionCall'; + /** + * 标识当前 package 是从 window 上的哪个属性导出来的 + */ + exportSourceLibrary?: any; /** * 组件描述导出名字,可以通过 window[exportName] 获取到组件描述的 Object 内容; */ diff --git a/packages/utils/src/asset.ts b/packages/utils/src/asset.ts index 1548e2400..23254fc74 100644 --- a/packages/utils/src/asset.ts +++ b/packages/utils/src/asset.ts @@ -268,17 +268,24 @@ export class AssetLoader { async loadAsyncLibrary(asyncLibraryMap: Record) { const promiseList: any[] = []; const libraryKeyList: any[] = []; + const pkgs: any[] = []; for (const key in asyncLibraryMap) { // 需要异步加载 if (asyncLibraryMap[key].async) { promiseList.push(window[asyncLibraryMap[key].library]); libraryKeyList.push(asyncLibraryMap[key].library); + pkgs.push(asyncLibraryMap[key]); } } await Promise.all(promiseList).then((mods) => { if (mods.length > 0) { mods.map((item, index) => { - window[libraryKeyList[index]] = item; + const { exportMode, exportSourceLibrary, library } = pkgs[index]; + window[libraryKeyList[index]] = + exportMode === 'functionCall' && + (exportSourceLibrary == null || exportSourceLibrary === library) + ? item() + : item; return item; }); }