From 012e5205bced83141db252e224da4a12460d9f9e Mon Sep 17 00:00:00 2001 From: 2heal1 Date: Wed, 19 Aug 2026 16:28:51 +0800 Subject: [PATCH] fix(runtime-core): cache synchronous shared factories --- .changeset/tidy-pandas-share.md | 5 ++++ .../runtime-core/__tests__/instance.spec.ts | 25 +++++++++++++++++++ packages/runtime-core/src/shared/index.ts | 1 + 3 files changed, 31 insertions(+) create mode 100644 .changeset/tidy-pandas-share.md diff --git a/.changeset/tidy-pandas-share.md b/.changeset/tidy-pandas-share.md new file mode 100644 index 00000000000..f2e53faad53 --- /dev/null +++ b/.changeset/tidy-pandas-share.md @@ -0,0 +1,5 @@ +--- +"@module-federation/runtime-core": patch +--- + +Cache factories returned by synchronous shared getters for subsequent loads. diff --git a/packages/runtime-core/__tests__/instance.spec.ts b/packages/runtime-core/__tests__/instance.spec.ts index 9ccaf33bf56..34f4bd3aa7d 100644 --- a/packages/runtime-core/__tests__/instance.spec.ts +++ b/packages/runtime-core/__tests__/instance.spec.ts @@ -11,6 +11,31 @@ describe('ModuleFederation', () => { }); }); + it('caches shared factories returned by synchronous getters', () => { + const factory = () => ({ value: 'shared' }); + const getShared = rs.fn(() => factory); + const federation = new ModuleFederation({ + name: '@federation/sync-shared-cache', + remotes: [], + shared: { + 'sync-shared': { + version: '1.0.0', + get: getShared, + }, + }, + }); + + const firstFactory = federation.loadShareSync('sync-shared'); + const secondFactory = federation.loadShareSync('sync-shared'); + + expect(firstFactory).toBe(factory); + expect(secondFactory).toBe(factory); + expect(getShared).toHaveBeenCalledTimes(1); + expect(federation.shareScopeMap.default['sync-shared']['1.0.0'].lib).toBe( + factory, + ); + }); + it('deduplicates concurrent remote module init', async () => { let beforeInitContainerCalls = 0; let initContainerCalls = 0; diff --git a/packages/runtime-core/src/shared/index.ts b/packages/runtime-core/src/shared/index.ts index 81a01847e41..3997c98f86a 100644 --- a/packages/runtime-core/src/shared/index.ts +++ b/packages/runtime-core/src/shared/index.ts @@ -698,6 +698,7 @@ export class SharedHandler { merge(targetShared, 'loaded', loaded); merge(targetShared, 'loading', loading); merge(targetShared, 'get', get); + merge(targetShared, 'lib', lib); }; scopes.forEach((sc) => { if (!this.shareScopeMap[sc]) {