mf-manifest.json format, first-class TypeScript type hints, a Chrome DevTools extension, runtime plugins, and Node SSR support — and it was announced in April 2024, with stable status reported by InfoQ in April 2026. If you need a batteries-included plugin with deep Webpack and Rspack integration, a large ecosystem, and automatic transitive sharing, Module Federation is a legitimate choice. knitkit makes a different bet: radical simplicity on platform primitives.
Feature comparison
Size figures above are pinned to named versions measured with the delta method. Re-verify these numbers against the actual release versions before publishing or citing them publicly.
Where MF’s worst bugs live — and why ours can’t
The ecosystem’s most common bug class is the dreaded “Invalid hook call… more than one copy of React” error. It originates from implicit and transitive sharing: Module Federation can silently share packages you didn’t explicitly declare, and the version negotiation that determines which copy wins happens deep inside the bundler’s share-scope mechanism — invisible to you unless you know exactly where to look. knitkit’s shared surface is explicit and inspectable. You declare every package you want shared inknit.config.json. The CLI emits each one as a standalone ESM asset from your installed version. The host and every remote import it through a single import-map entry — and the browser’s module cache guarantees exactly one instance per URL. There is no share scope to misconfigure, no transitive sharing to accidentally trigger, and nothing is shared silently.
Open DevTools on any knitkit host and you can read the import map: one entry per package, one URL, one winner. This is debuggability by construction — the bug class is eliminated by the architecture, not papered over by configuration.
What knitkit deliberately gives up
knitkit is not trying to be Module Federation with a different logo. These are intentional trade-offs, not gaps to fill:- Automatic transitive sharing. You must declare the shared surface explicitly. This is precisely where Module Federation’s silent failures originate — knitkit treats mandatory explicitness as a feature, not a regression.
- Extracting a dep from an already-inlined bundle. Externalization is mandatory before
knitkit buildruns. If your bundler has already inlinedreactinto a chunk, you need one line of bundler config to externalize it first. This is typically a singleexternalentry. - Cross-remote HMR. Live module replacement across remote and host requires bundler coupling, which knitkit deliberately refuses. Each remote uses its own dev server’s HMR. Use the
@knitkit/overrideslocal-override widget to point any single remote atlocalhostwhile the rest of the system runs from deployed URLs.
When to use which
Use Module Federation 2.0 if you:- Need deep, ergonomic Webpack or Rspack plugin integration.
- Want automatic transitive sharing and are comfortable owning the configuration required to make it reliable.
- Need a large ecosystem of community plugins and prior art.
- Require features like the Chrome DevTools extension or the MF runtime plugin API.
- Want a small, standards-native primitive you can read and fully understand in an afternoon.
- Need identical, predictable behavior across browser, Node SSR, and the edge with the same manifest.
- Value a shared surface you can see and verify — no hidden share-scope resolution.
- Care about shipping less JavaScript: ~3.5 KB brotli vs ~27 KB brotli for the federation runtime alone.