name | Runtime/global collision | Use one stable unique name per container |
filename | Missing, unsafe, or hashed remote entry | Use a stable relative .js filename (no [contenthash]) |
library + remoteType | Producer/consumer format mismatch | Align global, module, CommonJS, or script contracts |
remotes | Bad URL, alias, scope, or offline startup | Prefer HTTPS manifest URLs; test failure recovery |
dataPrefetch / prefetch remotes | Prefetch/preload misconfig can break load order | Use prefetch after lazyLoadComponentPlugin with <remote>/<expose> ids; test preloadRemote load order. Not checked automatically (no normalize field, low confidence). |
shareScope | Isolated pools cannot reuse packages | Align top-level, remote, and item scopes |
exposes | Bad public key or missing source | Use ./Name keys and exact paths |
shared | Duplicate frameworks or unsatisfied versions | Align singleton, versions, scope, strictness, and fallback |
shared[].packagePath | Wrong path redirects version/singleton resolution | Point at an existing package directory or entry file |
shared[].layer / issuerLayer | Webpack layer sharing isolates share pools; host/remote mismatch duplicates modules | Align layer and issuerLayer across webpack-family projects that declare them. Not checked automatically (SDK confirms the keys; public shared docs and Vite omit them, low confidence). |
runtimePlugins | Missing plugin or unsafe recovery | Resolve every plugin and test each hook path |
getPublicPath | Dynamic-code and asset-base risk | Keep the stringified function small, static, and reviewed |
implementation | Runtime/plugin version skew | Resolve a compatible runtime-tools implementation |
dts | Missing/stale consumer contracts | Generate types in CI and choose an explicit abort policy |
dev | Reload/type-HMR behavior differs from build | Document disabled reload features and test remote HMR |
manifest | Missing runtime metadata or incomplete asset data | Emit it for releases; keep producer asset analysis enabled |
shareStrategy | Startup cost vs late remote failure | Pick version-first or loaded-first intentionally |
Host/remote shareStrategy mix | Inconsistent shared negotiation across the graph | Align federation-wide, or document intentional exceptions |
| Circular remotes | Nested init / type extraction can deadlock | Keep the remotes graph a DAG |
| Remote alias prefixes | Runtime rejects alias that prefixes another name | Rename aliases so none is a prefix |
| Nested producer DTS | Missing extracted remote types in producer archive | Enable dts.generateTypes.extractRemoteTypes (config/nested-producer-dts-extract) |
dts.generateTypes.outputDir | Type zip path drifts from nested filename | Align outputDir with the remote-entry directory layout |
dts.generateTypes.compilerInstance | Default tsc can make DTS generation the bottleneck | Set "tsgo" when type generation is slow |
Direct .js remotes + DTS | No type URL without manifests/remoteTypeUrls | Prefer manifests or set remoteTypeUrls |
Non-string output.publicPath | Manifest generation is skipped upstream | Use a string/auto publicPath when manifests are required |
| Localhost remotes in CI | Deployed builds cannot reach loopback remotes | Use deployed URLs for CI/production mfdoctor runs |
experiments.asyncStartup | Entry exports become async; ignored on old Rspack | Requires Rspack > 1.7.4; await Promise consumers |
externalRuntime pair | Hard load-order dependency | One pure provider; externalize only downstream browser remotes |
| snapshot/remote/shared removal | Tree-shaken capability still used | Never disable a configured capability |
| shared tree shaking | Incomplete deployment union | Publish the merged secondary artifact and update snapshots |
injectTreeShakingUsedExports | Conflicts with server-calc | Disable it for deployment-calculated exports |
treeShakingDir | No known fallback artifact location | Configure and publish the directory |
| shared tree-shaking plugins | Secondary build misses original transforms | Package only the needed build plugins and pin versions |