Terminology
A shared vocabulary for working with Native Federation. The same terms show up across the Core builder, the runtime, the orchestrator, and every adapter — this page is the canonical definition of each one.
Actors
Host
The application that loads remotes. Also called the shell. A
host is a regular web application built the same way as any other — it
just reaches out at runtime to pull in code from separately deployed
remotes. From the framework's perspective this looks like ordinary
lazy loading; the difference is that the host doesn't know the remotes
at compile time. A host has its own
federation.config.js (without exposes) and
produces its own remoteEntry.json.
Remote
A separately built and deployed application that publishes one or more
EcmaScript modules for hosts (or other remotes) to consume. In
micro-frontend terms, a remote represents a subdomain within your
architecture — typically one remote per team or bounded context. Each
remote has its own name, its own
federation.config.js, and its own
remoteEntry.json. Names are npm-style:
'mfe1', '@org/mfe1',
'team/mfe1'.
Micro Frontend (MFE)
A remote, viewed through the lens of the micro-frontend architecture. The terms are used interchangeably in these docs: every micro frontend is a remote, and in practice every remote in a micro-frontend architecture is the MFE for a team's subdomain.
Runtime
The small browser library that boots federation on the host —
initializes federation (initFederation), fetches remote
manifests, resolves shared dependencies and exposes
loadRemoteModule. The default runtime is
@softarc/native-federation-runtime. See
Runtime.
Orchestrator
The next-generation browser runtime —
@softarc/native-federation-orchestrator — intended to
replace the default Runtime as the recommended way to load remotes on
the host. It speaks the same remoteEntry.json contract
but adds semver-range resolution for shared dependencies and
persistent caching of remoteEntry.json in
localStorage or sessionStorage. Works in
SPAs, plain HTML pages and server-rendered hosts; does not yet have
direct SSR support. See
Orchestrator.
Build Adapter
A thin shim that plugs a specific bundler (esbuild, Angular CLI, Vite,
Rspack, …) into the Core builder. Build adapters implement the
NFBuildAdapter contract (setup /
build / dispose) and let the Core stay
bundler-agnostic. See
Build Adapters and
Build Your Own Adapter.
Artifacts
remoteEntry.json
The public contract of a remote — one JSON file written alongside the bundled output by every Native Federation build. It tells hosts exactly what the remote publishes, which packages it expects to share, and where to find the corresponding files. Shape:
interface FederationInfo {
name: string;
exposes: ExposesInfo[];
shared: SharedInfo[];
chunks?: Record<string, string[]>;
buildNotificationsEndpoint?: string;
}
For the exact layout of each field see Build Artifacts.
Manifest
A JSON file on the host that maps every known remote name to
the URL of its remoteEntry.json. The host passes a
manifest to initFederation; the runtime fetches each
listed remote entry and wires everything together.
{
"mfe1": "http://localhost:3001/remoteEntry.json",
"checkout": "https://checkout.example.com/remoteEntry.json"
}
Manifests decouple configuration from code: to point a host at
different remotes per environment, you ship a different manifest — no
recompilation needed. A manifest can also be passed as an inline
object to initFederation.
Manifest vs. remoteEntry.json. The
manifest lives on the host and says
where the remotes are. A
remoteEntry.json lives on each remote and says
what that remote publishes. Hosts use the manifest to find
remotes; the runtime uses each remote's
remoteEntry.json to load its modules.
Import Map
A
W3C-standard browser feature
for redirecting bare module specifiers to URLs. Native Federation
produces an importmap.json alongside
remoteEntry.json in every build. At runtime, the
orchestrator merges the import maps of host and remotes, resolves
version conflicts, and injects the result into the page so imports
like @angular/core resolve to the single chosen file.
Chunk (@nf-internal/*)
A shared bit of code the bundler split off from one or more shared
externals. Chunks avoid duplicating code that multiple externals have
in common. In remoteEntry.json they appear under
synthetic package names like @nf-internal/chunk-IXOA6WTM.
With features.denseChunking enabled, they move to a
dedicated chunks object and each shared entry gets a
bundle property linking it to its chunk group.
Sharing concepts
Shared Dependency
A package that the host and one or more remotes agree to load
once and reuse at runtime instead of each bundling their own
copy. Shared dependencies are the whole point of federation: they
de-duplicate bytes on the wire and, for stateful libraries, guarantee
that every remote talks to the same instance. Declared in
federation.config.js under shared, usually
via the share or shareAll helpers.
External
A package or mapped path the app bundler is told not to
inline — it's left as a bare import 'some-lib' in the
emitted code and resolved at runtime by the import map. In Native
Federation terms, every shared dependency (and every shared mapped
path) ends up on the externals list that is passed to your bundler via
federationBuilder.externals. "Shared external" is the
same thing viewed from the federation side; "external" is the same
thing viewed from your app bundler's side.
Exposed Module
A module a remote makes available to hosts. Declared under
exposes in the remote's
federation.config.js:
exposes: {
'./Component': './projects/mfe1/src/bootstrap.ts',
}
The key (./Component) is the public specifier hosts use;
the value is the path to the source file. Each exposed module is built
into its own ESM bundle and listed in
remoteEntry.json under exposes. A host loads
it via:
await loadRemoteModule({ remoteName: 'mfe1', exposedModule: './Component' });
Secondary Entry Point
A subpath of an npm package that is importable on its own — for
example @angular/core/rxjs-interop or
rxjs/operators. The share helper discovers
secondaries by reading the package's exports field (or
falling back to directory scanning) and, by default, emits a separate
shared bundle for each one. Controlled per-package with
includeSecondaries.
Shared Mapping
A tsconfig.json path mapping that Native Federation
treats as a shared library. Monorepo-internal libraries
(libs/shared-lib, @org/utils) are usually
consumed through tsconfig paths; the Core picks them up
automatically and shares them like any other external. Drop unwanted
ones with skip.
Singleton
A shared-dependency flag that says "only one instance of this package
may ever be loaded at runtime". Required for libraries with internal
state — Angular, React, zone.js, state stores. When two
remotes disagree on the version of a singleton, the orchestrator picks
one winner; without singleton: true, each remote is free
to run its own copy.
strictVersion
A flag that turns a version mismatch from a warning into a runtime
error. With strictVersion: false the orchestrator falls
back to a compatible version; with strictVersion: true it
throws. Use it when you'd rather fail fast than discover a subtle
incompatibility in production.
requiredVersion
The semver range a consumer expects of a shared dependency — written
into remoteEntry.json so the orchestrator can pick a
version that satisfies every remote. Set it to 'auto' to
have the helper read the actual version from the closest
package.json (the recommended default).
Share Scope
A named bucket of shared dependencies. Two remotes share a package only if they use the same share scope (and the same package name). Most apps never set one; it's useful when a single page hosts multiple independently versioned federation graphs that must not cross-contaminate.
Version Mismatch
What happens when two remotes declare different versions of the same
shared dependency. The orchestrator resolves the conflict using semver
and the flags above: it may fall back to a compatible version, pick
the higher version (for singletons), or throw
(strictVersion).
Configuration
federation.config.js
The single configuration file every host and every remote owns.
Describes name, exposes,
shared, skip, feature flags, and more.
Loaded by the Core at build time via
withNativeFederation. See
federation.config.js
for the complete reference.
withNativeFederation
The helper you wrap your config in. Applies defaults, prepares the
skip list, resolves tsconfig mapped paths, and returns a
NormalizedFederationConfig the builder consumes.
Skip list
An array of strings, regular expressions, or predicates that opts
specific packages out of sharing. The list you provide is merged with
DEFAULT_SKIP_LIST — which already excludes Native
Federation's own packages, es-module-shims,
tslib/ and everything under @types/.
Skip ≠ exclude. A skipped package is still bundled into the remote — otherwise the remote couldn't run standalone. Skip only prevents the package from being extracted into a shared bundle.
Feature Flag
A behavior toggle under features on the federation
config — currently ignoreUnusedDeps (opt-out, default
true), mappingVersion (opt-out, default
true) and denseChunking (opt-in, default
false). See
Feature Flags.
Build & runtime
federationBuilder
The high-level build-time API. Exposes init,
build, close plus accessors for
externals, config and
federationInfo. Wraps the lower-level
buildForFederation, rebuildForFederation,
and cache primitives. See
Build Process.
Federation Cache
The content-addressed cache for bundled shared externals. Lives under
node_modules/.cache/native-federation/<projectName>
and keys entries by a SHA-256 checksum of the package names and
versions in each bundle. On a cache hit, the build adapter is never
invoked. See Caching.
Build mode
Per-shared-entry setting that controls how the Core groups packages
for the adapter: 'default' (all default externals in one
pass), 'separate' (one pass per entry),
'package' (one pass per package, including its
secondaries — required for per-package chunks).
loadRemoteModule
The runtime function hosts call to load an exposed module from a remote:
const mod = await loadRemoteModule({
remoteName: 'mfe1',
exposedModule: './Component',
});
Accepts an optional type parameter for typed remotes.
initFederation
The runtime bootstrap call. On the host, it takes a manifest (inline object or URL) and sets up the import map from every listed remote. On a remote it is usually called parameter-less during its own startup, so the remote can, in turn, act as a host for other remotes.