@module-federation/bridge-vue3 0.0.0-next-20241106033302 → 0.0.0-next-20241106104434

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/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "url": "https://github.com/module-federation/core",
8
8
  "directory": "packages/vue3-bridge"
9
9
  },
10
- "version": "0.0.0-next-20241106033302",
10
+ "version": "0.0.0-next-20241106104434",
11
11
  "publishConfig": {
12
12
  "access": "public"
13
13
  },
@@ -29,11 +29,12 @@
29
29
  ],
30
30
  "peerDependencies": {
31
31
  "vue": "=3",
32
- "vue-router": "=3"
32
+ "vue-router": "=3",
33
+ "@module-federation/runtime": "0.0.0-next-20241106104434"
33
34
  },
34
35
  "dependencies": {
35
- "@module-federation/bridge-shared": "0.0.0-next-20241106033302",
36
- "@module-federation/sdk": "0.0.0-next-20241106033302"
36
+ "@module-federation/bridge-shared": "0.0.0-next-20241106104434",
37
+ "@module-federation/sdk": "0.0.0-next-20241106104434"
37
38
  },
38
39
  "devDependencies": {
39
40
  "@vitejs/plugin-vue": "^5.0.4",
package/src/create.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { defineAsyncComponent, h } from 'vue';
2
+ import { useRoute } from 'vue-router';
2
3
  import RemoteApp from './remoteApp.jsx';
3
4
  import { LoggerInstance } from './utils.js';
4
- import { useRoute } from 'vue-router';
5
5
 
6
6
  declare const __APP_VERSION__: string;
7
7
 
package/src/provider.ts CHANGED
@@ -5,23 +5,51 @@ import { LoggerInstance } from './utils';
5
5
 
6
6
  declare const __APP_VERSION__: string;
7
7
 
8
+ type DestroyParams = {
9
+ dom: HTMLElement;
10
+ };
11
+
12
+ type BridgeHooks = {
13
+ beforeBridgeRender?: (params: RenderFnParams) => any;
14
+ afterBridgeRender?: (params: RenderFnParams) => any;
15
+ beforeBridgeDestroy?: (params: DestroyParams) => any;
16
+ afterBridgeDestroy?: (params: DestroyParams) => any;
17
+ };
18
+
8
19
  export function createBridgeComponent(bridgeInfo: any) {
9
20
  const rootMap = new Map();
10
- return () => {
21
+ return (params: { hooks?: BridgeHooks }) => {
11
22
  return {
12
23
  __APP_VERSION__,
13
24
  render(info: RenderFnParams) {
14
25
  LoggerInstance.log(`createBridgeComponent render Info`, info);
15
26
  const app = Vue.createApp(bridgeInfo.rootComponent);
16
27
  rootMap.set(info.dom, app);
28
+ // bridgeInfo?.renderLifecycle?.(info);
29
+ const beforeBridgeRender =
30
+ (bridgeInfo?.hooks && bridgeInfo?.hooks.beforeBridgeRender) ||
31
+ params?.hooks?.beforeBridgeRender;
32
+
33
+ // you can return a props object through beforeBridgeRender to pass additional props parameters
34
+ const beforeBridgeRenderRes =
35
+ beforeBridgeRender && beforeBridgeRender(info);
36
+ const extraProps =
37
+ beforeBridgeRenderRes &&
38
+ typeof beforeBridgeRenderRes === 'object' &&
39
+ beforeBridgeRenderRes?.extraProps
40
+ ? beforeBridgeRenderRes?.extraProps
41
+ : {};
42
+
17
43
  const appOptions = bridgeInfo.appOptions({
18
44
  basename: info.basename,
19
45
  memoryRoute: info.memoryRoute,
46
+ ...extraProps,
20
47
  });
21
48
 
22
49
  const history = info.memoryRoute
23
50
  ? VueRouter.createMemoryHistory(info.basename)
24
51
  : VueRouter.createWebHistory(info.basename);
52
+
25
53
  const router = VueRouter.createRouter({
26
54
  ...appOptions.router.options,
27
55
  history,
@@ -42,11 +70,26 @@ export function createBridgeComponent(bridgeInfo: any) {
42
70
  app.use(router);
43
71
  app.mount(info.dom);
44
72
  }
73
+
74
+ const afterBridgeRender =
75
+ (bridgeInfo?.hooks && bridgeInfo?.hooks.afterBridgeDestroy) ||
76
+ params?.hooks?.afterBridgeRender;
77
+ afterBridgeRender && afterBridgeRender(info);
45
78
  },
46
79
  destroy(info: { dom: HTMLElement }) {
47
80
  LoggerInstance.log(`createBridgeComponent destroy Info`, info);
48
81
  const root = rootMap.get(info?.dom);
82
+
83
+ const beforeBridgeDestroy =
84
+ (bridgeInfo?.hooks && bridgeInfo?.hooks.beforeBridgeDestroy) ||
85
+ params?.hooks?.beforeBridgeDestroy;
86
+ beforeBridgeDestroy && beforeBridgeDestroy(info);
87
+
49
88
  root?.unmount();
89
+ const afterBridgeDestroy =
90
+ (bridgeInfo?.hooks && bridgeInfo?.hooks.afterBridgeDestroy) ||
91
+ params?.hooks?.afterBridgeDestroy;
92
+ afterBridgeDestroy && afterBridgeDestroy(info);
50
93
  },
51
94
  };
52
95
  };
package/src/remoteApp.tsx CHANGED
@@ -1,7 +1,8 @@
1
1
  import { ref, onMounted, onBeforeUnmount, watch, defineComponent } from 'vue';
2
+ import { dispatchPopstateEnv } from '@module-federation/bridge-shared';
2
3
  import { useRoute } from 'vue-router';
3
4
  import { LoggerInstance } from './utils';
4
- import { dispatchPopstateEnv } from '@module-federation/bridge-shared';
5
+ import { getInstance } from '@module-federation/runtime';
5
6
 
6
7
  export default defineComponent({
7
8
  name: 'RemoteApp',
@@ -18,6 +19,7 @@ export default defineComponent({
18
19
  const route = useRoute();
19
20
 
20
21
  const renderComponent = () => {
22
+ const host = getInstance();
21
23
  const providerReturn = props.providerInfo?.();
22
24
  providerInfoRef.value = providerReturn;
23
25
  const renderProps = {
@@ -30,6 +32,12 @@ export default defineComponent({
30
32
  `createRemoteComponent LazyComponent render >>>`,
31
33
  renderProps,
32
34
  );
35
+
36
+ if (host?.bridgeHook && host?.bridgeHook?.lifecycle?.beforeBridgeRender) {
37
+ host?.bridgeHook?.lifecycle?.beforeBridgeRender.emit({
38
+ ...renderProps,
39
+ });
40
+ }
33
41
  providerReturn.render(renderProps);
34
42
  };
35
43
 
@@ -57,11 +65,21 @@ export default defineComponent({
57
65
  });
58
66
 
59
67
  onBeforeUnmount(() => {
68
+ const host = getInstance();
60
69
  LoggerInstance.log(`createRemoteComponent LazyComponent destroy >>>`, {
61
70
  ...props,
62
71
  });
63
72
  watchStopHandle();
73
+
64
74
  (providerInfoRef.value as any)?.destroy({ dom: rootRef.value });
75
+ if (host?.bridgeHook && host?.bridgeHook?.lifecycle?.afterBridgeDestroy) {
76
+ host?.bridgeHook?.lifecycle?.afterBridgeDestroy.emit({
77
+ name: props.moduleName,
78
+ dom: rootRef.value,
79
+ basename: props.basename,
80
+ memoryRoute: props.memoryRoute,
81
+ });
82
+ }
65
83
  });
66
84
 
67
85
  return () => <div ref={rootRef}></div>;