From c0b15cbb27b787c19fd6b18463cfc0d6a1a35caf Mon Sep 17 00:00:00 2001 From: Jonathan Gelin Date: Sat, 16 Mar 2024 08:00:46 +0100 Subject: [PATCH] feat(nf): Use es module shims fully instead of global cache not in sync --- .../src/lib/init-federation.ts | 6 +-- .../src/lib/load-remote-module.ts | 54 +++++++------------ .../src/lib/model/global-cache.ts | 4 -- .../src/lib/model/remotes.ts | 19 ------- .../src/lib/utils/add-import-map.ts | 10 ---- .../tsconfig.lib.json | 2 +- .../tsconfig.lib.prod.json | 3 +- .../tsconfig.spec.json | 2 +- 8 files changed, 25 insertions(+), 75 deletions(-) delete mode 100644 libs/native-federation-runtime/src/lib/utils/add-import-map.ts diff --git a/libs/native-federation-runtime/src/lib/init-federation.ts b/libs/native-federation-runtime/src/lib/init-federation.ts index ecd3ba0c..05a4afc1 100644 --- a/libs/native-federation-runtime/src/lib/init-federation.ts +++ b/libs/native-federation-runtime/src/lib/init-federation.ts @@ -6,8 +6,6 @@ import { } from './model/import-map'; import { getExternalUrl, setExternalUrl } from './model/externals'; import { joinPaths, getDirectory } from './utils/path-utils'; -import { addRemote } from './model/remotes'; -import { appendImportMap } from './utils/add-import-map'; import { FederationInfo } from './model/federation-info'; export async function initFederation( @@ -22,7 +20,7 @@ export async function initFederation( const remotesImportMap = await processRemoteInfos(remotes); const importMap = mergeImportMaps(hostImportMap, remotesImportMap); - appendImportMap(importMap); + importShim.addImportMap(importMap); return importMap; } @@ -66,8 +64,6 @@ export async function processRemoteInfo( } const importMap = createRemoteImportMap(remoteInfo, remoteName, baseUrl); - addRemote(remoteName, { ...remoteInfo, baseUrl }); - return importMap; } diff --git a/libs/native-federation-runtime/src/lib/load-remote-module.ts b/libs/native-federation-runtime/src/lib/load-remote-module.ts index 333eecaf..e3323700 100644 --- a/libs/native-federation-runtime/src/lib/load-remote-module.ts +++ b/libs/native-federation-runtime/src/lib/load-remote-module.ts @@ -1,14 +1,6 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { appendImportMap } from './utils/add-import-map'; import { processRemoteInfo } from './init-federation'; -import { - getRemote, - getRemoteNameByBaseUrl, - isRemoteInitialized, -} from './model/remotes'; -import { getDirectory, joinPaths } from './utils/path-utils'; - -declare function importShim(url: string): T; +import { getDirectory } from './utils/path-utils'; +import { getRemoteNameByBaseUrl, isRemoteInitialized } from './model/remotes'; export type LoadRemoteModuleOptions = { remoteEntry?: string; @@ -16,39 +8,33 @@ export type LoadRemoteModuleOptions = { exposedModule: string; }; -export async function loadRemoteModule( - options: LoadRemoteModuleOptions -): Promise; -export async function loadRemoteModule( +export async function loadRemoteModule< + Default = any, + Exports extends object = any +>(options: LoadRemoteModuleOptions): Promise<{ default: Default } & Exports>; +export async function loadRemoteModule< + Default = any, + Exports extends object = any +>( remoteName: string, exposedModule: string -): Promise; -export async function loadRemoteModule( +): Promise<{ default: Default } & Exports>; +export async function loadRemoteModule< + Default = any, + Exports extends object = any +>( optionsOrRemoteName: LoadRemoteModuleOptions | string, exposedModule?: string -): Promise { +): Promise<{ default: Default } & Exports> { const options = normalizeOptions(optionsOrRemoteName, exposedModule); await ensureRemoteInitialized(options); const remoteName = getRemoteNameByOptions(options); - const remote = getRemote(remoteName); - - if (!remote) { - throw new Error('unknown remote ' + remoteName); - } - - const exposed = remote.exposes.find((e) => e.key === options.exposedModule); - - if (!exposed) { - throw new Error( - `Unknown exposed module ${options.exposedModule} in remote ${remoteName}` - ); - } - - const url = joinPaths(remote.baseUrl, exposed.outFileName); - const module = await importShim(url); + const module = await importShim( + `${remoteName}/${options.exposedModule}` + ); return module; } @@ -80,7 +66,7 @@ async function ensureRemoteInitialized( !isRemoteInitialized(getDirectory(options.remoteEntry)) ) { const importMap = await processRemoteInfo(options.remoteEntry); - appendImportMap(importMap); + importShim.addImportMap(importMap); } } diff --git a/libs/native-federation-runtime/src/lib/model/global-cache.ts b/libs/native-federation-runtime/src/lib/model/global-cache.ts index 99492edb..b8822adb 100644 --- a/libs/native-federation-runtime/src/lib/model/global-cache.ts +++ b/libs/native-federation-runtime/src/lib/model/global-cache.ts @@ -1,10 +1,7 @@ -import { Remote } from './remotes'; - export const nfNamespace = '__NATIVE_FEDERATION__'; export type NfCache = { externals: Map; - remoteNamesToRemote: Map; baseUrlToRemoteNames: Map; }; @@ -16,7 +13,6 @@ const global = globalThis as unknown as Global; global[nfNamespace] ??= { externals: new Map(), - remoteNamesToRemote: new Map(), baseUrlToRemoteNames: new Map(), }; diff --git a/libs/native-federation-runtime/src/lib/model/remotes.ts b/libs/native-federation-runtime/src/lib/model/remotes.ts index 222813cb..fe7f14fc 100644 --- a/libs/native-federation-runtime/src/lib/model/remotes.ts +++ b/libs/native-federation-runtime/src/lib/model/remotes.ts @@ -1,18 +1,7 @@ -import { FederationInfo } from './federation-info'; import { globalCache } from './global-cache'; -export type Remote = FederationInfo & { - baseUrl: string; -}; - -const remoteNamesToRemote = globalCache.remoteNamesToRemote; const baseUrlToRemoteNames = globalCache.baseUrlToRemoteNames; -export function addRemote(remoteName: string, remote: Remote): void { - remoteNamesToRemote.set(remoteName, remote); - baseUrlToRemoteNames.set(remote.baseUrl, remoteName); -} - export function getRemoteNameByBaseUrl(baseUrl: string): string | undefined { return baseUrlToRemoteNames.get(baseUrl); } @@ -20,11 +9,3 @@ export function getRemoteNameByBaseUrl(baseUrl: string): string | undefined { export function isRemoteInitialized(baseUrl: string): boolean { return baseUrlToRemoteNames.has(baseUrl); } - -export function getRemote(remoteName: string): Remote | undefined { - return remoteNamesToRemote.get(remoteName); -} - -export function hasRemote(remoteName: string): boolean { - return remoteNamesToRemote.has(remoteName); -} diff --git a/libs/native-federation-runtime/src/lib/utils/add-import-map.ts b/libs/native-federation-runtime/src/lib/utils/add-import-map.ts deleted file mode 100644 index 8ffee4cb..00000000 --- a/libs/native-federation-runtime/src/lib/utils/add-import-map.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ImportMap } from '../model/import-map'; - -export function appendImportMap(importMap: ImportMap) { - document.head.appendChild( - Object.assign(document.createElement('script'), { - type: 'importmap-shim', - innerHTML: JSON.stringify(importMap), - }) - ); -} diff --git a/libs/native-federation-runtime/tsconfig.lib.json b/libs/native-federation-runtime/tsconfig.lib.json index 7d9e0ae2..6eb87222 100644 --- a/libs/native-federation-runtime/tsconfig.lib.json +++ b/libs/native-federation-runtime/tsconfig.lib.json @@ -5,7 +5,7 @@ "declaration": true, "declarationMap": true, "inlineSources": true, - "types": [], + "types": ["es-module-shims"], "target": "ES2022", "useDefineForClassFields": false }, diff --git a/libs/native-federation-runtime/tsconfig.lib.prod.json b/libs/native-federation-runtime/tsconfig.lib.prod.json index 1f041c94..c6326abe 100644 --- a/libs/native-federation-runtime/tsconfig.lib.prod.json +++ b/libs/native-federation-runtime/tsconfig.lib.prod.json @@ -3,7 +3,8 @@ "compilerOptions": { "declarationMap": false, "target": "ES2022", - "useDefineForClassFields": false + "useDefineForClassFields": false, + "types": ["es-module-shims"] }, "angularCompilerOptions": { "compilationMode": "partial" diff --git a/libs/native-federation-runtime/tsconfig.spec.json b/libs/native-federation-runtime/tsconfig.spec.json index c5db0277..7e15edd5 100644 --- a/libs/native-federation-runtime/tsconfig.spec.json +++ b/libs/native-federation-runtime/tsconfig.spec.json @@ -3,7 +3,7 @@ "compilerOptions": { "outDir": "../../dist/out-tsc", "module": "commonjs", - "types": ["jest", "node"] + "types": ["jest", "node", "es-module-shims"] }, "files": ["src/test-setup.ts"], "include": ["jest.config.ts", "**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"]